# 1 背景提出
    某项目对中断延迟有很高的要求,客户的构架为:PPC+ Vxworks,延迟时间大概:10us.(因硬件设计原因, 还可以更小)。我们在Linu系统下测试中断延迟大概几百us, 而且这是在CPU很空闲情况下的测试结果。Linux非实时性操作系统,延迟参数不可预估。所以,想采用裸跑+Linux的方案。

# 2 开发平台
    硬件平台:ZYNQ7020、ZYNQ Ultascale + MPSOC XCZU19EGFFVC1760-2-I
    软件版本:Vivado 2019.1 SDK Petalinux 2019.1

# 4 双核裸跑
    0.新建FSBL.
    1.新建app工程0,    选择cpu_0,修改应用程序,见源码。

int i;
    init_platform();

while(1){
        for(i = 0; i < 0xffffff; i++);
        print("Hello World run at cpu 0! \n\r");
    }

cleanup_platform();

2.新建app工程1,选择cpu_1,修改应用程序,见源码。

int i;
    init_platform();

while(1){
        for(i = 0; i < 0xffffff; i++);
        print("Hello World run at cpu 1! \n\r");
    }

cleanup_platform();

3.选择app工程1的BSP包,打开Board Support Package Settings, dirvers->ps_cortex9_1->extra_compiler_flag添加:-DUSE_AMP=1
    4.修改cpu0、cpu1的app工程连脚本文件:lscript.ld的DDR配置
                                base address                            size
        CPU0:        ps_ddr_0    0x00100000                            0x1FE00000
        CPU1:        ps_ddr_0    0x20100000                            0x20000000
    5.打开FSBL->src->src->main.c,添加定义:
        #define sev() __asm__("sev")
        #define CPU1STARTADR      0xFFFFFFF0
        #define CPU1STARTMEM     0x20100000 //该参数为CPU1应用程序的起始地址
        定义函数:
        void StartCpu1(void)
        {
            #if 1
            Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
            dmb(); //waits until write has finished
            sev();
            #endif
        }
    6.在HandoffAddress = LoadBootImage();函数后添加自定义函数
        //kuens
        StartCpu1();
    7.制作BOOT.BIN,烧写启动
    8. 终端输出信息

Hello World run at cpu 1!
        Hello World run at cpu 0!
        Hello World run at cpu 1!
        Hello World run at cpu 0!
        Hello World run at cpu 1!
        Hello World run at cpu 0!
        Hello World run at cpu 0!
        Hello World run at cpu 1!

注1:为验证启动双核应用程序的正确性,可在SDK中分别新建CPU0、CPU1的应用程序,在SDK中分别Debug到相应的CPU上运行起来,如运行成功,再进行添加引导CPU1、程序固化等工作。

注2:在ZYNQ Ultrascale下不需要修改启动代码,只需要修改应用程序脚本中的DDR参数,SDK中直接制作BOOT.BIN启动文件即可。

# 5 Baremetal +Linux

## 5.1 ZYNQ 平台
    0.新建FSBL.
    1.新建app工程1,选择cpu_1,修改应用程序,见源码,本例程为: LED MIO 0闪烁。

int main()
{
    int i,Status;
    XGpioPs_Config *ConfigPtr;
    Output_Pin = 0;

init_platform();
    ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
    Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
                        ConfigPtr->BaseAddr);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }
    XGpioPs_SetDirectionPin(&Gpio, Output_Pin, 1);
    XGpioPs_SetOutputEnablePin(&Gpio, Output_Pin, 1);

/* Set the GPIO output to be low. */

while(1){
        for(i = 0; i < 0xffffff; i++);
        XGpioPs_WritePin(&Gpio, Output_Pin, 0x1);

for(i = 0; i < 0xffffff; i++);
        XGpioPs_WritePin(&Gpio, Output_Pin, 0x0);
    }

cleanup_platform();
    return 0;
}

3.选择app工程1的BSP包,打开Board Support Package Settings, dirvers->ps_cortex9_1->extra_compiler_flag添加:-DUSE_AMP=1


    4.修改 cpu1的app工程连脚本文件:lscript.ld的DDR配置
                                base address            size
        CPU0:        ps_ddr_0    0x00100000            0x1FE00000     //Linux
        CPU1:        ps_ddr_1    0x20100000            0x20000000    //Baremetal

