ZYNQ双核处理器独立运行AMP

news2025/7/26 19:24:53

一、简介

多核处理器从多核的结构上是否一致,分为两种基本架构:同构多核架构和异构多核架构。同构多核

处理器是指系统中的处理器在结构上是相同的;而异构处理器是指系统中的处理器在结构上是不同的,这

些处理器可以是通用处理器,也可以是解决某些特定应用的专用硬核。同构多核架构相比于异构多核架构,在硬件和软件设计上较为简单,通用性较高。但在某些特定应用场合下,如异构多核架构专用的硬件加速硬核,异构多核架构的性能会更高。

Xilinx 的 ZYNQ SOC 融合了这两种架构,ZYNQ SOC 芯片包含两个独立的 Cortex-A9 处理器,这两个

处理器核在结构上是相同的,同时又包括了可编程的逻辑单元(PL),使得 ZYNQ 整体系统成为了一个异构多核系统,同时具有较高的通用性和性能。

从软件的角度看,多核处理器的运行模式有 AMP(非对称多处理)、SMP(对称多处理)和 BMP(受

约束多处理)三种运行模式。

AMP 运行模式指多个内核相对独立的运行不同的任务,每个内核相互隔离,可以运行不同的操作系统

(OS)或裸机应用程序。

SMP 运行模式指多个处理器运行一个操作系统,这个操作系统同等的管理多个内核,如 PC 电脑。

BMP 运行模式与 SMP 类似,但开发者可以指定将某个任务仅在某个指定内核上执行。

一般来说,SMP 为较高级的应用提供统一的 OS 平台,开发者在 OS 之上构建应用时,无需考虑两个内

核之间的资源共享和进程间通信。除此之外,对 SMP 而言存在性能开销,这会对实时性要求较高的应用,其性能造成较大影响。如 PC 机电脑的多核处理器一般运行在 SMP 模式,实现的功能较为复杂,但对实时性的要求不高。

如下是AMP 与 SMP 运行模式的框图

ZYNQ-7000 SOC 提供了两个 Cortex-A9 处理器,这两个处理器在 AMP 的机制下,可以运行各自独立

的操作系统或者裸机应用程序。本次试验采用的是双核 AMP 的运行模式,两个 CPU 分别运行不同的裸机应用程序。

ZYNQ 中的 OCM 包括 256KB 的 RAM 和 128KB 的 ROM(BootRom),其中可以被两个 CPU 进行改

写的,就是 256KB 的 RAM。OCM 分为 4 个 64KB RAM,存储空间较小,而外置的 DDR3 存储器一般存储空间较大。当两个 CPU 需要进行大量数据交互的时候,可以使用 DDR3 存储器作为共享内存;而当交互的数据较少时,既可以使用 OCM 作为共享内存,也可以使用 DDR3 存储器作为共享内存。值得一提的是,当交互的数据量较少时,OCM 作为共享内存有着独特的优势,与 DDR 内存相比,OCM 提供了非常高的性能和来自两个处理器的低延迟访问。

本次试验的两个 CPU 都会使用到串口,并且 CPU0 会对 OCM 进行写操作,CPU1 对 OCM 进行读操作,这就要求共享外设和内存不能同时访问,以免产生冲突。我们可以利用软件产生中断(SGI)的方式来规避冲突。在初始状态下,CPU0 先使用串口,在接收到用户数据后,将数据写入 OCM 中,并产生中断来触发CPU1 中断,此时 CPU0 不在访问串口和 OCM;CPU1 触发中断后,开始访问串口和 OCM,先从 OCM 中读出数据,通过串口来输出信息,并产生中断触发 CPU0 中断,之后不再访问串口和 OCM;CPU0 接收到CPU1 的中断后,此时可以重新通过串口来接收用户输入的数据,从而避免了共享外设和内存的同时访问。

二、硬件设计

三、软件设计

在SDK中新建两个APP ,一个是a9_cpu0_app,另一个是a9_cpu1_app,配置CPU的时候一个选cpu0,另一个选cpu1

两个工程都用hello world模板

其中,a9_cpu0_app里面的代码如下

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

#define sev() __asm__("sev")
#define CPU1STARTADR 0xfffffff0   //存放 CPU1 应用起始地址的地址
#define CPU1STARTMEM 0x10000000   //CPU1 应用起始地址

//启动 CPU1,用于固化程序
void StartCpu1(void)
{
    Xil_Out32(CPU1STARTADR,CPU1STARTMEM);  //向 CPU1STARTADR(0Xffffffff0)地址写入 CPU1 的访问内存基地址
    dmb();    //等待内存写入完成(同步)
    sev();    //通过"SEV"指令唤醒 CPU1 并跳转至相应的程序
}

