AMP:多核处理器运行方式。
通信:两个CPU之间的通信
ARM+DSP 或者ARM+FPGA FPGA就可以起到硬件加速功能
ZYNQ也算异构多核,尽管两个C9处理器完全相同,但是因为有FPGA,所以整体上可以说是异构多核的
以ZYNQ为例。
DDR3内存时两个CPU共用的 ,注意分配时不能重合
XAPP1079
CPU1需要CPU0来启动,CPU0里面需要一段代码来启动CPU1;
注意避免2个CPU同时访问共享外设
CPU0,1私有的资源 共享的资源
两个CPU通过OCM进行通信,与用DDR通信相比,优势:COM提供高性能低延迟的访问,DDR有延迟,数据量小用OCM效率高。数据量比较大时,OCM只有256KB,就要用到DDR了
需要一个机制防止同时访问
L2 cache 给CPU0 用, CPU1不用
FSBL在CPU0上运行
裸机应用程序,这个参考设计是两个CPU各自运行独自的裸机程序,CPU0负责初始化共享外设,并且负责启动CPU1
CPU0应用程序内存起始地址0X00100000。可以在链接脚本进行修改(LINKER SCRIPT)
CPU0应用程序:1。先配置MMU禁止cache缓存。2.初始化ICD. 3.启动CPU1 4.用串口打印信息 5.设置OCM的地址来作为信号量 6.等待这个地址里的信号量被清除
这个地址里的内容即是CPU1所跳转到的地址
CPU0启动CPU1是通过超这个地址里写0X00200000,然后CPU0运行set event(SEV)之后,CPU1就会被唤醒CPU1会去把这个地址里的内容读出来,然后CPU1就会跳转到0X00200000的地址,然后开始执行应用代码。0X00200000是前面在划分的时候CPU1的起始地址。
双核与单核的区别就是CPU0来启动CPU1
CPU0启动CPU1是对于我们固化程序板子上电需要去做的这样一个步骤,如果通过JTAG直接下载的话,可以不用CPU0启动CPU1,因为用JTAG下载是直接下载到对应的那个地址并且启动的。
只有在固化的时候才需要加上CPU0启动CPU1
类似于宏定义 -D=define use amp=1
通过软件中断方式避免两个CPU同时访问OCM
这里的DEFINE与文件里的DEFINE 区别,这个是全局有效,其他的文件里也有效。
第二个禁用cache不写也行,第一个的地址里面已经包含了。如果选用的共享地址不是 0XFFFF0000, 比如OCM的或者DDR3的共享地址就需要加上这句
CPU0_UART
通过 XIL_OUT32()语句 朝 CPU1_COPY_ADDR里面写入CPU1_START_ADDR 来启动CPU1
直接JTAG下载的话,CPU1不用唤醒就能直接用
CPU1
50 freq_gear; //频率档位
固化顺序
先是fsbl,然后是bit流,然后是第一个程序,最后是第二个程序。顺序不能错