ZYNQ UltraScale 双核裸跑 / 裸跑 + Linux

2023-05-16

# 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZYNQ UltraScale 双核裸跑 / 裸跑 + Linux 的相关文章

  • CRC算法原理及C语言实现

    CRC算法原理及C语言实现 摘 要 本文从理论上推导出CRC算法实现原理 xff0c 给出三种分别适应不同计算机或微控制器硬件环境的C语言程序 读者更能根据本算法原理 xff0c 用不同的语言编写出独特风格更加实用的CRC计算程序 关键词
  • 动态分配的内存释放之后指针要置空

    define CRT SECURE NO WARNINGS include lt stdio h gt include lt stdlib h gt void main2 int num scanf 34 d 34 amp num prin
  • yolomark的相关操作

    1 文件组成 主要组成部分如图上 改yolo mark脚本中指令 主要是改左边的图片路径 2 使用步骤 进入cmd 输入yolo mark exe的文件路径 开始标注 image num 是对应图像的数 xff0c object id是对应
  • c++:3.7迭代器(1)

    迭代器 迭代器的基本概念 xff1a 1 迭代器是一种遍历容器元素的数据类型 C 43 43 迭代器Interator就是一个指向某种STL对象的泛型指针 通过该指针可以简单方便地遍历所有元素 2 迭代器 xff08 iterator xf
  • 51单片机定时器的查询和进入中断处理

    51单片机定时器可用两种方式处理 xff1a 查询和进入中断处理 1 查询方式 void Init T0 void 定时器初始化 TMOD 61 0x01 计时器模式 TH0 61 65535 65000 256 初装值为65536 650
  • DIY 无人机

    这是一个为满足个人兴趣的实践性项目 这个项目起源于我买的一架航模级的遥控电动直升机 xff0c 想要飞好它还是相当困难的 xff0c 需要敏捷的反应 轻柔的控制 xff0c 不幸的是我的反射弧很长 xff0c 所以练习起来格外困难 在对我的
  • 自定义的CircleProgressBar,支持自定义宽度,颜色等等。

    基于Anbase框架优化了了一个自定义的CircleProgressBar xff0c onDraw方法如下 64 Override protected void onDraw Canvas canvas super onDraw canv
  • 3D打印技术

    3D打印技术 什么是3D打印技术3D打印机的发展和运用领域3D打印过程 什么是3D打印技术 3D打印 xff08 3D printing xff09 是快速成型的一种技术 xff0c 自1986年美国科学家查克 赫尔开发第一台商业3D印刷机
  • 改变世界的17个方程式

    数学是一种美妙而优雅的东西 xff0c 它隐藏在我们生活的方方面面 xff0c 却又难以察觉 xff0c 而这需要一双慧眼才能看到 2013年 xff0c 科普作家伊恩 斯图尔特 Ian Stewart 就专门出了一本书 xff0c 名叫
  • ROS控制多台机器人实现多机协同

    ROS控制多台机器人的思路与实现 1 实现思路1 1 两台机器人跟随1 2 多台机器人编队 2 TF工具的使用2 1 什么是TF2 2 TF的构成2 3 向TF工具广播发送自己位置2 4 向TF工具收听获取坐标关系 3 通过turtlesi
  • 适合小白入门Arduino UNO的介绍

    编者按 xff1a 本文转载于酷耍平台 xff08 kooshua com xff09 Arduino是什么 xff1f Arduino是一款便捷灵活 方便上手的开源电子原型平台 包含硬件 xff08 各种型号的Arduino板 xff09
  • 记海康摄像头获取保存截图的一个方法(c#)

    记海康摄像头获取保存截图的一个方法 xff08 c xff09 先获取海康摄像头接口信息 引入模块 span class token keyword using span span class token namespace System
  • Linux设备树语法详解

    概念 Linux内核从3 x开始引入设备树的概念 xff0c 用于实现驱动代码与设备信息相分离 在设备树出现以前 xff0c 所有关于设备的具体信息都要写在驱动里 xff0c 一旦外围设备变化 xff0c 驱动代码就要重写 引入了设备树之后
  • Arduino智能越野小车AIR ROVER

    摘自 xff1a https goldelec com product detail 507 精心打造智能小车AIR ROVER xff0c 结实 稳固 大小适中 xff0c 越野爬坡能强 xff0c 采用麦克纳姆轮 xff0c 通过手机A
  • SSR的原理及好处

    什么是SSR SSR是Server Side Render简称 xff0c 叫服务端渲染 在客户端请求服务器的时候 xff0c 服务器到数据库中获取到相关的数据 xff0c 并且在服务器内部将Vue组件渲染成HTML xff0c 并且将数据
  • 区位码、国标码与机内码

    区位码 国标码与机内码 为了适应计算机处理汉字信息的需要 xff0c 在 1980 年 xff0c 我国国家标准总局发布 信息交换用汉字编码字符集 基本集 1981 年 5 月 1 日 开始实施的这套国家标准 这套国家标准的标准号是 GB2
  • 获取NSString子字符串

    NSString类中提供了这样三个方法用于获取子字符串 xff1a substringFromIndex substringWithRange substringToIndex xff1a 它们该怎么使用呢 xff1f 见下面代码即可知道
  • NSData和UIImage之间的转换

    源自 xff1a http stackoverflow com questions 2240765 nsdata to uiimage Try this code This worked for me create path to save
  • 获取UIImage的图像MD5

    问 xff1a I 39 m trying to compare two UIImages from the file system to see if they are the same Obviously I can 39 t use
  • 最全面的shsh备份及恢复教程,已更新Win版小雨伞4.33.00

    转自 xff1a http bbs weiphone com read htm tid 2017752 html 很多小白不知道如何备份shsh xff0c 论坛有很多关于备份shsh的帖子 xff0c 但大多都不全面 xff0c 本贴把s

随机推荐

  • C++查看大端序小端序的一些思考

    首先明确一个概念 xff0c 无论是大段序还是小端序 类型指针指向的地址都是该类型所占内存的低地址 明确了这个 xff0c 就好判断大端序和小端序了 这是大端序小端序的介绍链接 下边的是验证系统是大端序还是小端序的程序 span class
  • 设计模式书籍推荐

    1 名称 xff1a Head First Design Patterns 语言 xff1a java 评论 xff1a Jolt大奖得主 xff0c 介绍了常见的十几种模式 我认为最好的模式入门书籍 xff0c 内容生动 xff0c 风格
  • C#如何调用linux so库

    testlib c中的内容 xff1a include lt stdio h gt int sum int a int b return a 43 b int minus int a int b return a b main cs中的内容
  • 电机KV值

    电机 KV 值 xff1a 电机的转速 xff08 空载 xff09 61 KV 值 X 电压 xff1b 例如 KV1000 的电机在 10V 电压下它的转速 xff08 空载 xff09 就是 10000 转 分钟 电机的 KV 值越高
  • 用DD命令制作硬盘镜像

    用DD命令制作硬盘镜像 本文参考http serverfault com questions 4906 using dd for disk cloning写出 xff0c 转载时请说明出处 以下的说明都是针对备份整个硬盘 xff0c 而不是
  • 什么是PID 算法

    PID是工业控制上的一种控制算法 xff0c 其中P表示比例 xff0c I表示积分 xff0c D表示微分 以温度控制的PID程序为例 xff1a P xff08 比例 xff09 表示在温度设定值上下多少度的范围内做比例动作 xff0c
  • html代码向左居右对齐

    刚才居然忘了 现在写出来 lt div align 61 right gt 居右对齐 lt div gt left左 xff0c center中 xff0c right右
  • 出现java.lang.IllegalArgumentException: No configs match configSpec

    模拟器不支持OpenGL ES 2 0 是因为android模拟器不支持OpenGL ES 2 0 xff0c 解决办法 xff1a 创建模拟器时 xff1a GPU emulation选yes xff0c 需要android 4 0以上的
  • [005] [ARM-Cortex-M3/4] 大小端存储

  • Android使用java调用C的方法

    Android使用java调用C的方法 xff1a 要将C语言写的算法需要集成到安卓端 xff0c 因此学习如何从安卓java调用C JNI 1 JNI 提示 Android NDK Android Developers google cn
  • STM32之USART-串口通信(含串口实验详细解析)

    STM32之串口通信 USART xff08 含串口实验详细解析 xff09 开发环境 xff1a Window 10开发工具 xff1a Keil uVision5 MDK硬件 xff1a STM32F103 资料参考 xff1a 正点原
  • 昆仑镜Air530 GPS串口输出

    原理图 Air724UG硬件手册说明 Air724UG模块硬件手册 实际开机后并不是默认打开 pmd手册 LDO VMMC level范围0 15 其中0表示关闭其余值满足下面公式 step 61 9 level 当step大于127时为1
  • 常用bat代码

    清除空文件夹 清理空文件夹 删除空文件夹 64 echo off for f 34 tokens 61 34 i in 39 dir s b ad sort r 39 do rd 34 i 34
  • 如何快速的翻译并阅读外文文献

    本文适用一些想要快速了解文献内容的童鞋 在进行查找文献时 不可避免要查找外文文献 其中以英文居多 当然也有可能涉及到其他语言 像楼主这样学了十几年英语 然而听说读写弱鸡的人 面对英语时 会头痛 要是查到其他语言的文献时 估计要死的心都有了
  • [c/c++ ]字节序与大小端转换

    注明 xff1a 以下内容均为学习内容整理 xff0c 记录 xff0c 便于自己学习 xff0c 并非完全意义上的自产 xff0c 如有感到不适 xff0c 请联系我 一 多字节值及字节序 1 brief 现在有一个数字 65430 xf
  • 5V升压8.4V芯片电路图,5V充电7.4V电池

    两节锂电池串联 xff0c 串联电压相加 xff0c 一般锂电池标称电压3 7V xff0c 3 7V 43 3 7V 61 7 4V xff0c 7 4V锂电池 xff0c 充电充满电压饱和是8 4V 7 4V锂电池放电电压一般是6V 8
  • 浅谈资源加载 -AssetBundleSystem

    AssetBundleSystem Ps 稍微抽点时间写一下这个 xff0c 这个小项目完成度80 左右 xff0c 在年初2月份的时候就完成的差不多了 xff0c 因为各种原因处于半搁浅的阶段 xff0c 现在官方出了Addressabl
  • 地形转网格工具(Terrain2Mesh)

    在游戏开发的制作中可能需要制作地形 xff0c 需要制作的相关的地形工具 xff0c 绝大部分情况下并不会使用unity的terrain xff0c 因为其在移动平台上的表现很差 xff0c 相同顶点甚至更多的mesh性能也比其优秀很多 x
  • Unity-EmojiUI更新

    项目中可能会用到emoji表情 xff0c 所以这几天针对这个模块进行了制作和整理 首先 xff0c 在网上进行简单的搜索查找现成方案 xff0c 主要搜索结果为textmeshpro和github上的一些emoji项目 xff0c 因为闭
  • ZYNQ UltraScale 双核裸跑 / 裸跑 + Linux

    1 背景提出 某项目对中断延迟有很高的要求 xff0c 客户的构架为 xff1a PPC 43 Vxworks 延迟时间大概 xff1a 10us 因硬件设计原因 xff0c 还可以更小 我们在Linu系统下测试中断延迟大概几百us 而且这