int main()
{
    init_platform();
    Xil_SetTlbAttributes(0xffff0000,0x14de2);  //禁用 0xfffffff0 的 Cache 属性

    print("Hello World cpu0\n\r");
    print("try to start cpu1...\r\n");
    StartCpu1();
    while(1)
    {
        print("Hello World cpu0\r\n");
        sleep(1);
    }
    cleanup_platform();
    return 0;
}

里面包含了启动CPU1的函数,实际我们启动DEBUG的时候这个函数不会发生作用,需要程序固化到FLASH之后,启动才会生效。

a9_cpu1_app里面的代码如下

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


int main()
{
    init_platform();
    sleep(1);
    print("Hello World cpu1\n\r");

    while(1)
    {
        print("Hello World cpu1\r\n");
        sleep(1);
    }
    cleanup_platform();
    return 0;
}

Xil_SetTlbAttributes(0xffff0000,0x14de2);是禁用 0xfffffff0 的 Cache 属性

接下来设置cpu0的APP地址设置,起始地址和大小

设置cpu1的APP地址设置,起始地址和大小

注意上图中第一行左侧为基地址,右侧为存储空间大小,以字节为单位,存储空间大小设置

为 0x00100000(十进制 1048576),即 1MByte(1048576/1024/1024)。修改完成后,按下“Ctrl”+“S”保存。另外上图中的 ps7_ram_0 和 ps_ram_1 为 OCM 共享内存的基地址和存储空间大小。注意,两个CPU的基地址要设置不同

DEBUG配置如下

接下来验证

选择A9 #0处理器,点击运行,串口打印CPU0

在选择A9 #1,CPU1也运行起来了,二者交互打印信息

四、固化到FLASH

我们SDK新建一个FSBL启动工程

FSBL工程新建完成之后,等待SDK自动编译结束

结束之后打包BIN文件,固化到FLASH

然后我们烧写到FLASH,根据板子的背面设置成QSPI模式

注意,烧写之前要先断开开发板的SDK连接

烧写结束,板子重启,打开串口助手,可以看到两个处理器愉快的运行起来了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL递归查询 三种实现方式

1 建表脚本1.1 建表DROP TABLE IF EXISTS sys_region; CREATE TABLE sys_region (id int(50) NOT NULL AUTO_INCREMENT COMMENT 地区主键编号,name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 地区名称,short_name varchar(50) CHARA…

WebDAV之π-Disk派盘+Cloud Player

Cloud Player 支持WebDAV方式连接π-Disk派盘。 推荐一款云媒体播放器是存储在常见云平台中的内容的通用播放器。 Cloud Player云媒体播放器是存储在常见云平台中的内容的通用播放器,无需将其下载到设备。支持以下云平台:Google Drive、DropBox、One Drive、WebDav等。此外,…

BI解析,告诉你企业为什么选择商业智能BI?

数据的价值目前在商业世界和现代化城市建设中尤为突出&#xff0c;先说商业世界&#xff0c;数据在这里成为了各领域企业的重要资产&#xff0c;不仅让众多企业重新构建了以数据为企业文化、核心驱动力的数据体系&#xff0c;还把企业的财务、销售、运营、市场、研发等不同部门…

写出高质量的前端代码之消除代码中的重复

软件开发中&#xff0c;有个很重要的DRY原则&#xff0c;即Dont Repeat Yourself&#xff0c;也就是不要重复自己。 重复的代码会带来以下问题&#xff1a; 开发效率低&#xff0c;重复造轮子不同人开发的同一类功能&#xff0c;质量层次不齐修改问题时可能会遗漏&#xff0c…

vue3 + vite + ts 集成mars3d

vue3 vite ts 集成mars3d 文章目录vue3 vite ts 集成mars3d前言一、创建一个vue3 vite ts项目二、引入mars3d相关依赖三、vite.config.ts 相关配置四、 新建DIV容器 创建地图前言 使用mars3d过程中&#xff0c;需要集成mars3d到自己的项目中&#xff0c;mars3d开发教程…

MFC实现曲柄滑块以及铰链四杆机构的运动仿真

创建MFC应用&#xff0c;选择单文档&#xff0c;在应用程序类型中的应用程序类型选择单文档&#xff0c;在项目样式中选择MFC standard&#xff0c;在用户界面功能中的命令行中选择 使用菜单栏和工具栏。这样选择界面更好看一点&#xff0c;下面给出截图&#xff1a;在资源视图…

代码随想录算法训练营第三十八天 | 理论基础 ,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

Day36 周日休息~一、参考资料理论基础https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 刷题大纲递推五部曲&#xff1a;确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确…

云计算专业和计算机专业哪个好就业?

云计算专业其实也是属于计算机类专业呢&#xff0c;他包括了计算机硬件设备、计算机网络、磁盘柜、操作系统、中间件、数据库、服务器/虚拟机、应用软件开发等技术内容&#xff0c;云计算技术是以IT服务的形式面向用户的&#xff1b;所以云计算不是一门技术&#xff0c;而是众多…

一个底层30岁的测试员的故事,连躺平都是奢望的....

背景 我是一个生活在某二线城市的测试员&#xff0c;家里面有两位小朋友&#xff0c;老大现在读幼小衔接&#xff0c;明年上小学&#xff0c;老二两岁多一点点&#xff0c;明年上幼儿园。家庭主要开支有房贷、车贷、车位贷、保险、时不时小意外、还有一笔 3万的信用卡分期&…

【亲测】PHP进销存源码 ERP多仓库管理系统 网络版手机端+小程序版进销存 二次开发

可电脑端操作&#xff0c;也可以小程序端操作&#xff0c;非常方便&#xff01;适合小型企业个人使用。 服务端thinkphp5全套开源源码&#xff0c;uniapp前端全套开源 功能 1、支持采购单录入、审核、入库、退货等采购过程中的记录追踪 2、支持销售、出库、销售审核、出库审核…

Smtplib之发邮件模块

目录 创建Smtp对象 Smtp类中的方法 MIME MIMEBase MIMEBase MIMEMultipart MIMEApplication MIMEAudio MIMEImage MIMEText 实例 texthtml格式 发送带图片附件的邮件 发送带附件的邮件 含多种格式 SMTP模块 SMTP 简单传输协议&#xff0c;它是一组用于由源…

JAVA商城源码-多用户商城系统源码-B2B2C商城系统

项目介绍 三勾多商户小程序商城基于springbootelement-uiuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 采…

leaflet 导出图片,打印图片(A4横版或竖版)

第093个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中打印图片导出图片。一个简单的leaflet插件示例,添加了一个图标来打印或导出地图。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共85行)安装插…