CPU0:

CPU1:

5.打开FSBL->src->main.c,添加定义:


        #define sev() __asm__("sev")
        #define CPU1STARTADR      0xFFFFFFF0
        #define CPU1STARTMEM     0x20100000    //cpu_1应用程序的链接地址
        定义函数:
        void StartCpu1(void)
        {
            #if 1
            Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
            dmb(); //waits until write has finished
            sev();
            #endif
        }
    6. 在main函数中,找到的HandoffAddress = LoadBootImage(),该函数后添加自定义函数
        //kuens
        StartCpu1();
    7.修改设备树:
        在bootargs 中添加 maxcpus=1 mem=512M@0x0;    //根据实际情况修改
        例如:
            chosen {
                bootargs = "console=ttyPS0,115200 maxcpus=1 mem=384M@0x0 clk_ingore_unused earlyprintk";
                stdout-path = "serial0:115200n8";
            };
        在设备树重写memory节点:
        memory {
            device_type = "memory";
            //reg = <0x0 0x40000000>;
            reg = <0x0 0x20000000>;
        };

8.使用petalinux命令制作BOOT.BIN(SD卡启动)
        petalinux-package --boot --fsbl ./images/linux/FSBL.elf --fpga --u-boot --add ./images/linux/world.elf --force
        (--add 的骚操作,一般人我不告诉他!)
    9.启动:
        在kernel启动前,CPU1运行正常。kernel启动后,CPU1停止运行。
       原因分析:FSBL、Uboot阶段,CPU1 运行正常,Kernel启动后由于gpiolib 对IO资源的统一管理,使得CPU1 不能获取相关硬件资源。(个人分析)
    10.登陆linux系统
        cd /sys/class/gpio906 //LED使用 MIO 0
        echo 906 > export
        运行正常

注:如平台是UltraScale+MPSoc平台,上述步骤有出入:

1.1  新建FSBL,无需修改源码

1.2  链接脚本,设备树,启动参数需要修改。

1.3  BOOT.BIN打包参考UG209.PDF(Page70)

kuens@ubtu:~/Desktop/zcu_106/vpx$ petalinux-package --boot --fsbl  --fpga --add ./images/linux/cpu1.elf --u-boot --force
INFO: File in BOOT BIN: "/home/kuens/Desktop/zcu_106/vpx/images/linux/zynqmp_fsbl.elf"
INFO: File in BOOT BIN: "/home/kuens/Desktop/zcu_106/vpx/images/linux/pmufw.elf"
INFO: File in BOOT BIN: "/home/kuens/Desktop/zcu_106/vpx/project-spec/hw-description/design_1_wrapper.bit"
INFO: File in BOOT BIN: "/home/kuens/Desktop/zcu_106/vpx/images/linux/bl31.elf"
INFO: File in BOOT BIN: "/home/kuens/Desktop/zcu_106/vpx/images/linux/u-boot.elf"
INFO: File in BOOT BIN: "/home/kuens/Desktop/zcu_106/vpx/images/linux/cpu1.elf"
INFO: Generating zynqmp binary package BOOT.BIN...

该命令打包不可行,参考本文可执行文件添加顺序,在SDK中手动制作BOOT.BIN.注意:Exception Level参数设置。与UG1209.PDF一致即可。

Ref:
        xapp1078-amp-linux-bare-metal(2018-11-20 17.04.24).pdf
        xapp1078-amp-linux-bare-metal.pdf

Zynq UltraScale MPSoC Embedded Design Tutorial (UG1209).pdf
QQ:810871522

