得益于A9的双核异构架构,我们可以在双核上进行AMP、SMP、以及BMP三种运行模式的软件开发。本次是笔记简单概要AMP的玩法。
Xilinx的SDK提供的标准的AMP是基于FreeRTOS的OpenAMP,我们这里需要的是基于ThreadX的AMP.
- 创建CPU0_APP
我们直接通过New->Application Project:创建一个在内核0上运行的APP:需要注意的是选择的Processor为内核0.
图 1
我在CPU0中创建了一个按键,通过连接在PS上的按键KEY_PS控制连接在PL上的4个LED,其中,按下KEY_PS产生一个上升沿中断,在中断中修改按键按下状态标志,主函数中根据按键状态标志依次修改4个LED状态。
因为我们是创建两个APP,他们公用同一块DDR,我们通过修改lsscript.ld
文件中的APPx的起始地址和长度,达到分离两个APP的目的。
CPU0_APP lsscript.ld
- 创建CPU1_APP
相同道理,我们创建运行在内核1上的APP,但是要注意我们的处理器的选择:
图 3
图 4
和之前创建threadx_demo的道理一样,我们先创建一个helloworld,分别编译并运行CPU0 与CPU1的helloworld,没有问题在做修改。
在CPU1_APP没有问题后,我们在右键CPU1_APP_bsp->Board Support Package Settings-> Overview->drivers->ps7_cortexa9_1中增加-DUSE_AMP=1参数。这是运行AMP所必需的,详情请见 ug1186。
此时我们将上一次移植在threadx_demo中的程序移植到CPU1_APP中,注意包含头文件、库以及库所在位置。
这是我们为了同时运行CPU0_APP与CPU1_APP,我们在debug configuration中的Application中设置同时Download CPU0_APP与CPU1_APP,这样就可以同时运行了。
我们Debug界面分别点击两个内核到运行状态:
- 修改CPU1_APP_bsp 以及初始化代码
你会发你的CPU0_APP有可能运行不正常,而CPU1_APP运行一定不正常。
通过查看CPU1_APP的代码看,我们看到在初始化的hardware_setup()中设置了TTC SetupTimer()作为系统定时器中断,我们在运行双核APP时候,要注意的一点是要映射指定中断到指定的CPU内核,我们只需要在SetupTimer()的XScuGic_Connect()函数后添加XScuGic_InterruptMaptoCpu(&Gic0, 0x01, TTC_INTR_ID)即可,这时我们重新运行CPU0_APP与CPU1_APP,发现两个APP运行都正常了。
图 8
这时候再次烧录到片中,就可以发现按键按下4个LED依次变化,CPU1 demo也在正常打印输出。
.后面就可以愉快的进行AMP的开发了无论是通过第三方的OpenAMP还是通过共享内存等等机制,可以让两个核进行数据交互,CPU0_APP不限于裸机,也可以运行Linux。可以让工程做到同时兼顾复杂的Linux应用拓展性与是实时性。
文中的CPU0_APP & CPU1_APP如果有需要的做验证测试的可以留言贴出来。
关于AMP的RTOS+Linux可以参考:
ZYNQ双核通信 Linux+FreeRTOS