(1条消息) zynq开发学习记录:Linux与rt
Linux + RT-Thread
1.U-boot、Linux设备树修改
memory {
device_type = "memory";
reg = <0x0 0x30000000>;
};/*修改CPU0地址空间范围*/
2.Linux内核启动参数,修改设置为SMP,CPU个数为1
bootargs "console=ttyPS0,115200 maxcpus=1 root=/dev/ram rw earlyprintk "
3.编译u-boot、内核
4.修改RT-thread相关文件
- github下载RT-thread最新的4.0.0内核源码
- github下载RT-thread env工具
- 修改bsp/zynq7000/ drivers /uart.c
//INIT_BOARD_EXPORT(rt_hw_uart_init);
- 修改bsp/zynq7000/drivers/board.h
#define HEAP_END (void*)(0x40000000)
- 修改bsp/zynq7000/drivers/board.c
void rt_hw_board_init()
{
rt_components_board_init();
// rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
}
修改bsp/zynq7000/applications/application.c
添加线程代码,周期控制测试Led闪烁:
static void rt_led_thread_entry(void *parameter)
{
/* do component initialization */
unsigned char uc = 1;
while(1)
{
*( (unsigned int *) 0x43c00000 ) = uc;
uc = ~uc;
rt_thread_delay(1000);
}
/* add your initialization here */
}
int rt_application_init()
{
rt_thread_t tid;
tid = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048,
RT_THREAD_PRIORITY_MAX/3, 20);
if (tid != RT_NULL)
rt_thread_startup(tid);
tid = rt_thread_create("led", rt_led_thread_entry, RT_NULL, 2048,
RT_THREAD_PRIORITY_MAX/3, 20);
if (tid != RT_NULL)
rt_thread_startup(tid);
return 0;
}
修改bsp/zynq7000/rtconfig.h 注释有关shell、msh、finish、serial以及console相关的宏定义
修改bsp/zynq7000/zynq7000.ld 链接地址修改为. = 0x30000000;
修改libcpu/arm/zynq7000/mmu.c
/* set page table */
/* no access to the memory below .text */
/* 128M cached DDR memory */
rt_hw_mmu_setmtt((rt_uint32_t)&__text_start, 0x40000000-1,
0x30000000, RW_CB);
编译RT-thread
运行env工具,cd bsp/zynq7000
scons 编译生成rtthread-zynq7000.elf文件
创建BOOT.bin运行
利用SDK创建BOOT.bin文件,文件顺序为fsbl.elf、zynq.bit(FPGA工程师提供)、u-boot.elf以及rtthread-zynq7000.elf。
将生成的BOOT.bin放进SD卡,启动模式修改为Sd启动。
上电后可以观察到:
CPU0 终端串口上 Linux启动正常
CPU1 测试LED一直在闪烁
赞 (0)