ZYNQ UltraScale 双核裸跑 / 裸跑 + Linux相关推荐

  1. Xilinx Zynq UltraScale+ MPSoC VCU ROI Demo跑

    一.前言 ZU7EV系列MPSoC集成了硬件视频编解码IP VCU,可进行H264/H265视频编解码.Xilinx提供了VCU参考TRD,此外,还提供了一个VCU+DPU的参考设计:Zynq Ult ...

  2. 玩转Zynq连载29——[ex51] 制作裸跑程序的启动文件BOOT.bin

    特权同学玩转Zynq连载29--[ex51] 制作裸跑程序的启动文件BOOT.bin 1 概述 对于Zynq的裸跑程序加载,比linux的SD卡启动文件制作要简单得多. 只需要在FAT32格式化后的S ...

  3. TX2440 裸跑实验-跑马灯(ADS1.2编译) 入门

    TX2440 裸跑实验-跑马灯(ADS1.2编译) 入门 一.实验目的: 理解汇编的编程结构,有助于学习ARM汇编,为后续学习CPU的启动机制来了个入门级 二.实验环境: TX2440平台 三.实验工 ...

  4. zynq+linux固化程序,如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计

    原标题:如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计 简介 作者: Alex He (何晔), 赛灵思高级嵌入式应用工程师 这里的 UIO 即 Userspa ...

  5. Zynq UltraScale + MPSoC示例设计 - 在64位Linux上执行32位应用程序

    目录 官方说明连接:https://china.xilinx.com/support/answers/66636.html 描述 解决方案 官方说明连接:https://china.xilinx.co ...

  6. ZYNQ 7000 AMP模式双裸核运行 双方共享内存交互

    本文是 zynq 7000 AMP模式 双裸核CPU同时运行 的继续.本文主要是上文的基础上增加通过共享内存的方式,演示2个裸核的交互. 共享内存前先看看内存地址分布,这个图取自 ug585 4.1 ...

  7. AXI CDMA Linux user space example on Zynq UltraScale+ RFSoC

    参考链接:https://forums.xilinx.com/t5/Design-and-Debug-Techniques-Blog/AXI-CDMA-Linux-user-space-example ...

  8. 5、赛灵思-Zynq UltraScale+ MPSoC学习笔记:Petalinux 的设计流程及定制Linux系统

    5.赛灵思-Zynq UltraScale+ MPSoC学习笔记:Petalinux 的设计流程及定制Linux系统 声明:本文是学习赛灵思 Zynq UltraScale+ MPSoC 5EV过程中 ...

  9. Zynq UltraScale+ MPSoC 在linux系统运行R5 裸机程序 remoteproc - R5

    参考文章: ultrascale学习笔记之remoteproc启动R5 ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法 Zynq UltraScale+ MP ...

最新文章

  1. html表格立体效果,用HTML实现凸(凹)起的立体效果的表格
  2. StatQuest学习笔记23——RNA-seq简介
  3. 交叉验证(Cross Validation)方法思想简介
  4. mysql connector api_mysql8 参考手册-Connector/J使用X DevAPI进行连接压缩
  5. php能反序列化js的吗,javascript – 如何在node.js中反序列化PHP会话?
  6. 可恶的爬虫直接把生产 6 台机器爬挂了!
  7. python判断字符串里的字符_Python检测字符串中是否包含某字符集合中的字符
  8. 使用Julia进行图像处理--使用形态学运算进行图像调整
  9. CSS flex 布局 一些基本属性应用
  10. 微信使用OD逆向HOOK的一些心得
  11. 添加无线网连接服务器,单片机加WIFI模块,一直无法连接到TCP服务器麻烦大家看看...
  12. 网络协议之ONVIF搜索(Probe)
  13. Java实战---搜搜移动业务大厅
  14. diffuse、specular贴图的光照
  15. office办公软件 下载与安装教程
  16. 关于鸿蒙,你怎么看,三面美团Android岗
  17. 【JAVA案例】判断电话号码运营商
  18. html怎么引轮播图插件,原生js写一个无缝轮播图插件(支持vue)
  19. 设计模式八(享元模式)
  20. 毫秒转换天时分秒倒计时

热门文章

  1. 实战怎么用u盘重装系统
  2. Arcgis要素转栅格出现条带状
  3. wx小程序怎么自定义顶部背景色/文字/及文字颜色?
  4. android 键盘驱动程序下载,游戏键盘(GameKeyboard)
  5. mysql dbhelper 下载_DBHelper数据库肋手
  6. S5PV210开发 -- SPI 你知道多少?
  7. iOS 打包,及企业账号的使用
  8. 从Python角度理解mutex
  9. html+css不换行的解决办法
  10. pthread_create函数的详细讲解(包括向线程函数传递参数详解)