zynq双核AMP实验之cpu1唤醒代码

一·多核CPU的运行模式
    从软件的角度看,多核处理器的运行模式有 AMP(非对称多处理)、SMP(对称多处理)和 BMP(受约束多处理)三种运行模式。
    AMP 运行模式指多个内核相对独立的运行不同的任务,每个内核相互隔离,可以运行不同的操作系统(OS)或裸机应用程序。
    SMP 运行模式指多个处理器运行一个操作系统,这个操作系统同等的管理多个内核,如 PC 电脑。
    BMP 运行模式与 SMP 类似,但开发者可以指定将某个任务仅在某个指定内核上执行。
    
二.唤醒CPU1
    zynq中有两个Cortex-A9核,上电启动后,如果不经过配置,代码都是CPU0上执行,并且CPU1同时执行一个等待的命令。如果要在两个核上运行代码,需要人为进行配置。很简单,只要在cpu0中的main函数中执行下面的startcpu1函数。

#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x2000000
#define sev() asm(“sev”)
void StartCpu1(void)
{
Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
dmb(); //waits until write has finished
sev();
}

上面的代码中CPU1STARTADR表示的是cpu1的开始地址,这个是固定的,由厂家决定的。
    然后CPU1STARTMEM表示的是CPU1程序开始的地址(一般是用户分配给CPU1的DDR内存的基地址的),CPU1STARTMEM是可以根据ddr的地址,看情况给的,也就是由用户设置的,可以改变的。
    Xil_Out32(CPU1STARTADR, CPU1STARTMEM);这个代码表示把CPU1STARTMEM写入地址CPU1STARTADR中去。这样做的目的是:cpu1被唤醒以后,会读取CPU1STARTADR中的值,也就是CPU1STARTMEM,然后跳转到CPU1STARTMEM这个内存地址上去运行应用程序。(提示:Xil_Out32()这个函数被定义在xil_io.h,作用就是把32位的值写入到对应的地址上去。与其对应的还有Xil_In32(),表示从指定的地址读取32的值)。
    sev()就是唤醒CPU1的指令。
三.缓存一致性
    缓存一致性的意思就是多核cpu访问共享内存时,可以不冲突。所以为了防止zynq的两个核访问共享变量的时候不冲突,需要禁用L1 Cache 缓存,让两个处理器直接跟共享内存进行数据交换,防止数据经过缓存导致数据的冲突和不同步。所以要在两个核上main函数上都要加上Xil_SetTlbAttributes(INTPTR Addr, u32 attrib)函数禁用 Cache 缓存,以维护两个 CPU 访问 共享内存 一致性的问题。第一个参数为共享内存的基地址,第二个参数为设置内存的参数,包括是否禁用 Cache 等(第二个参数一般是0x14de2,我暂时不知道为什么,有兴趣的可以去研究一下)。
四.cpu1工程建立
    写CPU1的代码的时候,只要新建一个NEW PROJECT,只要进行下图那样更改
zynq双核AMP实验之cpu1唤醒代码_第1张图片


你可能感兴趣的:(zynq)