【ZYNQ入门】第三篇、双核AMP运行模式程序开发

目录

第一部分、基础知识

1、多核CPU三种主要运行模式

2、ZYNQ内部FSBL涉及到的启动过程

2.1、BootRom是啥?

2.2、FSBL是啥?

2.3、ARM与cortex的关系

2.4、本次实验的启动流程

第二部分、FSBL环境配置过程

1、vivado配置硬件

2、SDK新建FSBL配置CPU1程序的启动地址

3、CPU0的工程创建及程序编写

4、CPU1的工程创建及程序编写

5、BOOT.bin文件的生成办法

6、仿真的办法

7、核间中断的方式

第三部分、总结


第一部分、基础知识

        完成两件事,介绍了ZYNQAMP模式的搭建方法以及生成BOOT.bin文件的办法。

1、多核CPU三种主要运行模式

  • AMP(非对称多进程):多个核心相对独立的运行不同的任务,每个核心可能运行不同的操作系统或裸机程序,但是有一个主要核心,用来控制整个系统以及其它从核心的运行
  • SMP(对称多进程)一个操作系统同等的管理各个内核,例如 windows,linux操作系统。
  • BMP(受约束多进程):与 SMP 类似,但开发者可以指定将某个任务仅在某个指定内核上执行。

        默认情况下, 裸机程序 ZYNQ 仅运行一个 CPU,这里主要讲解 AMP 模式下,两个 CPU 同时运行的裸机程序开发方法。

