达内LOGO和北京达内网址达内科技培训项目:Java培训 3G培训 Android培训 软件测试培训北京达内服务电话
嵌入式培训
基于AT91SAM9G20构建嵌入式Linux系统
本文中使用的目标平台AT91SAM9G20是Atmel公司使用arm926EJ-S处理器内核开发的一块soc嵌入式微处理器,主频达到400MHz,具有Atmel 先进的外设DMA 和分布式存储器架构,连同6层总线矩阵,可实现存储器、外设和外部接口之间的多重数据同时传送,而无需耗费CPU的时钟周期。与引脚兼容的200 MHz AT91SAM9260相比,AT91SAM9G20提供多达4倍的高速缓存和片上 SRAM 内存,并具有增强的外接 NAND 闪存错误校正功能,以及更大的以太网 FIFO,能够减少传输延迟。其外部总线接口(EBI)的时钟频率为133 MHz,用于片外存储器的高速数据传送。这些特性使得开发人员可以将WindowsCE和Linux等操作系统移植到基于这块微处理器的目标系统中。

操作系统也是嵌入式系统的重要组成部分。当今的嵌入式操作系统各种各样,有VxWorks、QNX、Palm OS,WindowsCE、Linux,ucLinux,ucos ii等,每种操作系统都有其与众不同之处,本文移植的嵌入式操作系统为Linux。广泛开放源代码的Linux应用已经被移植到嵌入式的运行环境中,可以任意剪裁和修改后将其移植入自己的硬件平台上,因此使用Linux开发嵌入式操作系统,可以加快嵌入式系统的开发速度,缩短产品进入市场的时间。

本文的工作主要包括Boot loader实现,Linux内核移植、文件系统的实现三个部分。

搭建交叉开发环境

在移植操作系统之前,首先要在一台装有Linux的PC机上搭建好开发环境,例如我们的宿主机为Ubuntu10.04,为获得所有操作权限,以root身份登录宿主机Linux系统。在 usr/local/目录下建立arm路径,下载交叉编译工具arm-Linux-gcc-4.3.2.tgz,将之复制到文件夹/usr/local/arm/下,并将其解压;最后需要修改环境变量,设置默认交叉编译工具为arm-linux-gcc-4.3.2。利用Linux下编辑工具(如vim)打开/root/.bashrc文件,在文件末尾添加如下代码:

if

[ -d /usr/local/arm ] ;

then PATH=/usr/localarm/4.3.2/bin:"${PATH}"

fi

到此交叉编译工具搭建完毕,为验证交叉编译工具是否搭建成功,可以在终端下输入命令 arm-linux-gcc -v,搭建成功后会在终端下显示arm-linux-gcc的版本。注意此处必须注销用户,重新登录系统后设置才会生效。

引导程序

系统上电之后,需要一段程序来进行初始化:关闭看门狗、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等,这段程序被称为Boot loader。简言之Boot loader就是在系统上电后开始执行,初始化硬件设备、准备好软件环境、最后调用操作系统内核。Boot loader的实现非常依赖与具体的硬件,在嵌入式系统中硬件配置千差万别,即使是相同的CPU,外设资源也不尽相同,因此需要根据特定的硬件进行移植。

Boot Loader包含两种不同的操作模式:启动加载模式和下载模式。上电后,Boot loader从板子上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程没有用户的介入,一般用于最终产品。下载模式下则在开发过程中使用,开发人员可以使用各种命令,通过串口或网络等通信手段从宿主机下载文件(比如内核映像,文件系统映像),将它们直接放入内存或是烧入flash类固态存储设备中。

第一级引导程序Romboot固化在AT9lSAM9G20内部,上电或复位后先运行这段引导代码,其作用是将存储于外部FLASH第二级引导程序Bootstrap加载到CPU内部的SRAM中执行。Bootstrap存储在外部FLASH的前4KB空间,其功能包括初始化时钟、SDRAM控制器以及DEBUG串口等硬件资源,并将第三 级引导程序U-Boot从FLASH加载到SDRAM执行。U-Boot将嵌入式Linux操作系统从FLASH引导和加载到SDRAM中,并将CPU的控制权交给Linux。

本次移植使用的U-boot的版本为1.3.4,限于篇幅,本文不做详细的介绍。

内核的裁剪编译

1.准备工作

从Linux官网下载linux内核源码linux-2.6.30.tar.bz2,并从Atmel官网下载at91sam9g20的补丁文件(2.6.30-at91.patch.gz 和2.6.30-at91-exp.3.tar.gz)。在宿主机Linux开发环境下,建立自己的工作目录,例如工作目录为home/work/,将上述三个文件拷贝至工作目录下,解压Linux2.6.30,并将2.6.30-at91.patch.gz和2.6.30-at91-exp.3.tar.gz拷贝至Linux2.6.30根目录下,同时解压2.6.30-at91-exp.3.tar.gz。