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

这篇具有很好参考价值的文章主要介绍了【ZYNQ 开发】AMP双arm核交互 - 环境搭建(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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。
基本框架图如下 : 

__asm__(

这里我们可以看到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中进行如下操作:
__asm__(
__asm__(
之后修改工程中的main函数:参考xilinx官方文档的UG585,可以看到fsbl的一些具体操作
这里我们输入如下的启动代码:
__asm__(
#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()

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

__asm__(

4.2 创建CPU0的app应用程序

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

__asm__(

我们在本次实验中使用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

__asm__(

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地址改为:

__asm__(

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

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

__asm__(

4.5 生成boot.bin文件

按照以下步骤:

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

2. 生成boot image

__asm__(

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

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

__asm__(

4. 之后sd卡放到办卡上,选择sd卡启动的方式,就可以看到我们的两个应用程序启动了。文章来源地址https://www.toymoban.com/news/detail-834376.html

到了这里,关于【ZYNQ 开发】AMP双arm核交互 - 环境搭建(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go语言环境要这样搭建才"省钱"

    目录 本篇概要 集成开发环境工具(ide) Goland或IntelliJ IDEA Visual Studio Code 其他集成开发环境 Visual Studio Code的go语言开发环境搭建 Visual Studio Code安装 go编译环境安装 配置go环境变量 安装go语言插件 使用golang编程 本篇小结 下篇预告 搭建go语言环境,除了要搭建go语言的编译环境

    2024年02月13日
    浏览(30)
  • [ARM 汇编]高级部分—ARM汇编编程实战—3.3.2 嵌入式开发环境搭建

    搭建一个嵌入式开发环境主要包括以下几个部分: 安装交叉编译器 配置集成开发环境(IDE) 安装调试工具 下载和烧录程序 接下来,我们将详细介绍每个部分,并提供相应的实例。 安装交叉编译器 交叉编译器是用于将您编写的ARM汇编代码编译成可执行文件的工具。在本教程

    2024年02月11日
    浏览(55)
  • VSCode+CMake+Arm GNU Toolchain搭建GD32开发环境

    一个串口收发简单例子。 https://github.com/Huffer342-WSH/GD32_CMake_Example 可以下载该工程,稍微了解一点cmake就可以简单修改直接使用。 GD32 CMake example 使用到的工具 编译与烧录 命令行 VSCode 调试 配合VSCode的marus25.cortex-debug插件实现调试功能 RTT使用方法 marus25.cortex-debug 手动连接 注意

    2024年02月11日
    浏览(40)
  • ARM(IMX6U)嵌入式软件裸机开发之环境搭建与配置

    目录 前沿 Ubuntu 和 Windows 文件互传 Ubuntu 下 NFS 和 SSH 服务开启  Ubuntu 交叉编译工具链安装 Source Insight 软件安装和使用 Visual Studio Code 软件的安装和使用 为什么我们要学习裸机开发呢?         1、裸机开发是了解所使用的 CPU 最直接、最简单的方法,比如使用的 I.MX6U,跟

    2023年04月15日
    浏览(44)
  • L16物联网ARM开发--开发环境搭建及平台及GPIO口操作平台介绍(day2、3)

    目录 一、MDK-ARM环境介绍及安装 二、STM32Cube简介及安装   STM32CubeMX安装 加载固件库 ​编辑  三、 STM32F0存储器映射 四、STM32启动文件分析 略 五、GPIO的基本概念及寄存器介绍1 1、GPIO接口简介  2、GPIO功能复用  3、GPIO寄存器介绍  GPIO工作原理框图: 五、点亮LED寄存器版(

    2024年02月01日
    浏览(55)
  • ZYNQ自带ARM核处理器的FPGA芯片烧写及最小系统搭建,bit文件烧写

    1. 烧写背景 FPGA芯片,如果是ZYNQ系列这种自带ARM处理核的器件,包含PS和PL处理部分,只是逻辑的debug可以只使用PL部分。但是如果要实现文件的烧写就必须通过PS部分进行烧写。因为与外部flash芯片相连的QSPI是通过PS部分连接的,且也需要PS部分对FPGA的boot进行配置。   Zynq700

    2024年02月08日
    浏览(47)
  • HUAWEI 擎云L420 折腾记 (搭建arm gcc、openocd 雅特力 MCU开发环境)

    心血来潮,能不能在纯国产的笔记本、系统上进行开发, 划拉了一下市面上能买到的设备,也就华为擎云L410 、L420 还能买得起,用的上,因此小黄鱼2xxx 买了一部99新的擎云L420 开始尝试是否能搭建起来工作环境。 wq退出保存 之后 java -verison java 环境ok 安装十分顺利,默认版

    2024年02月17日
    浏览(47)
  • GCC - 基于win10平台搭建Cmake + MinGW + gcc-arm-none 开源开发环境

    基于GUN开源工具链,搭建Windows平台下 ARM 编译运行环境! 🐱‍🚀 文中涉及的开发工具包已打包上传 ,可点击此处下载。 1、 建议直接下载安装git (内部集成有该工具),也可点击此处单独下载Git Bash工具; 2、如无法直接调用,添加对应环境变量; 32位下载地址:  MinG

    2024年02月10日
    浏览(43)
  • 使用arm-none-eabi-gcc编译器搭建STM32的Vscode开发环境

    make:Windows中没有make,但是可以通过安装MinGW或者MinGW-w64,得到make。 gcc-arm-none-eabi:建议最新版,防止调试报错 OpenOCD vscode cubeMX Arm Assembly:汇编文件解析 C/C++:c语言插件 Cortex-Debug:调试插件 gcc-arm-none-eabibin OpenOCDbin 建议MinGW-make工具重命名为make.exe并添加到gcc-arm-none-eabi

    2024年02月06日
    浏览(53)
  • ARM学习(23)AMP和SMP的认识与理解

    笔者来聊聊AMP和SMP架构理解(多核下系统)。 笔者经常听到ARM架构时,谈到SMP的架构或者AMP的架构,今天特意来了解一下,主要是针对多core处理,对于常见的MCU应用场景,可以比较少,往往是需要较强的性能或者应付复杂的场景,会碰到多核的场景。 SMP:Symmetric multiproces

    2024年02月12日
    浏览(106)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包