2、ZYNQ内部FSBL涉及到的启动过程

        ARM上电后执行BootROM,发现有合法镜像(BOOT.BIN)后判断是否要在FLASH中执行。若没有合法镜像则到下一个32K的偏移处寻找镜像。如果不XIP,则将FSBL载入到OCM中执行(因为此时是不能使用DDR的),之后开始执行FSBL。

        关于XIP技术:利用XIP技术就不用把代码读到RAM中了,NOR FLASH支持XIP技术与Flash博客园

        更多知识参考博客:   ZYNQ_FSBL学习-CSDN博客 (下图来源于这篇博客

2.1、BootRom是啥?

        BootRom可翻译为启动代码zynq内部的BootROM存储有一段在CPU上电后/复位后固定执行的代码,这段代码用来配置一个ARM CPU和一些必要外设,从而能从一个启动设备中获取FSBL(first stage boot loader)并执行。

        BootROM是一个ROM,不可写,PL的配置不是通过BootROM实现的。BootROM不能使用DDR和SCU,因为它们还没有初始化。

2.2、FSBL是啥?

        FSBL通常存储在FLASH中(U盘、SD卡、TF卡、SSD固态硬盘都是以FLASH闪存颗粒为介质的一类存储器),BootROM从选定的FLASH中拷贝FSBL到片上存储器OCM中执行。

2.3、ARM与cortex的关系


参考文章:到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?知乎 (zhihu.com)

  • ARM公司的名字,叫ARM:Advanced RISC Machines;
  • ARM前身Acorn公司设计的第一款微处理器,叫ARM:Acorn RISC Machine;
  • ARM处理器名字: 以前叫ARM9、ARM11, 新的命名规则改以Cortex命名,分别是Cortex-A,Cortex-R,Cortex-M; 这三个字母A、R、M
  • ARM指令集,就是ARM架构,比如ARMv8,每个处理器都需要依赖一定的ARM架构来设计;
  • SOC:各大厂商买来ARM的授权,得到ARM处理器的源代码,而后自己搞一些外围设备的IP(或者买或者自己设计),组成一个SOC,比如三星的Exynos 4412,华为的麒麟990。

2.4、本次实验的启动流程

        第一步、ARM上电后执行BootROM,从SD卡发现有合法镜像(BOOT.BIN文件,需要提前拷贝到SD卡中

1、Bin 文件是经过压缩的可执行文件,去掉ELF格式的东西。是直接的内存映像的表示。在系统没有加载操作系统的时候可以执行。

2、elf文件(executable  and   link   format)文件里面包含了符号表,汇编等。

3、BIN文件是将elf文件中的代码段,数据段,还有一些自定义的段抽取出来做成的一个内存的镜像。

        第二步、再将FSBL载入到OCM中执行,load boot image。(将FSBL载入到OCM的这个过程中没有使用cache,因为如果用到cache,CPU1不能及时读到OCM的内容,从而出现问题。缓存一致性

        第三步、FSBL在OCM中运行,根据启动模式的选择,FSBL从FLASH中复制启动镜像的其他部分。如果有bitstream,那么就加载到FPGA中如果有elf应用程序存在,那么就加载到DDR中并将执行权限移交给它

第二部分、FSBL环境配置过程

        实现基本的CPU1和CPU0交互打印信息。

        注意:FSBL工程的主要目的就用用来生成BOOT镜像文件。

1、vivado配置硬件

        不同器件配置不同,ZYNQ7020的bank0为LVCMOS3.3V和bank1为LVCOM1.8V。

        需要注意:后面如果出现SD下载bin文件后,程序无法启动,很有可能是SD卡模块的工作电压不对,也就是Bank0和Bank1的电压配置错误。

创建顶层文件,再生成bit流文件

2、SDK新建FSBL配置CPU1程序的启动地址

第一步、fsbl工程的处理器选择cpu0,因为AMP模式需要一个主要的核心来控制系统的运行

第二步、选择zynq FSBL工程模板

第三步、修改zynq FSBL工程模板

注意:这段代码尽量加在main函数的上方,这样调用的就不需要去声明,比较方便。

        下面的代码中CPU1STARTADR表示的是cpu1的开始地址,这个是固定的,由厂家决定的。然后CPU1STARTMEM表示的是CPU1程序开始的地址(一般是用户分配给CPU1的DDR内存的基地址的),CPU1STARTMEM是可以根据ddr的地址,看情况给的,也就是由用户设置的,可以改变的。

//增加的代码
/*****************************配置cpu1的启动地址代码*******************************/
//更改CPU1应用程序的启动地址
#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0//应用程序地址
#define CPU1STARTMEM 0x2000000
void StartCpu1(void)
{
        #if 1
        fsbl_printf(DEBUG_GENERAL,"FSBL: Write the address of the application for CPU 1 to 0xFFFFFFF0\n\r");
        Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
        dmb(); //waits until write has finished
        fsbl_printf(DEBUG_GENERAL,"FSBL: Execute the SEV instruction to cause CPU 1 to wake up and jump to the application\n\r");
        sev();
        #endif
}

第四步、调用上面的函数,调用位置为580-600行,注释为load boot image(启动引导镜像文件)

为什么是这里?

        因为只有在镜像文件加载完成后,才能让cpu0去触发cpu1,让cpu1去加载控制程序。

        如果在这之前就去调用该函数,DDR里面都还没有镜像文件,没有程序,cpu1就跑不起来。

什么是镜像文件?

        所谓镜像文件其实和rar ZIP压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件。这里可以包含引导文件,系统文件等。

        .bin就是一种常见的镜像文件的后缀。bin是binary的缩写,二进制文件。

第五步、ctrl + s保存,ctrl + b编译

        尽量编译一次,避免后面调试的时候出现文件不全的问题。

3、CPU0的工程创建及程序编写

第一步、再新建一个cpu0的工程。处理器一定要选择cpu0

第二步、为了方便,选择hellow world模板。

第三步、修改.c文件的名称为main.c

第四步、修改main.c文件如下

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

//将内存中指向0xFFFF0000地址的指针进行解引用,volatile关键词是防止这个地址的变量被程序优化掉,
//使这个地址内的存的变量更加稳定,地址必须在共享内存范围
#define COMM_VAL (*(volatile unsigned long *)(0xFFFF0000))


int main()
{
    COMM_VAL=0;
        //Disable cache on OCM
        Xil_SetTlbAttributes(0xFFFF0000,0x14de2);//关闭cache
        while(1)
        {
        print("Hello World cpu0 \n\r");
        COMM_VAL = 1;
        while(COMM_VAL == 1)
        {
        }
        }
    return 0;
}

第五步、修改cpu0的代码空间,

注意:这里应该是私有ram存储cpu0运行的程序及产生的一些实时文件,只属于cpu0。因此这里的地址范围不可以和cpu1重复。

MEMORY
{
   ps7_ddr_0 : ORIGIN = 0x100000, LENGTH = 0x1E00000
   ps7_ram_0 : ORIGIN = 0x0, LENGTH = 0x30000
   ps7_ram_1 : ORIGIN = 0xFFFF0000, LENGTH = 0xFE00
}

        通过修改lscript.ld文件来修改cpu0的内存大小,后期如果出现栈溢出的问题,就可以来到这里将内存改大一点。

第六步、ctrl + s保存,ctrl + b编译

        尽量编译一次,避免后面调试的时候出现文件不全的问题。

4、CPU1的工程创建及程序编写

第一步、再新建一个cpu1的工程。处理器一定要选择cpu1

第二步、为了方便,选择hellow world模板。

第三步、修改.c文件的名称为main.c

第四步、修改main.c文件如下

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"


#define COMM_VAL (*(volatile unsigned long *)(0xFFFF0000))

int main()
{
    COMM_VAL=0;
        //Disable cache on OCM
        Xil_SetTlbAttributes(0xFFFF0000,0x14de2);//关闭cache
        while(1)
        {
        print("Hello World cpu1 \n\r");
        COMM_VAL = 0;//这里与CPU0不同,cpu0这里拉高,cpu1这里就需要拉低,这样才能让两个cpu交互起来。
        while(COMM_VAL == 0)
        {
        }
        }
    return 0;
}

第五步、修改cpu1的代码空间

        注意:这里应该是私有ram存储cpu1运行的程序及产生的一些实时文件,只属于cpu1。因此这里的地址范围不可以和cpu0重复。

MEMORY
{
   ps7_ddr_0 : ORIGIN = 0x2000000, LENGTH = 0x1F00000
   ps7_ram_0 : ORIGIN = 0x0, LENGTH = 0x30000
   ps7_ram_1 : ORIGIN = 0xFFFF0000, LENGTH = 0xFE00
}

第六步、ctrl + s保存,ctrl + b编译

        尽量编译一次,避免后面调试的时候出现文件不全的问题。

第七步、修改cpu1的bsp代码,将其设置为AMP模式

        注意:如果这里不设置,那么生成的bin文件是无法使用的

第八步、在原代码上加上 -DUSE_AMP=1

-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -nostartfiles -g -Wall -Wextra -DUSE_AMP=1

5、BOOT.bin文件的生成办法

第一步、创建镜像文件

        注意:

        1、这里要看你鼠标放在那个文件夹上,如果是bsp文件夹,那么去添加的时候就没有文件。

        2、但是如果想要顺序正确,那么就要把把鼠标先点击app_cpu0这个文件夹,这样生成镜像文件的顺序就是对的(需手动添加cpu1的elf文件),如果放在app_cpu1,那么就是elf bit cpu1,这样cpu1的顺序就提前了

        猜想:对于3核或者更多核,应该也是放在控制核的文件夹上生成bin文件。

第二步、如果默认文件夹,保存bin文件

        注意:如果默认系统的文件夹不新建文件夹,那么系统会默认你选择的那个文件下(我选的是app_cpu0)生成一个bootimage文件夹。

第二步、如果新建文件夹,保存bin文件

        注意:不能是上一次工程的路径,系统会默认是上一次工程的文件夹。

第三步、添加三个.elf文件,和一个bit流文件。

        注意:一定不能是上一次工程的文件夹

注意:顺序一定是下面的顺序1、fsbl.elsf,2、.bit,3、cpu0.elsf,4、cpu1.elsf

在app_cpu0下无法调换顺序

1、amp_fsbl位置

2、bit文件位置

 3、app0.elf和app1.elf位置

第四步、生成镜像文件

注意:bin文件复制到SD卡后用不了的可能问题

        1、SD卡的电平配置错误,或者说BANK0和BANK1的电平不对(√)

        2、四个文件的顺序不对(√)

        3、添加文件时,路径错误,因为系统会默认上一次工程的文件路径(√)

        4、办卡上的SD启动的拨码开关没有拨过去(√)

        5、cpu1没有没有设置为AMP模式,也就是少了 -DUSE_AMP=1这个代码(√)

        6、没有关闭cache

        7、串口选择错误

        8、共享内存的数据越界

第五步、生成的结果

6、仿真的办法

        选择cpu0的工程进行仿真

        勾选cpu1

7、核间中断的方式

        关于核间中断的配置代码请参考这篇博客:【ZYNQ入门】第二篇、ZYNQ的中断系统及常用中断初始化程序-CSDN博客

第三部分、总结

        这篇博客是我在学习AMP模式的整理笔记,希望对你有帮助。🦾🦾🦾

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/289229.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8天狂收6000+⭐️,可商用的开源Stream Diffusion

加州大学伯克利分校、东洋大学、东京工业大学、麻省理工学院和筑波大学等研究人员&#xff0c;联合开源了一款创新性实时交互图像生成框架——Stream Diffusion。 Stream Diffusion的技术创新点在于&#xff0c;将传统的顺序去噪变成流批处理去噪&#xff0c;消除了漫长的等待…

大模型实战营第二期——1. 书生·浦语大模型全链路开源开放体系

文章目录 1. 实战营介绍2. 书生浦语大模型介绍2.1 数据2.2 预训练2.3 微调2.4 评测2.5 部署2.6 智能体(应用) 1. 实战营介绍 github链接&#xff1a;https://github.com/internLM/tutorialInternLM&#xff1a;https://github.com/InternLM书生浦语官网&#xff1a;https://in…

使用Vue3开发学生管理系统模板7 科目信息的实现

字段设计 IDname&#xff1a;课程名称&#xff0c;字符串&#xff0c;最大36字符start_time&#xff1a;开设时间&#xff0c;日期类型teacher_total&#xff1a;该科目老师人数&#xff0c;数字类型master_id&#xff1a;负责人ID&#xff0c;字符串&#xff0c;最大36字符ma…

二、UI文件设计与运行机制

一、UI文件设计与运行机制 1、创建工程 2、添加控件&#xff0c;实现按钮点击 &#xff08;1&#xff09;添加控件 &#xff08;2&#xff09;添加信号和槽 2、分析项目结构 test_02test_02.pro Qt工程文件Headerswidget.h 设计的窗体类的头文件Sourcesmain.cpp 主程序入…

印象笔记03 衍生软件使用

印象笔记03 衍生软件使用 Verse 以下内容来源于官方介绍 VERSE是一款面向未来的智能化生产力工具&#xff0c;由印象笔记团队诚意推出。 你可以用VERSE&#xff1a; 管理数字内容&#xff0c;让信息有序高效运转&#xff1b;搭建知识体系&#xff0c;构建你的强大知识库&am…

高防ip适合防御网站和游戏类的攻击吗?

​  作为站长&#xff0c;要学会并承受得住网站外来攻击的压力&#xff0c;尤其是所属为 DDoS 攻击高发行业的网站类业务及游戏行业&#xff0c;是很容易被竞争对手或者一些伪黑客爱好者盯上的。 加上&#xff0c;有些站长并没有提前了解&#xff0c;就盲目进军了这两个行业&…

看板表格样式,去掉element表格背景

<div class"ml-20"><el-input v-model.trim"queryParams.wipOrderNo" size"small" clearable style"width:150px" placeholder"请输入工单号" /><el-select class"ml-20" v-model"queryParam…

[数据结构 C++] AVL树的模拟实现

文章目录 1、AVL树1.1 AVL树的概念 2、AVL树节点的定义3、AVL树的插入和旋转3.1 左单旋左旋代码实现 3.2 右单旋右旋代码实现 3.3 右左双旋右左双旋的代码实现 3.4 左右双旋左右双旋的代码实现 3.5 insert接口实现 4、判断是否为AVL树判断AVL树的代码实现 5、AVL树的性能 问题引…

金和OA c6 uploadfileeditorsave接口存在任意文件上传漏洞

产品简介 金和网络是专业信息化服务商&#xff0c;为城市监管部门提供了互联网监管解决方案&#xff0c;为企事业单位提供组织协同OA系统升开发平台&#xff0c;电子政务一体化平台智慧电商平合等服务 漏洞概述 金和-c6 uploadfileeditorsave 任意文件上传&#xff0c;攻击者…

计算机网络(9):无线网络

无线局域网 WLAN 无线局域网常简写为 WLAN (Wireless Local Area Network)。 无线局域网的组成 无线局域网可分为两大类。第一类是有固定基础设施的&#xff0c;第二类是无固定基础设施的。所谓“固定基础设施”是指预先建立起来的、能够覆盖一定地理范围的一批固定基站。 …

6个关键词,回顾网络安全行业的 2023!

话不多说&#xff0c;直接上 01 生成式人工智能 AIGC 热度&#xff1a;⭐️⭐️⭐️⭐️⭐️ AIGC 的发展不仅降低了内容创作的门槛&#xff0c;还为聊天机器人、数字人、元宇宙等领域提供了新的发展机遇。2023 年 8 月&#xff0c;首届人工智能生成内容国际会议在上海落地&…

Paddle3D 2 雷达点云CenterPoint模型训练

2 Paddle3D 雷达点云CenterPoint模型训练–包含KITTI格式数据地址 2.0 数据集 百度DAIR-V2X开源路侧数据转kitti格式。 2.0.1 DAIR-V2X-I\velodyne中pcd格式的数据转为bin格式 参考源码&#xff1a;雷达点云数据.pcd格式转.bin格式 def pcd2bin():import numpy as npimport…

C++面向对象语法总结(三)

目录 《C面向对象语法总结(一&#xff09;》《C面向对象语法总结(二&#xff09;》 二十一、多继承 C允许一个类可以有多个父类&#xff08;不建议使用&#xff0c;会增加程序设计复杂度&#xff09;在多继承中&#xff0c;会按照继承顺序将父类的成员变量放到子类成员变量的…

踩坑Vant组件 Dialog的组件调用

今天踩了一个非常蠢的坑&#xff0c;自己给自己蠢死的坑 在使用组件调用时自己没引入Dialog组件导致一直报错 不知道为什么全局引入不好使&#xff0c;后来使用了局部引用 现在没问题了 就这样局部引入一个Dialog.Component就可以了

CEEMDAN +组合预测模型(Transformer - BiLSTM+ ARIMA)

目录 往期精彩内容&#xff1a; 前言 1 风速数据CEEMDAN分解与可视化 1.1 导入数据 1.2 CEEMDAN分解 2 数据集制作与预处理 3 基于CEEMADN的 Transformer - BiLSTM 模型预测 3.1 定义CEEMDAN-Transformer - BiLSTM预测模型 3.2 设置参数&#xff0c;训练模型 4 基于A…

【日积月累】Java Lambda 表达式

目录 【日积月累】Java Lambda 表达式 1.前言2.语法3.应用场景3.1简化匿名内部类的编写3.1简化匿名内部类的编写3.2简化集合类中的操作3.3实现函数式接口3.4简化多个方法的调用3.5简化异步编程 4.总结5.参考 文章所属专区 日积月累 1.前言 Lambda表达式是一个匿名函数&#…

数据库索引、三范式、事务

索引 索引&#xff08;Index&#xff09;是帮助 MySQL 高效获取数据的数据结构。常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树&#xff08;B-tree&#xff09;。 常见索引原则有 选择唯一性索引&#xff1a;唯一性索引的值是唯…

爬虫入门与urllibrequests

前情摘要 一、web请求全过程剖析 我们浏览器在输入完网址到我们看到网页的整体内容, 这个过程中究竟发生了些什么? 我们看一下一个浏览器请求的全过程 接下来就是一个比较重要的事情了. 所有的数据都在页面源代码里么? 非也~ 这里要介绍一个新的概念 那就是页面渲染数据的…

[C#]使用onnxruntime部署Detic检测2万1千种类别的物体

【源码地址】 github地址&#xff1a;https://github.com/facebookresearch/Detic/tree/main 【算法介绍】 Detic论文&#xff1a;https://arxiv.org/abs/2201.02605v3 项目源码&#xff1a;https://github.com/facebookresearch/Detic 在Detic论文中&#xff0c;Detic提到…

基于Java SSM框架实现中国古诗词学习平台项目【项目源码】

基于java的SSM框架实现中国古诗词学习平台系统演示 JSP技术介绍 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了用…
最新文章