【ZYNQ 开发】AMP双arm核交互 - 环境搭建(1)

本文介绍了在ZYNQ芯片中,通过非对称多进程(AMP)模式实现两个CPU间的无中断、软中断和硬中断通信,以及使用FSBL和BOOT.bin进行应用程序加载的实验过程。实验涉及创建AMP环境、配置RAM、内存屏障和OCM的使用,旨在展示双核处理器的性能优化和中断管理技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 实验目的:

2. 实验原理介绍:

2.1 什么是AMP?

2.2  实验的功能框图:

3. 实验流程:

3.1 无中断的连续通信(1)

3.2 软中断通信(2)

3.3 硬中断通信(3)

3.4 AXI_LITE双口ram的建立(4)

4. 实验过程

4.1 创建amp环境及CPU的FSBL

4.2 创建CPU0的app应用程序

4.3 创建CPU1的app应用程序

4.4 设置CPU1的模式为AMP非对称模式

4.5 生成boot.bin文件

1. 实验目的:

标准情况下,zynq芯片使用的过成中,默认只会使用一个cpu。我们这个实验的过程中,就是要同时调用这两个核进行信息交互,在完成不带中断的交互之后,我们会增加软中断和硬中断,进行相应的中断信息发送测试。CPU0 和 CPU1 中独立跑不同的应用程序,发挥双核的非对称性架构的优势和性能。也为了学习ZYNQ如何在JTAG下载之外,使用flash或者sd卡加载程序。

2. 实验原理介绍:

2.1 什么是AMP?

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

2.2  实验的功能框图:

我们每个cpu会使用一个ram,我们后续中这样命名,我们命名我们后续使用的CPU和RAM分别为CPU0和RAM0以及CPU1和RAM1。
基本框架图如下 : 

这里我们可以看到ram0 只能被cpu0写入,只能被cpu1读取,ram1只能被cpu1写入,被cpu0读取。而且需要注意的是,cpu一般在读写的过程中都会经过cache,而不会直接写入ram中,因此我们在后续过程中,我们要禁用cache,让cpu可以直接写入ram中。避免读写时序出现问题。

3. 实验流程:

3.1 无中断的连续通信(1)

完成两个核之间通信,通过软中断完成核间通信,并且使连个 CPU 并行执行任务。

3.2 软中断通信(2)

3.3 硬中断通信(3)

3.4 AXI_LITE双口ram的建立(4)

4. 实验过程

4.1 创建amp环境及CPU的FSBL

创建 amp_fsbl 用于生成烧写镜像的时候加载 Core0 Core1 的代码
fsbl = first boot loader
这个是为了最后方便生成BOOT.bin文件,我们后续要使用到sd启动的方式,要将启动文件放到SD卡中。最后一上电,就会把程序加载到两个CPU中。 对于zynq来说,我们一上电会默认启动cpu0,我们要通过cpu0来加载fsbl的文件来启动cpu1的相关事务。
打开vivado之后生成zynq ip核,编译生成bitstream文件之后,点击打开sdk
之后再sdk中进行如下操作:
之后修改工程中的main函数:参考xilinx官方文档的UG585,可以看到fsbl的一些具体操作
这里我们输入如下的启动代码:
#define sev() __asm__("sev")

这段代码定义了一个名为 sev 的宏。在这个宏的定义中,使用了内联汇编 __asm__("sev"),这表示在这个宏被调用时,将执行 ARM 处理器的 SEV 汇编指令。

SEV 指令是 ARM 处理器的一条指令,用于发送事件。在多处理器系统中,SEV 指令通常用于唤醒其他处理器或核心,告知它们有事件需要处理。

Xil_Out32() 是用于在Xilinx的软件开发工具中进行寄存器写入的函数。具体来说,Xil_Out32() 是用于写入32位无符号整数(32位数据)到指定地址的函数。这里面的意义其实就是在告诉Cpu他对应的应用程序在ddr的哪段内存里面。

这个函数常用于裸机编程、嵌入式系统中,特别是在使用Xilinx的FPGA和SoC开发工具时。通过使用这个函数,可以直接向特定地址的寄存器写入数据,用于配置硬件、控制外设等。

这个工程中我们这端启动程序的起始地址再0x2000000,我们把这个地址写入CPU的起始地址中。

在 ARM 架构中,dmb() 指令用于实现数据同步的内存屏障。dmb 是 "Data Memory Barrier" 的缩写,它确保在 dmb 指令之前的内存访问操作完成后,再执行 dmb 之后的内存访问操作。具体而言,dmb()

完成以上的内容之后,我们在镜像位置加入如图的代码:

4.2 创建CPU0的app应用程序

在UG585文档中,我们可以看到OCM = on chip memory片上内容,不需要任何总线的高速内存

我们在本次实验中使用OCM3,我们在此处设立了特定的共享变量

COMM_VAL (*(volatile unsigned long *)) (0xFFFF_0000))

之后修改app工程中的main函数,代码如下:

#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);
       while(1){
              print("Hello World cpu0 \n\r");
              COMM_VAL =1; 
              while(COMM_VAL == 1){

              }
       }
  return 0;
}

我们在执行的过程中,修改共享变量的值,并且让CPU1因为数值的修改卡死在while循环中,我们后续要在CPU2中也对这个共享数值进行修改,让CPU0走出这个死循环。

一般来说,我们的ZYNQ芯片上,我们通常把一些常用的重要的变量存在OCM中,我们把一app应用程序存在DDR中,因此针对这个问题,我们需要对每个cpu使用的ddr地址进行一定的分配。

打开 SRC 目录存在文件 lscript.ld 做如下修改
CPU0 的代码空间改为 1E00000

ddr的大小就是1E000000 = 30MB 

4.3 创建CPU1的app应用程序

创建的过程同上,但是代码发生改变,我们还需要注意的是,ddr的地址也要和CPU0定义的地址有所区分。

代码:

这里看代码可以看见我们在循环对共享变量进行变更,来实现arm核之间的非堆成操作,还有一部分的信息交互。

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

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

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

ddr地址改为:

4.4 设置CPU1的模式为AMP非对称模式

在app_cpu1的BSP中设置模式为AMP  -DUSE_AMP=1

4.5 生成boot.bin文件

按照以下步骤:

1. 在我们的工程目录新建一个bootbin文件夹方便储存

2. 生成boot image

3. 之后添加 我们的amp_fsbl文件 , vivado生成的block design内的bitstream文件

以及我们的cpu0和cpu1的文件。这样 FSBL 会连续加载 CPU0 和 CPU1 的代码到 DDR 中,按照 lscript.ld 约 束进行地址空间划分。

4. 之后sd卡放到办卡上,选择sd卡启动的方式,就可以看到我们的两个应用程序启动了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值