双CPU工作
建立工程
为双CPU分别建立Board Support Package
Standalone_bsp_cpu0
Standalone_bsp_cpu1
分别在package工程上建立应用工程
Hello_cpu0
Hello_cpu1
双处理器同时在线调试DEBUG
选择配置选项Run >debug Configuration的Device Initialization选项卡的Reset Type选项,将Reset Entire System改为Reset Processor Only。
注:SDK2013.4下,在不烧写PL配置程序下可直接下载程序,cpu0,cpu1按先后顺序在线运行后,不需任何唤醒设置,即可同时运行。
SDK2013.4同时调试。
Help中搜索Multi-Processor,查看多核处理器的调试,如图所示。
Step1:选择配置。
Step2:配置软件。选择处理器,分别勾选各自的下载程序,点击Debug即开始调试。
SDK2014.4同时调试,可能cpu1的运行必须由cpu0**。
在地址分配,或根据程序大小分配:
从应用工程下的lscript.ld文件,更改hello_cpu0与hello_cpu1的DDR地址,其它不变。
cpu0
ps7_ddr_0_S_AXI_BASEADDR base address(0x00100000) size(0x00100000)
cpu1
ps7_ddr_0_S_AXI_BASEADDR base address(0x00200000) size(0x00100000)
Downloading Program -- F:/zynq_work/zynq_test/AXI_project_1/project_1.sdk/hello_cpu1/Debug/hello_cpu1.elf
section, .text: 0x00200000-0x0020170b
section, .init: 0x0020170c-0x00201723
section, .fini: 0x00201724-0x0020173b
在cpu0中添加**程序。
第一步:Disable Cache on OCM
使用函数: Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
第二步:载入CPU1程序的存储地址到CPU1处理器的入口地址:
*(unsigned int*)(0xFFFFFFF0) = (unsigned int) 0x200000;
第三步:cpu0发出唤醒命令,唤醒cpu1
print("CPU0: sending the SEV to wake up CPU1\n\r");
sev();
需要定义:#define sev() __asm__("sev")
在SDK2014.1下在线运行cpu1,然后再在线运行cpu0,同时工作起来。注意顺序不能颠倒,否则不能唤醒cpu1.
同时在线运行:
运行cpu1时,软件run configuration中,需要设置处理器0,否则软件报错不能在线运行。不影响硬件的双CPU同时工作。
实际运行验证
按加密启动方式生成镜像文件。
使用RSA加密镜像。
the_ROM_image:
{
[pskfile]F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\psk.pk1
[sskfile]F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ssk.pk1
[bootloader, authentication=rsa]F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\fsbl_rsa_debug.elf
F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\hello_cpu0.elf
F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\hello_cpu1.elf
}
RSA镜像下载到QSPI:
XMD Console
1. cd F:/zynq_work/zynq_key_test/key_tool/rsa_zedboard/ready_for_download
2. connect arm hw
3. source ps7_init.tcl
4. ps7_init
5. dow u-boot.elf
6. con
7. stop
8. dow -data cpu2_rsa_boot0.bin 0x2000000;0x2000000是DDR中20M的位置,将认证文件下载到DDR的20M(0x2000000)处。
9. con
COM终端
程序已下载到DDR中,通过串口终端对ARM的u-boot进行操作,使DDR中的程序写到QSPI中。
1. sf probe 0 ;获得QSPI的操作对象
2. sf erase 0 0x800000 ;对QSPI从0开始擦除8M的长度。
3. sf write 0x2000000 0x8000 0x600000 ;将DDR的20M开始的,长度为6M(0x600000)的内容写入32K(0x8000)开始的QSPI中,即将认证文件写入QSPI。
重启后,同时正常工作。
工程:Note/zynq_test/SDK2014_CPU2work.rar
FSBL配置
- FSBL启动文件具有通用性,与PL、PS的配置变化没直接关系。
- FSBL如需使启动的文件支持RSA加密,需要添加变量常数:RSA_SUPPORT
Properties>C/C++ Build>Setting>symbols>添加
3. 测试启动时间常数:FSBL_PERF
4. 其它参数配置:查看fsbl.h中的说明
FSBL_DEBUG_GENERAL /* general debug messages */
FSBL_DEBUG_INFO /* More debug information */
DEBUG
RSA_SUPPORT
SDK技巧
SDK软件工程的直接运行:
SDK软件工程可在未下载bit文件的情况下,直接运行软件工程,或仅下载SDK软件程序,也能直接正常运行。
原因: Ps7处理器初始化,从vivado导出hw_platform后,该文件夹生成的ps7_init.tcl文件可以对处理器进行初始化。如果未下载FPGA的bit文件时,在该硬件平台生成的软件可直接运行在处理器上,此时处理器的MIO口的配置,全依赖于ps7_init.tcl文件。此时zynq7在没有bit文件下,完全用作ARM处理器。
ARM处理器的配置情况:查看hw_platform_0/ps7_init.html文件
驱动情况:查看文件bsp/system.mss
SDK_ps7全局计时器的使用
程序:全局时钟头文件xtime_l.c/h
定义:计数器计数频率为内核主频/2
#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ /2),
参考1:FSBL的 FSBL_PERF时间常数设置。
参考2:sleep()函数
函数:
XTime_SetTime(XTime Xtime) 一般不设置。
复位、写时间值到全局时钟计数器寄存器。
多处理器下,任意一处理器使用该函数,将复位所有处理器。
XTime_GetTime(XTime *Xtime) 获取当前时钟计数器值
实例1:秒延时文件sleep.c
#include "sleep.h"
#include "xtime_l.h"
#include "xparameters.h"
int sleep(unsigned int seconds)
{ XTime tEnd, tCur;
XTime_GetTime(&tCur);
tEnd = tCur + ((XTime) seconds) * COUNTS_PER_SECOND;
do { XTime_GetTime(&tCur);
} while (tCur < tEnd);
return 0;
}
实例2:时间测量函数fsbl/main.c
#include "xtime_l.h"
XTime tCur = 0;
XTime_GetTime(&tCur);
XTime tEnd = 0;
FsblMeasurePerfTime(tCur,tEnd);
void FsblMeasurePerfTime (XTime tCur, XTime tEnd)
{ double tDiff = 0.0;
double tPerfSeconds;
XTime_GetTime(&tEnd);
tDiff = (double)tEnd - (double)tCur;
/* * Convert tPerf into Seconds */
tPerfSeconds = tDiff/COUNTS_PER_SECOND;
/* * Convert tPerf into Seconds */
tPerfSeconds = tDiff/COUNTS_PER_SECOND;
printf("%f seconds \r\n",tPerfSeconds);
}
数学库的使用
添加数学库函数:
C/C++ Build>setting>ARM gcc linker>libraries>添加库“m”
头文件中加入<math.h>
封装IP
1. 在工程中添加源程序(add sources),可添加外部IP
(Configurable IP,DSP composite,embedded sub-design)
格式: .xco .xci .mdl .slx .bd
2. 创建IP 轮廓(IP Definition)
选择Tools-->Create And Package New IP。
如需将当前工程封装为IP,选择封装当前工程,点击finish将把整个工程生成对应IP Definition。
如需将其他文件封装为IP,选择程序文件目录,点击finish将在指定的目录建立IP Definition,并自动为IP新建一个工程。
封装IP
在Flow Navigator的Project Manager中选择Package IP。然后可在Package IP中设置IP名,查看使用的文件等,最后点击最后一项的Package IP按钮,将产生封装好的IP。
查看生成的IP
在IP Integrator中创建IP模块文件,bd文件
添加生成的IP文件
双击IP后产生配置说明,该模块中可以定义位宽。
可以定义位宽是因为在verilog程序中定义了常量parameter。
生成IP文件
在.runs\synth_1目录生成黑箱文件(checkpoint file):axi4lite_reg_if_v1_0.dcp
该文件可以作源文件如HDL文件一样添加和使用。
在.srcs\sources_1\bd\z_system\ip\z_system_axi4lite_reg_if_v1_0_0_0目录查找到
IP文件:z_system_axi4lite_reg_if_v1_0_0_0.xci
该目录是新建bd文件后,在z_system.bd中添加生成的IP而产生。