ZYNQ AMP模式 双裸核CPU同时运行

从软件的角度来看,多核处理器的运行模式有三种:
AMP(非对称多进程):多个核心相对独立的运行不同的任务,每个核心可能运行不同的操作系统或裸机程序,但是有一个主要核心,用来控制整个系统以及其它从核心
SMP(对称多进程):一个操作系统同等的管理各个内核,例如PC机
BMP(受约束多进程):与SMP类似,但开发者可以指定将某个任务仅在某个指定内核上执行
默认情况下,ZYNQ仅运行一个CPU,这里主要研究AMP模式下,两个CPU同时运行

1. 硬件平台搭建

参照“ZYNQ Vivado环境实现Helloworld”的Vivado部分,但有部分不同。

ZYNQ Vivado环境实现Helloworld”中ZYNQ系统的配置部分“未启用DDR”,本次需要“启用DDR”


导出至SDK

2. SDK

2.1 创建CPU0工程

创建普通的helloworld工程

修改helloworld.c主函数

// 包含头文件
#include "sleep.h"

int main()
{
    init_platform();

    print("CPU0 : Hello World\n\r");
    for(int i = 0; i < 10; i++)
    {
    	printf("CPU0 : Hello World: %d\r\n", i);
        sleep(2);
    }
    printf("CPU0 : end\r\n");

    cleanup_platform();
    return 0;
}

2.2 创建CPU1工程

创建普通的helloworld工程,选择CPU1

修改helloworld.c主函数

// 包含头文件
#include "sleep.h"

int main()
{
    //init_platform();
    sleep(3);

    print("CPU1 : Hello World\r\n");
    for(int i = 0; i < 10; i++)
    {
    	printf("CPU1 : Hello World: %d\r\n", i);
        sleep(3);
    }
    printf("CPU1 : end\r\n");

    cleanup_platform();
    return 0;
}

2.3 CPU1的BSP SETTING中添加” -DUSE_AMP=1 “

在CPU1的bsp目录上,右键,选择“Board Support Package Settings”

2.4 DDR空间分配

每个CPU的APP项目的src目录中按照自己预想的存储器分配方案修改lscript.ld文件中的内容,千万注意不要让两个CPU的DDR地址重合,因为你APP的ELF文件是加载到DDR中执行的。由于没有OS,ELF肯定是加载到每个CPU的DDR起始地址。如果有重合那么一个CPU的ELF会覆盖另一个的。

CPU0

CPU1

2.5 CPU0启动CPU1

一般情况下程序运行只会启动CPU0,需要使用CPU0启动CPU1
在CPU0的helloworld.c文件中添加函数

#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x20000000
void StartCpu1(void)
{
    Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
    dmb(); //waits until write has finished
    sev();
    
    printf("CPU0 启动 CPU1\r\n");
}

并在主函数中调用StartCpu1();

2.6 运行调试

保存CPU0、CPU1工程,编译,运行

2.7 串口打印结果


 

 

 

ZYNQ AMP模式 双裸核CPU同时运行》有2个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注