首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

可最大程度地发挥Zynq SoC优势的双重方法-2

可最大程度地发挥Zynq SoC优势的双重方法-2

简单的片上存储器实例
您可使用赛灵思I/O函数访问OCM,以便从所选的存储器地址读取和写入数据。这些函数包含在Xil_IO.h中,可支持在CPU地址空间内存储和访问8位、16位或32位字符型、短整型或整型数据。使用这些函数时,只需知道您希望访问的地址以及想要在此存储的值即可。如果是写操作,方法如下,


使用该技术时要确保两个地址指向片上存储器中的相同位置,尤其是当不同人编写不同内核程序时更应如此,为此更好的方法是使用共同的头文件。该文件将包含针对特定传输的相关操作地址的宏定义,例如:


另一种备选方法是让两个程序都使用指示器来访问存储单元。您可以通过使用宏命令定义指向恒定地址的指示器(一般用C语言)来实现这一点:


此外,您还可以对地址再次进行宏定义,以确保该地址为两个应用程序的共用地址。这种方法无需使用赛灵思I/O库,而是通过指示器实现简单访问。
处理器间的中断
Zynq SoC中的每个内核都有16个软件生成的中断。如上文所提到的,每个内核都能实现自身与另一个内核或两个内核的中断。使用软件中断与使用硬件中断基本相似,区别只在于您如何触发它们。若使用软件中断,正在接收的应用就无需针对更新数据而对目标存储单元进行轮询。
就像使用任何硬件中断时一样,您需要对两个内核中的通用中断控制器进行配置。敬请参阅《赛灵思中国通讯》第87期的“如何在Zynq SoC上使用中断”以了解更多相关信息。
然后,您可以使用xscugic.h中提供的XScuGic_SoftwareIntr函数在正在更新的内核中触发软件中断。该命令将向该指定内核发出一个软件中断,再由该内核进行适当操作:


您必须为内核0和内核1应用对DDR存储器进行正确分段,否则会存在其中一个应用破坏另一个应用的风险。
创建应用
将文件添加到库之后,下个阶段就是生成AMP解决方案的三个重要部分:AMP第一阶段引导载入程序、内核0应用和内核1应用。您必须为每个部分生成一个不同的板支持包(BSP)。
您需要做的第一件事是用SDK创建一个新的FSBL。选择“新建应用项目”,创建一个支持AMP的FSBL项目。这与创建一般FSBL的过程没有什么不同。不过,这次您需要选择“Zynq FSBL for AMP”模板,如图3所示。
完成AMP FSBL创建之后,接下来需要为第一个内核创建应用。一定要选择内核0和您的首选操作系统,并允许其创建自己的BSP,如图4所示。
创建应用之后,您需要正确定义应用在DDR存储器中的位置(应用将从该位置执行)。为此,您需要编辑图5中的链接器脚本,以显示DDR的基地址和大小。这一点很重要,因为如果没有为内核0和内核1应用对DDR存储器进行正确分段,就会存在其中一个应用破坏另一个应用的风险。
完成分段之后,您现在可以编写希望在内核0上执行的应用,因为该内核是AMP系统中的主管。内核0必须启动内核1应用的执行。您需要将图6中的代码段包含在应用中。这段代码禁用片上存储器上的高速缓存,并将内核1程序的起始地址写到一个内核1将会访问的地址。一旦内核0执行Set Event(SEV)命令,内核1便开始执行其程序。


图3 – 为AMP设计选择第一阶段引导载入程序



图4 – 为内核0创建应用和BSP


下一步是为内核1创建BSP。一定要使用修改后的独立OS(standalone_amp,如图7所示),这一点很重要,因为它能防止PS侦测控制单元的重新初始化。就这一点而言,在创建项目时不要像对待内核0那样允许其自动生成BSP。必须确保在CPU选项中选择内核1。
既然您已经为内核1创建了BSP,那么接下来首先需要修改BSP的设置,才能继续创建您想要在内核1上运行的应用。这非常简单,只需要向BSP驱动器部分的配置中添加一个额外的编译器标志:–DUSE_AMP=1。
这一步完成后,您就可以任意为内核1创建应用了。务必选择内核1作为处理器,并使用您刚刚创建的BSP。创建新应用之后,您需要再次在DDR存储器中定义正确的存储单元,而内核1程序将从此处执行。您可按照之前的方法通过编辑内核1应用的链接器脚本来完成设定。与第一个内核一样,在该应用中同样要禁用片上存储器上的高速缓存——该高速缓存可用来在这两个处理器之间进行通信。
将所有组件完美整合
在创建应用和构建项目之后,您现在应已拥有以下组件:
•AMP FSBL ELF;
•内核0 ELF;
•内核1 ELF;
•BIT文件,用来为预期能够实现AMP的Zynq器件定义配置。


图5 – 内核0的DDR位置和大小


使用所提供的工具在Zynq SoC上创建非对称多处理应用可以变得非常简单。


图6 – 通过编码禁用片上存储器上的高速缓存



图7 – 为内核1创建BSP


为了使Zynq SoC从所选的配置存储器中引导,您需要一个.bin文件。要创建该文件,您还需要一个BIF文件。BIF文件规定了应使用哪些文件创建BIN文件以及它们的顺序。不要使用SDK中的“创建Zynq”引导映像,而应使用ISE®设计套件命令提示符和BAT文件(BAT文件是XAPP1079的一部分,位于下载目录design\work\bootgen)。该目录包含一个BIF文件和一个cpu1_bootvec.bin,后者作为修改后的FSBL的一部分,用于阻止其查找和加载更多应用。
要生成BIN文件,您需要将生成的三个ELF文件复制到bootgen目录,并对BIF文件进行编辑以确保其中的ELF名称正确无误(如图8所示)。
现在您可打开一个ISE命令提示符,并导航至bootgen目录。在这里运行createboot.bat。该步骤将创建boot.bin文件(如图9所示)。


图8 – 修改BIF文件



图9 – 创建将在Zynq SoC上运行的boot.bin文件


然后,您可将该文件下载到Zynq SoC上的非易失性存储器中。该器件的引导将使两个内核启动并执行其各自的程序。
使用所提供的工具在Zynq SoC上创建非对称多处理应用可以变得非常简单。使用片上存储器或DDR分区可以很容易地实现两个内核之间的通信。
返回列表