领航者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从共享内容读出这个数,从打印结果看到读写的数值完全一致,具体操作和测试结果如下视频所示:
|