基于ZYNQ的双核启动与通信问题解决
1 处理器间的通信
为AMP 设计创建应用之前,您需要考虑应用如何进行通信(如有需要)。最简单的方法是使用片上存储器。Zynq SoC 配备256KB 的片上SRAM,可从以下四个源地址进行访问:
• 利用侦测控制单元(SCU)从任意内核进行访问;
• 利用SCU 通过AXI 加速器一致性端口(ACP)从可编程逻辑进行访问;
• 利用片上存储器(OCM)互联通过高性能AXI 端口从可编程逻辑进行访问;
• 也是利用OCM 从中央互联进行访问。
由于这些不同的访问源都能对片上存储器进行读写,因此尤为重要的一点是,在使用OCM 之前一定要首先详细了解其的运行方式。
既然OCM 有多个访问源,那么显然应该定义一个仲裁和优先级形式。由于侦测控制单元需要最低时延(SCU 既可以是处理器内核也可以是AXI ACP 接口),因此SCU 从这些访问源的读操作就具有最高优先级,紧接着是SCU 写操作,然后是OCM 互联读/ 写操作。用户可通过将片上存储器控制寄存器中的SCU 写操作的优先级设置为低来颠倒SCU 写操作和OCM 互联访问的优先级。
OCM 本身结构为128 位字,分成四个64KB 分区,并位于PS 地址空间的不同位置。初始配置下,前三个64KB 区块布置在地址空间的起始位置,最后一个64KB 区块置于地址空间的末尾。
1.1 简单的片上存储器实例
您可使用赛灵思I/O 函数访问OCM, 以便从所选的存储器地址读取和写入数据。这些函数包含在Xil_IO.h 中, 可支持在CPU 地址空间内存储和访问8 位、16 位或32 位字符型、短整型或整型数据。使用这些函数时,只需知道您希望访问的地址以及想要在此存储的值即可。如果是写操作,方法如下:
Xil_Out8(0xFFFF0000,0x55);
read_char = Xil_In8(0xFFFF0000);
使用该技术时要确保两个地址指向片上存储器中的相同位置,尤其是当不同人编写不同内核程序时更应如此,为此更好的方法是使用共同的头文件。该文件将包含针对特定传输的相关操作地址的宏定义,例如:
#define LED_PAT 0xFFFF0000
另一种备选方法是让两个程序都使用指示器来访问存储单元。您可以通过使用宏命令定义指向恒定地址的指示器(一般用C 语言)来实现这一点:
#define LED_OP (*(volatile unsigned int *)(0xFFFF0000))
此外,您还可以对地址再次进行宏定义,以确保该地址为两个应用程序的共用地址。这种方法无需使用赛灵思I/O 库,而是通过指示器实现简单访问。
2、双核运行和启动完整工程创建过程记录
我们利用wiki提供的文件创建硬件工程和软件工程,并创建基于QSPI Flash的固化文件mcs文件。
2.1 创建硬件工程
下载文件earlyaccess_xapp1079_2014.2.zip。网址如下:
http://www.wiki.xilinx.com/XAPP1079+Latest+Information
然后解压earlyaccess_xapp1079_2014.2.zip,把design文件夹下的src文件夹拷贝到C:\Users\Administrator\AppData\Roaming\Xilinx文件夹下面,然后打开软件Vivado 2014.2,然后点击ToolsàRun Tcl Script,打开路径C:\Users\Administrator\AppData\Roaming\Xilinx选择create_proj_ zedBoard.tcl,然后点击OK。就会自动运行创建Project_1的硬件工程,生成bit文件,打开implement,Export Hardware,launch SDK。硬件工程模块图如下图1所示:
图1
工程放在C盘复杂目录下寻找起来不方便,我们把他拷贝到目录E:\Zed7020_lab\2014.2\zed_amp_bare_metal_cortex_a9文件夹下面,然后打开vivadio,打开SDK。
2.2 创建软件工程
在SDK软件中选择Xilinx_Tools->Repositories,选择New,浏览文件夹选择路径E:\Zed7020_lab\2014.2\zed_amp_bare_metal_cortex_a9\src\sdk_repo,然后点击OK。如下图2所示:
图2
创建FSBL工程,选择File->New->Application_Project,工程命名为fsbl,然后点击Next,选择模板‘Zynq FSBL’,然后点击Finish。
重新启动CPU1依靠FSBL BSP文件修改的向量表。所以需要验证FSBL BSP使用的standalone来自local repository。
选择fsbl_bsp,然后右键选择'Board Support Package Settings',观察界面,验证OS Version是4.91,然后点击Cancle。如下图3所示:
图3
创建应用工程运行在CPU0,选择File->New->Application_Project,工程命名为'app_cpu0',然后选择next。选择模板'Empty Application'然后点击Finish。然后下解压包的路径…\earlyaccess_xapp1079_2014.2\design\src\apps\app_cpu0下拷贝文件app_cpu0.c和lscript.ld粘贴到SDK工程app_cpu0->src下面。如图4所示:
图4
创建板级支持包为CPU1,选择File->New->Board_Support_Package,然后将工程命名为app_cpu1_bsp,改变处理器为’ ps7_cortexa9_1’。然后点击Finish。在 'Board Support Package Settings' 里选择Overview->drivers->ps7_cortexa9_1 和改变the extra_compiler_flags 值 为 '-g -DUSE_AMP=1',然后点击OK。如下图5所示:
图5
创建应用程序运行在CPU1上,选择File->New->Application_Project,然后工程命名为'app_cpu1',改变处理器为‘ps7_cortexa9_1’,选择板级支持包,使用已存在的板级支持包'app_cpu1_bsp',然后点击Next,选择模板'Empty Application',然后点击Finish。如下图6所示:
图6
然后下解压包的路径…\earlyaccess_xapp1079_2014.2\design\src\apps\ app_cpu1下拷贝文件app_cpu1.c和lscript.ld粘贴到SDK工程app_cpu1->src下面。
2 生成mcs文件和烧写mcs文件到QSPI Flash
下面将生成烧写到QSPI里面的mcs文件和烧写的步骤。
2.1 生成mcs文件
单击‘app_cpu1’,选择Xilinx Tools –> Create zynq boot image,选择Add,选择文件…/app_cp0/Debug/ app_cpu0.elf,点击打开。然后选择app_cpu0.elf,点击UP。把文件app_cpu0.elf移动到app_cpu1.elf上面。然后在Output pach后面把boot.bin修改为Boot.mcs。然后点击 Create Image。如下图7所示:
图7
2.2 烧写Boot.mcs到QSPI Flash
选择Xilinx Tools –> Program Flash,在Image File后面选择刚才生成的Boot.mcs文件,Offset为0x0,Flash Type为qsip_single。勾选Blank check after erase和Verify after flash。检查开发板上电和连线状况,然后点击Program。如下图8所示:
图8
基于ZYNQ的双核启动与通信问题解决的更多相关文章
- 基于Zynq平台的EtherCAT主站方案实现
作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在 ...
- JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信
阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...
- 基于ZYNQ的SOC——Hellow_World实验
ZYNQ是一款SOC芯片,之前使用VGA做过的实验只是PL(Programmable Logic)部分,而ZYNQ最突出的功能,就是内部的双核Cortex-A9,所以从现在开始我将学习ZYNQ的SOC ...
- 基于NIOS II的双端口CAN通信回环测试
基于NIOS II的双端口CAN通信回环测试 小梅哥编写,未经授权,严禁用于任何商业用途 说明:本稿件为初稿,如果大家在使用的过程中有什么疑问或者补充,或者需要本文中所述工程源文件,欢迎以邮件形式发送 ...
- CH02基于ZYNQ的嵌入式LINUX移植
CH02基于ZYNQ的嵌入式LINUX移植 1.1概述 实验环境: Windows 10 专业版 Vmware workstation 14.1.1 Ubuntu 16.04.3 Xilinx SDx ...
- [原创]基于Zynq PS与PL之间寄存器映射 Standalone & Linux 例程
基于Zynq PS与PL之间寄存器映射 Standalone & Linux 例程 待添加完善中
- [原创]基于Zynq AXI-Bram Standalone & Linux 例程
基于Zynq AXI-Bram Standalone & Linux 例程 待添加完善中
- [原创]基于Zynq AXI-GPIO Standalone & Linux 例程
基于Zynq AXI-GPIO Standalone & Linux 例程 待添加完善中
- [方案]基于Zynq WiFi方案构建
基于Zynq系列,搭建无线传输平台 1) 2.4G 2) 5G AC
随机推荐
- NetSec2019 20165327 exp1+ 逆向进阶
NetSec2019 20165327 exp1+ 一.实验内容介绍 第一个实践是在非常简单的一个预设条件下完成的: (1)关闭堆栈保护 (2)关闭堆栈执行保护 (3)关闭地址随机化 (4)在x32环 ...
- python-css基础知识
CSS 是指层叠样式表 (Cascading Style Sheets),样式定义如何显示html,用于对页面进行美化. css样式的存放位置有三种: 第一种,直接写在html标签里: <div ...
- springboot返回页面
1.使用@Controller注解: @Controller必须配合模板 先导入依赖: <dependency> <groupId>org.springframework.bo ...
- java操作svn工具类SvnUtil
直接上代码,工作中使用的版本,记录下. public class SvnUtil { private static Logger logger = Logger.getLogger(SvnUtil.c ...
- Apache Spark 3.0 将内置支持 GPU 调度
如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU.FPGA 或 TPU 来加速计算.在 Apache Hadoop 3.1 版本里面 ...
- 关于在UNIcode环境下得TCHAR转string类型以及string转TCHAR
using namespace System::Text: String ^TCHARtoStr(TCHAR *temp) //TCHAR转String { array<unsigned cha ...
- golang开源项目qor快速搭建网站qor-example运行实践
最近想找几个基于Go语言开发的简单的开源项目学习下,分享给大家,github上有心人的收集的awesome-go项目集锦:github地址 发现一个Qor项目: Qor 是基于 Golang 开发的的 ...
- unity 中UGUI制作滚动条视图效果(按钮)
1.在unity中创建一个Image作为滚动条视图的背景: 2.在Image下创建一个空物体,在空物体下创建unity自带的Scroll View组件: 3.对滑动条视图的子物体进行调整: 4.添加滚 ...
- javaScript简单的留言板
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- win10系统开机输入密码黑屏解决方法
方法一: 第一步:首先打开笔记本电脑开机,输入开机密码进入 第二步:输入密码后显示黑屏,按"Ctrl+Alt+Del"组合键打开任务管理器 第三步:在打开的任务管理器中,点击&qu ...