自然语言处理(NLP)之word2vec的实现(PTB语料库)<找语义相近的词>

在2013年Google开源了一款用于词向量计算的工具&#xff1a;word2vec&#xff0c;它本身不是一种深度学习之类的模型&#xff0c;是一种用于计算词嵌入的体系结构。实际上大家平时说的这个指代的就是前面介绍过的跳字(元)模型与连续词袋模型CBow&#xff1a;自然语言处理(NLP)之…

OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

1. 学习目标 学习 OpenCV 图像的翻转函数 cv.flip&#xff1b;学习 NumPy 矩阵的反转函数 np.flip&#xff1b;自己实现矩阵反转的函数。 2. OpenCV 翻转 翻转也称镜像&#xff0c;是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转&#xff0c;垂直…

写出高质量的前端代码之降低耦合提升正交性

耦合与正交性 什么是耦合 在百度百科中&#xff0c;对耦合的解释 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。 我曾经买过一个遥控飞机玩具&#xff0c;当我推前进杆的时候&#xff0c;飞机除了前进&#xff0c;还会往左或者往…

字符串匹配--strstr函数的模拟实现思路和代码

一&#xff0c;strstr函数 原型&#xff1a; const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 ); strstr是一个字符串匹配函数&#xff0c;在str1中去寻找str2&#xff0c;如果找到&#xff0c;返回str2在…

科研快讯 | 14篇论文被信号处理领域顶级国际会议ICASSP录用

ICASSP 2023 近日&#xff0c;2023年IEEE声学、语音与信号处理国际会议&#xff08;2023 IEEE International Conference on Acoustics, Speech, and Signal Processing&#xff0c;ICASSP 2023&#xff09;发布录用通知&#xff0c;清华大学人机语音交互实验室&#xff08;TH…

【LSTM】2 多因素单步骤预测

基于时间序列的预测&#xff0c;一定要明白它的原理&#xff0c;不是工作原理&#xff0c;而是工程落地原因。 基于时间序列&#xff0c;以已知回归未知----这两句话是分量很重的。 多因素单步单输出组合 时间序列&#xff1a;t1 是 特征 1,2,3 预测t2 的回归值41 多因素单步多…

当科普展会和VR全景碰撞,会擦出什么样的火花?

你知道科普的重要性吗&#xff1f;一些大城市学生从小到大经历过很多科普展会&#xff0c;帮助青少年从小就树立正确的科学价值观和人生观&#xff0c;那么当科普展会和VR全景碰撞会擦出什么样的火花呢&#xff1f; 在这个信息时代&#xff0c;什么信息都可以在网上搜到&#x…