回答

收藏

领航者ZYNQ开发板试用6:Cortex-A9双核通信实验

FPGA/DSP FPGA/DSP 3285 人阅读 | 0 人回复 | 2020-02-28


领航者ZYNQ开发板的核心板使用的XC7Z010芯片包含两个ARM Cortex-A9处理器,这两个处理器是一种非对称多核处理器(asymmetricalmulti-core processors,AMP)的关系,CPU0是主处理器,控制系统运行和资源分配,CPU1是从处理器,执行主CPU 的命令或者预定义的任务,两个处理器有共同的存储器和外设,可以同时运行自己的操作系统或者裸机应用程序。下面实验拟把两个ARM运行起来,并通过共享内容进行双核之间的通信,共同控制一个串口外设打印输出结果,具体步骤如下:

1、我们在hell_world工程基础上修改,先解压【正点原子】领航者 ZYNQ开发板光盘资料\领航者ZYNQ开发板资料盘(A盘)\4_SourceCode\ZYNQ_7010\2_Embedded_System.rar压缩包内的hell_world工程到工作区,如:D:\workspace

2、删除工程目录下的hello_world.sdk目录,后面我们重新写测试程序,不再需要原来工程的程序。
3、用vavido2018.3打开工程,然后配置ZYNQ IP增加SD卡外设,我们需要先把双核程序固化到SD卡,上电后自行启动两个CPU的程序,配置界面如下图示:

另外还需要点左侧MIO Configuration把Bank1 I/O Voltage从LVCMOS 3.3V修改为LVCMOS 1.8V后点OK结束配置,然后在Source窗口中右键点击 Block Design设计文件system.bd 执行Create HDL Wrapper...和Generate Output Products, 完成后在菜单栏中选择File->Export-> Export hardware重新导出硬件,在弹出的对话框中不需要勾选Includebitstream。
4、在菜单栏中选择File-> Launch SDK打开SDK软件,在SDK软件菜单栏中选择File-> New-> ApplicationProject, 在弹出的New Project对话框Projectname填FSBL,其它为默认值,按Next后选择模板(Templates)为Zynq FSBL后按Finish生成FSBL工程和FSBL_bsp包。
5、和第4步类似,新建一个名为app0的应用工程,Board Support Package选择Use existing FSBL_bsp,按Next后选择模板(Templates)为hellowold后按Finish完成工程;打开app0/src/lscript.ld文件,把ps7_ddr_0的Size修改为0x1FF00000后保存,如下图示:



打开app0/src/helloworld.c文件,把其代码修改为:
#include<stdio.h>
#include"platform.h"
#include"xil_printf.h"
#include"sleep.h"
#include"xil_io.h"


#define CPU1_START_UP_REG 0xFFFFFFF0
#define CPU1STARTADR      0x20000000
#define COMM_VAL (* (volatileunsignedshort*)(0xFFFF0000))


intmain()
{
    unsignedshorti;
    init_platform();

    print("Zynq dual core communication test\n\r");


    Xil_SetTlbAttributes(0xFFFF0000,0x14de2);  
   COMM_VAL = 0;
   Xil_Out32(CPU1_START_UP_REG,CPU1STARTADR);
    dmb();//waits until write has finished
    print("CPU0:sending the SEV to wake up CPU1\n\r");
    __asm__("sev");
   dmb();


   srand(1);
   while(1){
     i = rand()%256;
     xil_printf("CPU0 write data: %d\n\r",i);
     COMM_VAL = 0x8000 + i;
     sleep(5); //delay 5s
     while(COMM_VAL!=0);
   }


cleanup_platform();
return 0;
}


最后按ctrl + s保存后自动进行编译。
6、同上一步新建一个名为app1的应用工程,Processor选择ps7_cortexa9_1,Board Support Package选择Create New app1_bsp,如下图示:



按Next后选择模板(Templates)为hellowold后按Finish完成工程;打开app1/src/lscript.ld文件,把ps7_ddr_0的Base Address修改为0x20000000, Size修改为0xFF00000后保存,再打开app1/src/helloworld.c文件,把其代码修改为:


#include<stdio.h>
#include"platform.h"
#include"xil_printf.h"
#include"sleep.h"
#include"xil_io.h"


#define COMM_VAL (* (volatileunsignedshort*)(0xFFFF0000))


intmain()
{
    unsignedshorti;
    init_platform();


    Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
    while(1){
        while(COMM_VAL==0);
        i = COMM_VAL & 0xff;
        xil_printf("CPU1 get data:   %d\n\r", i);
       COMM_VAL = 0;
       sleep(5); //delay 5s
   }


cleanup_platform();
return 0;
}
7、双击打开app1_bsp/system.mss文件,点击Modify this BSP‘s Settings, 在弹出对话框中将drivers下的ps7_cortexa9_1中-g后添加-DUSE_AMP=1,如下图示:



点OK后自动进行编译。
8、至此两个CPU的程序工程已经编译OK, 点击选择SDK软件左侧的FSBL工程,然后在SDK软件菜单栏中选择Xilinx->Create Boot Image, 在弹出对话框中默认bootloader已经加入,点右侧的Add增加CPU0和CPU1的程序后按Create Image,如下图示:

9、把生成的1_hello_world\hello_world.sdk\FSBL\bootimage目录下BOOT.bin文件拷贝到一个SD卡(根目录)上,然后把开发板的启动模式开关BOOT_CFG的两个开关均拨到OFF位置,设置为从SD卡启动,插好SD卡和串口线后给开发板上电可以看到CPU0生成一个随机数写到共享内容,然后CPU1从共享内容读出这个数,从打印结果看到读写的数值完全一致,具体操作和测试结果如下视频所示:






分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条