一种嵌入式Linux平台的软硬件设计
move.w #0x2700, %sr //关中断
move.l #_vectors, %d0
move.c %d0, %VBR //VBR指向FLASH
move.l #0x10000001, %d0
move.c %d0, %MBAR //SIM单元基地址
0x10000000
move.l #0x20000001, %a0
//SRAM起始地址0x20000000
move.c %a0, %RAMBAR0
//初始化SRAM作为堆栈
move.l #0x20001001, %a7 //设置堆栈指针
……
下面对MCF5272的UART、GPIO以及SIM单元进行初始化。Motorola网站提供了这样的例程(sysinit.c)。需要针对实际情况做必要的修改,主要就实际占用的片选资源CS0~CS7、SDRAM控制寄存器SDCR、SDTR作一些修改以适应目标板。以下的程序片段描述了对SDRAM的初始化。
……
/*初始化CS7 16MB SDRAM */
MCF5272_WR_CS_CSBR7(imm, 0
|MCF5272_CS_BR_BASE(SDRAM_ADDRESS)
|MCF5272_CS_BR_SDRAM
|MCF5272_CS_BR_PS_LINE
|MCF5272_CS_BR_EN);
MCF5272_WR_CS_CSOR7(imm, 0
|MCF5272_CS_OR_MASK_16M
|MCF5272_CS_OR_WS(0x1F));
……
/*初始化SDRAM控制寄存器SDCTR、SDCCR*/
MCF5272_WR_SDRAMC_SDCTR(imm, 0xF539);
MCF5272_WR_SDRAMC_SDCCR(imm, 0x4311);
由于代码在SDRAM中运行的速度比在FLASH中更快,而且在该目标平台中,SDRAM是32位数据总线,而FLASH是16位总线,因此代码在ROM中运行和在RAM中运行的速度有着显著差异。考虑到这些因素,采取将uClinux内核和ROMFS文件系统复制到SDRAM中运行的模式。这虽然会牺牲一些系统的启动速度,并导致一些额外的系统内存开销,但是换来的是系统整体性能的提高,因此是值得的。
uClinux会从内存中的某个位置加载ROMFS作为根文件系统。当ROMFS为RAM驻留时,缺省位置紧接着BSS段(参考drivers/block/blkmem,c)。ROMFS文件系统的二进制映像romfs.img在ROM中的实际存放地址可以根据rom.ld文件计算。由于BSS数据段存放的是未初始化的数据,直到运行时才建立,因此使用m68k-elf-objcopy生成的内核二进制映像文件linux.bin中并无BSS段。Romfs.img的起始地址应该是: ROM代码段结束地址+RAM代码段长度+DATA数据段长度;而复制的目标地址就是BSS段的结束地址,这是一个VMA地址,可以从rom.ld文件中直接获得。
3.3 修改启动脚本
在uClinux完成内核初始化后,由init(void *)内核线程调用/bin/init,然后执行/etc/rc脚本中的命令。可以利用这个脚本完成系统上电后的自动配置,或者运行用户程序。ROMFS文件系统中/etc/rc的源文件是/vendors/Generic/big/etc/rc。
一个典型的rc文件如下所示。它完成以太网的设置并执行用户程序/bin/usrapp。
#设置主机名
hostname uClinux
/bin/expand /etc/ramfs.img /dev/ram0
mount -t proc proc /proc
mount -t ext2 /dev/ram0 /var
ifconfig lo 127.0.0.1
route add -net 127.0.0.0 netmask 255.0.0.0 lo
#配置网卡IP和路由
ifconfig eth0 202.119.45.98
ifconfig eth0 broadcast 202.119.45.255
route add -net 202.119.45.0 eth0
route add default gw 202.119.45.1
#执行用户程序
/bin/usrapp
3.4 内核的配置和编译
需要建立一个交叉编译环境来完成内核和应用程序的编译,生成ROMFS文件系统,并最终形成一个固化文件。www.uclinux.org也提供这样一个工具包。正确安装后,就可以进行编译了。首先进入源代码目录uClinux-dist,执行make xconfig,在弹出的对话框中选择Target Platform Selection,出现图1所示的对话框。
由于直接对M5272C3评估板的代码进行修改,因此目标板选择M5272C3。内核版本号选择2.4,采用uC-libc库。另外选中Customize Kernel Settings以定制需要的内核。在内核配置对话框中,将RAM大小配置为16MB,确认ROMFS为RAM驻留。为了可以直接mount宿主机硬盘以方便调试,还需给内核添加对NFS文件系统的支持。
配置完毕后,在源代码目录执行make dep以及make,就得到了需要的二进制内核映像image.bin,可以直接下载到目标板运行。
参考文献
1 MCF5272 ColdFire Integrated Microprocessor User's Manual, Rev. 1,02/2001
2 Daniel P.Bovet, Marco Cesati. Understanding the Linux Kernel, 1st Edition, October 2000
3 M5272C3 Evaluation Board Schemetic. Rev. 1.2, 2000
- 基于FPGA的DSP设计方法(08-26)
- 电力电子装置控制系统的DSP设计方案(04-08)
- 基于DSP Builder的VGA接口设计(04-10)
- 基于DSP和USB的高速数据采集与处理系统设计(05-01)
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- 基于DSP的嵌入式显微图像处理系统的设计(06-28)