原尧燊, 原峰山 , 姜 充
(1.东南大学 自动化学院,南京 210096;2.广州航海学院 信息与通信工程系,广州 510725;3.东南大学 机械工程学院,南京 211189)
嵌入式系统开发中U-boot移植中两个关键参数的配置*
原尧燊1, 原峰山2, 姜 充3
(1.东南大学 自动化学院,南京 210096;2.广州航海学院 信息与通信工程系,广州 510725;
3.东南大学 机械工程学院,南京 211189)
嵌入式系统开发是针对各种特定场合实际应用的,引导程序和操作系统都要针对不同的具体应用予以定制;在系统移植过程中,引导程序U-boot关键参数的配置是至关重要的;论及的参数配置对合适的开发平台选择和基于NAND Flash的程序存储、数据存储有积极意义 。
嵌入式系统;U-boot;参数配置
近几年,ICT技术(Information Communication Technology)被人们广泛地提及,从其内涵看,将电子、通信、网络技术、计算机技术等充分融合是该项技术的最重要的特征,尤其是智能技术、物联网技术、无线网络技术的日益兴起更是将ICT技术的发展及应用推倒了更高的层次。比如在人工智能方面,重庆工商大学计算机科学与信息工程学院的朱超平实现了“基于ARM9处理器的快速人脸检测门禁系统设计[1]”。在物联网应用方面,重庆工商大学重庆市发展信息管理工程技术研究中心的王洪建等以节电节水为目标,建设了“基于物联网技术的能耗监测管理平台[2]”。在无线网络技术应用方面,重庆工商大学计算机科学与信息工程学院的李昔华、代小红实现了“基于无线监控网络的智能输液系统设计”,利用 ZigBee技术实现了输液中心无线传感器网络的组网,解决了安装布线、治疗过程无人值守、护士多点监管等难题,实现了中心监控、移动监测,安全警示与应急处置相结合的综合管理功能,提升了医护人员的工作效率,大大降低了治疗安全风险[3]。所有这些技术的应用都与嵌入式系统的应用密不可分,因为传统的通用计算机越来越不能满足人们专业化应用的需要,嵌入式技术就成为上述各项技术中最重要也是最关键的技术。嵌入式技术的开发过程中的一个重要环节就是引导加载程序Boot Loader的移植,U-boot是嵌入式技术开发中应用最广泛的引导加载程序,将就U-boot移植过程中的两个关键参数设置问题予以讨论。
在嵌入式系统中,以嵌入式Linux系统为例,固化进存储设备的系统及文件体系结构如图1所示,其中Boot loader是引导加载程序,Kernel是操作系统内核,Root file system是根文件系统。从图1中可以看出,引导加载程序占据着最底端的位置,是系统加电后在操作系统内核运行之前首先运行的一小段程序,主要功能是硬件设备的初始化、建立内存空间的映射图、确立系统软硬件环境状态、为调用操作系统内核做好准备,提供一个控制台及一个命令集在操作系统运行前操控硬件设备。U-boot是目前几种比较流行的Boot loader中使用作为广泛的一种,它的主要特点是:开放源代码、支持多种操作系统内核、支持多种处理器系列、有较高的可靠性和稳定性、丰富的设备驱动源码、高度灵活的功能设置、丰富的开发调试文档和强大的网络技术支持等。
图1 固态存储设备系统及文件体系结构空间分布图
可以说,嵌入式系统能否正常运行,很重要的一个方面就是配置好Boot loader,由于U-boot在业界使用有广泛的影响力,本文将重点分析嵌入式系统定制时U-boot关键参数的配置方面的问题,以期对嵌入式系统开发人员有所启发。
跟所有的Boot loader 一样,U-boot 的启动分为stage1和stage2两大部分,依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在stage1中,通常用汇编语言实现,而stage2则通常用C 语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。以基于ARM9的S3C2440芯片为例,过程如下:
stage1,是以汇编语言来写的,对于s3c2440芯片对应到cpu/arm920t/start.s 文件,实现的主要任务是:设置CPU的模式为管理模式;关闭看门狗(Watch dog),屏蔽所有中断;设置CPU的频率;将U-boot代码段和初始化数据段复制到RAM;配置内存区控制寄存器和栈空间;进入C 语言代码部分。
Stage2, 是用C 语言代码来实现引导功能的,在lib/arm/board.c 中的start_armboot 是C 语言开始的函数,也是整个启动代码中C 语言的主函数。这个函数调用一系列的初始化函数然后进入主U-boot命令行,进入命令循环(即整个boot 的工作循环),接受用户从串口输入的命令,然后进行相应的工作,如图2所示[4]。
图2 U-boot第二阶段流程图
从两个阶段的功能和结构来看,它们的综合作用就是为启动操作系统的内核Kernel做好充分的准备,只是分工不同。其中依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在stage1中用汇编语言实现,而stage2用于实现复杂的功能,常用C语言来实现,这样可以有更好的移植性和可读性。
U-boot虽然支持多种CPU,支持的操作系统也很多,但是由于嵌入式系统开发是建立在各种专门化应用场合的基础上的,不同于通用的计算机系统。嵌入式系统引导程序和操作系统都要针对不同的具体应用给与专门的定制,否则不仅硬件和软件资源会使用不合理,而且也容易在运行过程中发生问题。因此,U-boot移植过程中某些关键参数的配置是至关重要的,以下将针对开发过程中常见的两个最重要参数配置予以论述。
公开的U-boot的源代码默认是不针对任何目标平台的,但是在实际开发和使用时,即需要将U-boot移植到一个特定的目标平台时,需要生成针对目标平台的配置文件。U-boot支持的芯片可以在include/configs/下面找到。如果要编译针对s3c2440芯片的U-boot.bin,就需要在U-boot源码根路径下执行[4]:
make smdk2440_config
这样U-boot源码就是针对smdk2440平台了。由于make命令会调用Makefile,与此相关的部分含义如下:
smdk2440_config是U-boot源码根路径下的Makefile的一个目标,相关的代码如下:
“smdk2440_config :unconfig /*负责清理以前的配置信息*/
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2440 samsung s3c24x0
/* MKCONFIG就是源码顶级目录下的mkconfig文件,在执行make smdk2440_config时系统执行mkconfig这个脚本,arm arm920t smdk2440 NULL s3c24x0是传递这个脚本的五个参数。*/
unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp /*清理以前的配置信息的具体内容*/ ”
mkconfig这个脚本程序实际上生成了两个文件,一个是include/config.h,另一个是include/config.mk。在文件config.mk里面则有如下内容:
ARCH=arm
CPU=arm920t
BOARD=smdk2440
VENDOR=NULL
SOC=s3c24x0
上面的代码定义了5个变量,分别是体系结构(arm)、处理器核(arm920t)、目标板(smdk2440)、供应商(NULL)、片上系统(s3c24x0)。也就是说,Makefile会判断include下面有没有config.mk这个文件,如果有就包含这个文件,这就相当于在Makefile里面定义了ARCH、CPU、BOARD、VENDOR和SOC这5个变量。这样U-boot就知道自己是针对哪个目标平台的了。
现在几乎所有的嵌入式开发板上都有Flash,一般的情况下NOR Flash存储容量小,与RAM接口相同,可随机访问,特别是进行读操作的效率非常高,常用于保存程序。而NAND Flash存储量较大,接口基于I/O,并且顺序访问,擦写较快,常用于保存数据。但是实际上,由于NAND Flash性能的提高和价格的降低,基本上厂家所制造的开发板都采用单一的NAND Flash,所以U-boot对NAND Flash的支持是至关重要的。
要想实现U-boot对NAND Flash的支持,需要进行的配置如下:
首先在配置文件include/configs/ smdk2440.h(头文件名随着开发板有所不同)定义宏:
#define CONFIG_COMMANDS (CONFIG_CMD_DFL |
…
CFG_CMD_NAND
…
复合芯棒径向抗剪切、抗压性能较弱[7-10]。卡线器夹嘴靠与导线间的摩擦力正常工作,导线承受较大的径向握紧力。为了评估导线被夹持时其芯棒是否发生损坏,采取芯棒径向耐压试验及仿真来确定芯棒的径向耐压能力。
同时还要定义宏确定NAND基地址、设备数、芯片数等:
#define CFG_NAND_BASE 0 /*定义基地址,但通常在board_nand_init中会重新指定 */
#define CFG_MAX_NAND_DEVICE 1 /*NAND Flash设备数目为1 */
#define NAND _MAX_ CHIPS 1 /*每个NAND Flash设备由1个 NAND Flash芯片组成*/
另外,还要增加在include/s3c2440.h中的数据结构和GetBase_NAND函数[5]:
typedef struct {
s3c2440_REG32 NFCONF;
s3c2440_REG32 NFCONT;
…
)s3c2440_NAND;
static inline s3c2440_NAND * const s3c2440_GetBase_NAND(void)
{
renturn (s3c2440_NAND * const) s3c2440_NAND_BASE;
}
对应的在cpu/arm93t/s3c2440目录下新建一个nand_flash.c文件可以调用board_nand_init函数初始化NAND Flash设备。文件可以仿照s3c2410的在drivers/mtd/nand/s3c2410.c文件写,它就是用于对NAND Flash初始化的。与NAND Flash相关的参数配置完毕才能保证程序存储和数据存储的使用。
U-boot由于在嵌入式行业有着最广泛的认可,开放代码资源也十分丰富,支持的操作系统、CPU、设备驱动等也十分广泛。所以对U-boot的合理配置实际上也是对嵌入式系统本身合理剪裁的重要内容之一。U-boot的源代码是一套非常复杂而又功能强大的体系,在系统移植过程中不可能有过于复杂的代码修改和配置。但是体系也是十分完善的,在实际开发中只要对于开发板和应用有关的关键参数予以合理配置就可以了。主要对U-boot移植过程中两个最重要的使用配置进行了讨论,并成功地应用于嵌入式开发实践中,效果良好。
[1] 朱超平.基于人脸识别的门禁系统设计与实现[J]. 重庆工商大学学报:自然科学版,2011(8):390-393
[2] 王洪建,陈安敏,林 娜,等.基于物联网技术的能耗监测管理平台设计[J].重庆工商大学学报:自然科学版,2013(3):67-73
[3] 李昔华,代小红.基于无线监控网络的智能输液系统设计[J]. 重庆工商大学学报:自然科学版,2013(6):29-33
[4] 韦东山. 嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2013
[5] 杨铸,唐攀. 深入浅出嵌入式底层软件开发[M].北京:航空航天大学出版社,2013
Keywords:embedded systems; U-boot; parameters configuration
Two Key Parameters Configuration of U-boot Transplant in Embedded System Development
YUANYao-shen1,YUANFeng-shan2,JIANGChong3
(1.School of Automation, Southeast University, Nanjing 210096, China; 2.Information and Communication Department, Guangzhou Maritime Institute; Guangzhou 510725,China3.School of Mechanical Engineering, Southeast University, Nanjing 211189,China)
Embedded systems development is used for the practical application in a variety of specific situations. The boot program and the operating system are customized and targeted in different specific applications. The key parameters configuration of U-boot bootloader is crucial to the process of system transplant. It is positively significant for discussed configuration parameters in this paper to choose suitable development board and program memory as well as data storage based on NAND Flash.
1672-058X(2013)10-0073-04
2013-05-03;
2013-05-25.
广州市黄埔区科技计划项目(201253).
原尧燊(1992-),男 ,广东广州人,从事自动化技术研究.
TP391
A
责任编辑:罗泽举
校对田静