一、工程目标
- CPU0运行Linux系统
- CPU1裸核运行,控制GPIO7连接的LED灯闪烁。
- Linux系统运行在内存的前512MB空间内。
- 裸核运行于内存的后512MB空间内。
二、Linux系统设置
1.由hdf文件生成设备树文件后,将system-top.dts文件中根节点目录下的memory节点的reg属性由<0x0 0x40000000>改为<0x0 0x20000000>。表示Linux系统运行于内存中偏移量0,长度为0x20000000的空间内,如下图所示:
2.在bootargs中添加maxcpus=1,表示使用单核。
三、SDK设置
1.CPU1设置
1.在SDK中新建CPU1工程,如下图所示:
2.在lscript.ld文件中将CPU1的内存空间设为偏移量0x20000000,长度为0x20000000,如下图所示:
3.在CPU1的工程中输入以下程序,控制GPIO7连接的LED闪烁。
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
int main(void)
{
int status;
XGpioPs GpioPs;
XGpioPs_Config* GpioPs_Config;
GpioPs_Config = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
if(GpioPs_Config == NULL)
{
return XST_FAILURE;
}
status = XGpioPs_CfgInitialize(&GpioPs,GpioPs_Config,GpioPs_Config->BaseAddr);
if(status != XST_SUCCESS)
{
return XST_FAILURE;
}
XGpioPs_SetDirectionPin(&GpioPs,7,1);
XGpioPs_SetOutputEnablePin(&GpioPs, 7,1);
while(1)
{
XGpioPs_WritePin(&GpioPs, 7, 1);//点亮MIO的第7位输出1
usleep(500000);//延时
XGpioPs_WritePin(&GpioPs, 7, 0);//熄灭MIO的第7位输出0
usleep(500000);//延时
}
return 0;
}
2.FSBL设置
1.新建FSBL工程如下图所示:
2.在main函数的HandoffAddress = LoadBootImage()程序后添加如下程序用来启动CPU1:
Xil_Out32(0xfffffff0, 0x20000000);
dmb (); //等待内存写入完成(同步)
#define sev() __asm__("sev")
sev (); //通过"SEV"指令唤醒CPU1并跳转至相应的程序
其中0x20000000便是上一步设置的CPU1内存空间起始地址。
3.生成BOOT.BIN
1.将编译生成的u-boot.elf复制到Windows系统下,使用SDK提供的Create Boot Image生成BOOT.BIN。
2.依次添加FSBL.elf,design_1_wrapper.bit,u-boot.elf,CPU1.elf打包生成BOOT.BIN文件。
四、运行测试
1.Linux系统测试
将生成的BOOT.BIN文件复制到SD卡,启动开发板,输入以下命令查看Linux系统使用的CPU核数与内存大小:
cat /proc/cpuinfo
cat /proc/iomem
命令执行结果如下:
可以看到Linux使用了一个CPU,RAM的范围为从0x00000000到0x1FFFFFFF,与上面设置一致,作为对比,下图为使用双核CPU时Linux系统信息:
2.裸核测试
在系统加载完BOOT.BIN文件后,可以看到GPIO7所控制的LED灯在闪烁,说明裸核运行正常。