双核AMP

AMP:多核处理器运行方式。

通信:两个CPU之间的通信

双核AMP

 

 双核AMP

 

 ARM+DSP 或者ARM+FPGA  FPGA就可以起到硬件加速功能

 

ZYNQ也算异构多核,尽管两个C9处理器完全相同,但是因为有FPGA,所以整体上可以说是异构多核的

 

双核AMP

 

双核AMP

 

 以ZYNQ为例。

DDR3内存时两个CPU共用的 ,注意分配时不能重合

 

XAPP1079

 

双核AMP

 

 CPU1需要CPU0来启动,CPU0里面需要一段代码来启动CPU1;

 

注意避免2个CPU同时访问共享外设

双核AMP

 

 CPU0,1私有的资源  共享的资源

 

双核AMP

 

两个CPU通过OCM进行通信,与用DDR通信相比,优势:COM提供高性能低延迟的访问,DDR有延迟,数据量小用OCM效率高。数据量比较大时,OCM只有256KB,就要用到DDR了 

需要一个机制防止同时访问

双核AMP

 

 L2 cache 给CPU0 用, CPU1不用

双核AMP

 

FSBL在CPU0上运行 

双核AMP

 

 裸机应用程序,这个参考设计是两个CPU各自运行独自的裸机程序,CPU0负责初始化共享外设,并且负责启动CPU1

双核AMP

 

 CPU0应用程序内存起始地址0X00100000。可以在链接脚本进行修改(LINKER SCRIPT)

CPU0应用程序:1。先配置MMU禁止cache缓存。2.初始化ICD.  3.启动CPU1  4.用串口打印信息  5.设置OCM的地址来作为信号量  6.等待这个地址里的信号量被清除双核AMP

 

 这个地址里的内容即是CPU1所跳转到的地址

CPU0启动CPU1是通过超这个地址里写0X00200000,然后CPU0运行set event(SEV)之后,CPU1就会被唤醒CPU1会去把这个地址里的内容读出来,然后CPU1就会跳转到0X00200000的地址,然后开始执行应用代码。0X00200000是前面在划分的时候CPU1的起始地址。

 

双核AMP

 

 双核与单核的区别就是CPU0来启动CPU1

CPU0启动CPU1是对于我们固化程序板子上电需要去做的这样一个步骤,如果通过JTAG直接下载的话,可以不用CPU0启动CPU1,因为用JTAG下载是直接下载到对应的那个地址并且启动的。

只有在固化的时候才需要加上CPU0启动CPU1

 

 

双核AMP

 

 类似于宏定义 -D=define  use amp=1

 

 

通过软件中断方式避免两个CPU同时访问OCM

 

双核AMP

 

双核AMP

 

 

 双核AMP

 

这里的DEFINE与文件里的DEFINE 区别,这个是全局有效,其他的文件里也有效。 

 

 

 

 

 

 第二个禁用cache不写也行,第一个的地址里面已经包含了。如果选用的共享地址不是 0XFFFF0000, 比如OCM的或者DDR3的共享地址就需要加上这句

 

 

CPU0_UART

双核AMP

 

 

双核AMP

 

 双核AMP

 

 

双核AMP

 

 通过  XIL_OUT32()语句 朝 CPU1_COPY_ADDR里面写入CPU1_START_ADDR 来启动CPU1

直接JTAG下载的话,CPU1不用唤醒就能直接用

双核AMP

 

 

 

CPU1

双核AMP

 

50 freq_gear;  //频率档位

 双核AMP

 

 双核AMP

 

 

双核AMP

 

 

 

 

固化顺序

双核AMP

 

先是fsbl,然后是bit流,然后是第一个程序,最后是第二个程序。顺序不能错 

 

上一篇:记一次 turbostat 的使用


下一篇:CPU飙升问题排查