在上一篇博客中,咱们现已将Zynq SoC发动并运转起来,在AMP(非对称多进程处理)形式下运用了两个ARM Cortex-A9 MPCore处理器,但是由于上一篇博客现已适当长了,我没有具体的介绍软件方面的工程细节。
其实 在两个处理器上运转的软件工程也十分的简略。这儿我将为你们展现经过OCM(片上存储器材)完结Zynq SoC的两个处理器之间的通讯。但是,现在的软件工程十分的简略,因而咱们可以从这个根底工程开端,持续完善。
上星期咱们完结的比如中的软件工程首要完结以下几个使命:
Core 0 是主设备,它可以激活Core 1。它也利用了片上的UART串口以固定的推迟向一个终端输出打印信息。这个推迟不适用守时计数器等,虽然在这儿运用私有的守时计数器很简略,我将在后边的博客中介绍一起运用两个私有的守时计数器。
一旦Core 0 发动起来,Core 1初始化它的私有资源,输出切换信号,操控坐落MicroZed I/O扩展板上的八个LED灯亮灭,这儿咱们需求运用Core 1私有的守时计数器和经过GIC使能中止,完结以上功用。
这些运用程序之间是没有联络的,它们并不共享资源。但是,接下来咱们想让这些运用程序之间可以通讯,共享资源。
运转在 Core 0上的运用程序是十分简略的。它首要完结的是激活运转在Core 1上的运用程序,然后在一个无限循环中经过UART 0输出打印出一段简略的信息。
但是,咱们方案运用Core 1的中止操控器,所以第一步咱们有必要装备G%&&&&&%(通用中止操控器),将下图所示的代码加入到Core 0的运用程序的源代码文件中:
Core 1的运用程序代码可能要愈加杂乱一些,由于咱们要在Zynq SoC的PL(可编程逻辑)部分调用GPIO模块,用于驱动操控MicroZed I/O扩展板上的LED灯。同赛灵思其他的接口相同,standalone OS运用一句 #include “xgpio.h”代码就供给了gpio接口的驱动信息,这个文件与咱们之前驱动PS部分的MIO/EMIO GPIO接口所运用的xgpio_ps.h文件有一些小的不同,在这个例程中我想为咱们展现如安在Zynq SoC的PL部分运用GPIO接口。
为了保证咱们可以看出LED灯的亮灭状况的切换,咱们将运用Core 1私有的守时器,这与咱们之前运用Core 0守时器是相同的。
在 Core 1的程序开端履行它的主程序之前,咱们需求制止片上存储(OCM)的缓存功用,初始化GPIO接口,初始化私有的守时器,和装备中止操控器,这样私有的守时器中止才可以被用来操控LED灯亮灭状况的切换。咱们将运用Zynq SoC运用程序和制止缓存的反常机制完结这些功用。
现在咱们可以开端编写适当简略的中止服务程序,当私有的守时器计时完毕然后从头计不时,这些中止服务程序就可以操控LED灯的亮灭。这个处理进程会一向进行,我挑选运用十六进制的AA和55替换改变赋值给LED灯,操控LED灯的亮灭状况。这个挑选将会是一切的LED灯“活动起来”,与一切LED灯的全亮或许全灭状况是有一些差异的。
下图是程序履行的成果,经过Core 0输出到终端对话框窗口: