第7章 嵌入式uClinux及其应用开发(2)
7.3.2 uClinux针对硬件的改动
目前,uClinux已被成功移植到S3C4510B及其他多款ARM芯片上,但由于嵌入式操作系统的运行是与嵌入式系统的硬件密切相关的,而硬件的设计则会因为使用场合的不同而千差万别,因此,在uClinux内核源代码中和硬件紧密相关的部分就应该针对特定的硬件作出适当的修改,由于uClinux内核源代码包含很大一部分的硬件驱动程序,不可能一一列举,在此,就基于S3C4510B的最小系统的设计与运行相关的部分作简单的介绍,希望对读者有所启发。
uClinux内核源代码中对S3C4510B片内特殊功能寄存器以及其他相关硬件信息的定义位于uClinux-Samsung\\Linux-2.4.x\\include\\asm-armnommu\\arch-samsung\\hardware.h文件中,其中有几个地方值得注意: /*
* define S3C4510b CPU master clock */
#define MHz
1000000
#define fMCLK_MHz (50 * MHz) #define fMCLK #define MCLK2
(fMCLK_MHz / MHz) (fMCLK_MHz / 2)
以上定义了系统工作的主时钟频率为50MHz,若用户系统的工作频率不同,应在此处修改,若串行口采用内部时钟信号用于波特率生成,该频率同时还与串行通信波特率有关。 /**********************************/ /* System Memory Control Register */ /**********************************/ #define DSR0 #define DSR1 #define DSR2 #define DSR3
(2<<0) (0<<2) (0<<4) (0<<6)
/* ROM Bank0 */
/* 0: Disable, 1: Byte, 2: Half-Word, 3: Word */
#define DSR4 #define DSR5 #define DSD0 #define DSD1 #define DSD2 #define DSD3 #define DSX0 #define DSX1 #define DSX2 #define DSX3
(0<<8) (0<<10)
(2<<12) /* RAM Bank0 */ (0<<14) (0<<16) (0<<18) (0<<20) (0<<22) (0<<24) (0<<26)
/* EXTIO0 */
#define rEXTDBWTH (DSR0|DSR1|DSR2|DSR3|DSR4|DSR5 | DSD0|DSD1|DSD2|DSD3 | DSX0|DSX1|DSX2|DSX3)
以上定义了系统存储器控制寄存器,按照以上定义,ROM/SRAM/FLASH Bank0定义为16位数据宽度(事实上,ROM/SRAM/FLASH Bank0的数据宽度由B0SIZE[1:0]的状态决定),而
ROM/SRAM/FLASH Bank1~ROM/SRAM/FLASH Bank5禁用;DRAM/SDRAM Bank0定义为16位数据宽度,DRAM/SDRAM Bank1~DRAM/SDRAM Bank3禁用;外部I/O组全部禁用;若用户系统的存储器系统配置不同,应在此处修改。
之后还做了其他一些改动,包括对ROM/SRAM/FLASH Bank0控制寄存器的设置,Flash容量的设置,DRAM/SDRAM Bank0控制寄存器的设置,SDRAM容量的设置等,这些设置均应该与用户系统对应。
7.3.3 编译uClinux内核
作为操作系统的核心,uClinux内核负责管理系统的进程、内存、设备驱动程序、文件系统和网络系统,决定着系统的各种性能。uClinux内核的源代码是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用,因此,在广大编程人员的支持下,uClinux的内核版本不断更新,新的内核修改了旧的内核的缺陷,并增加了许多新的特性,用户如果想在自己的系统中使用这些新的特性,或想根据自己的系统量身定制更高效、更稳定可靠的内核,就需要重新编译内核。一般说来,更新的内核版本会支持更多的硬件,具有更好的进程管理能力,运行速度会更快、更稳定,并且一般都会修复旧版本中已发现的缺陷等,因此,经常选择升级更新的系统内核是必要的。
uClinux内核采用模块化的组织结构,通过增减内核模块的方式来增减系统
的功能,因此,正确合理的设置内核的功能模块,从而只编译系统所需功能的代码,会对系统的运行进行如下几个方面的优化:
— 用户根据自身硬件系统的实际情况定制编译的内核因为具有
更少的代码,一般会获得更高的运行速度。 — 由于内核代码在系统运行时会常驻内存,因此,更短小的内核
会获得更多的用户内存空间。 — 减少内核中不必要的功能模块,可以减少系统的漏洞,从而增
加系统的稳定性和安全性。 uClinux的内核源代码可以从许多网站上免费下载,内核的发布一般有两种形式,一种是完整的内核版本,完整的内核版本一般是.tar.gz文件,使用时需要解压。另一种是通过对旧的版本发布补丁(patch),达到升级的效果。
本例所采用的在Linux下使用的交叉编译器和uClinux-Samsung-20020318.tar.gz源码均来自网站http://mac.os.nctu.edu.tw/。
在准备好uClinux的内核源代码后,利用交叉编译器就可以编译生成运行在硬件目标板上的uClinux内核。
从http://mac.os.nctu.edu.tw/上下载uClinux内核源代码
uClinux-Samsung-20020318.tar.gz,保存到宿主机的用户目录。运行解压命令:
tar xzvf uClinux-Samsung-250020318.tar.gz
解压完毕后,就会在用户目录下生成uClinux-Samsung目录,以下命令进入到该目录中:
$ cd uClinux-Samsung 1. 键入命令: make menuconfig
内核配置。该命令执行完毕后生成文件.config,它保存这个配置信息。下一次再做make menuconfig的时候将产生新的.config文件,原来的.config被改名为.config.old。
此时会出现菜单配置对话框,要求进行目标平台的选择,如图7.6所示,输入回车后,出现供选择的具体的供应商和产品列表,在这里我们选择:Samsung/4510B,如图7.7所示,在库的选择上,我们选择uC-libc,其他
选项暂时不用修改,保存好设置后,存盘退出。
图7.6 目标平台配置
图7.7 选择合适的产品类型
2.键入命令:make dep
该命令用于寻找依存关系。 3. 键入命令:make clean
该命令清除以前构造内核时生成的所有目标文件,模块文件和一些临时文件。
1. 键入命令:make lib_only 该命令编译库文件。
2. 键入命令:make user_only 该命令编译用户应用程序文件。 3. 键入命令:make romfs 该命令生成romfs文件系统。 4. 键入命令:make image
注意做到这一步的时候可能会出现错误的信息提示,类似于: arm-elf-objcopy: /home/nie/uClinux-Samsung/linux-2.4.x/linux: No such file or directory make[1]: *** [image] Error 1
make[1]: Leaving directory
`/home/nie/uClinux-Samsung/vendors/Samsung/4510B' make: *** [image] Error 2
这是因为第一次编译时还没有romfs.o,所以出错,等romfs.o编译好了以后,如果再进行内核的编译,就不会出现这个错误信息了。它完全不影响内核的编译,可以完全不必理会这个错误信息。继续进行编译工作。
5. 键入命令:make
通过各个目录的Makefile文件进行,会在各目录下生成一大堆目标文件。
上述步骤完成后,就完成了对uClinux源码的编译工作。整个编译过程视计算机运行速度而定,大约需要十几分钟左右。