好文档 - 专业文书写作范文服务资料分享网站

嵌入式Linux系统的搭建与配置过程电子教案

天下 分享 时间: 加入收藏 我要投稿 点赞

Uboot-1.3.4中对at91rm9200dk系列的开发板有很好的支持,只需做少量修改即可使用。但是在目前U-Boot-1.3.4引导系统中,不能识别本论文中采用的8MB NOR Flash(SPANSION公司的S29GL064N90TFI04)和1GB NAND Flash(SAMSUNG公司的K9K8G08U0A)两款芯片,需要自行移植。

4.Linux的编译,内核配置和裁剪 4.1Linux的编译

在配置内核前的须做必要的设置,主要在内核原码中设置文件Makefile,用下列指令打开Makefile文件:$viMakefile

在Makefile中主要设置两个地方:ARCH CROSSCOMPILE。

ARCH:=arm;表示目标板为arm。CROSS COMPILE=交叉编译工具的地址 ;设置交叉编译工具的地址,例如CRoSSCOMPILE=lusr/10cal/arm/2.95.3、birdarm.1inux。还要在脚本文件mkimage中把路径改为9200/bootldr/

u-boot-1.0.O/tools。(具体的路径和你的u-boot放的位置有关)然后按如下命令顺序进行内核编译即可: 内核配置:

Smake menuconfig 或makcxeon!ig 内核编译:

Smaketiean $make dep $make $./mkimage;运行mkimage脚本文件

4.2嵌入式Linux的配置和剪裁

在Linux下,用makemenuconfig或makexeontig进入配置界面。在内核配置中,一般有四种选择:Y(选择)、N(不选)、M(模块)和数字,用户可以根据剪裁需要进行设置,最后配置完毕,选择是否对配置结果进行保存?保存为.eonfig文件。

5. 嵌入式Linux文件系统的制作过程

嵌入式系统可以使用硬盘和光盘,但是这与嵌入式系统的便携式特性相违背,所以一般采用Flash作为存储介质。和硬盘相比,Flash有自己独特的物理特性,所以必须使用专门的文件系统。嵌入式系统对文件的操作是通过层次结构实现的。对于用户程序来说,文件是有结构的文件,用户程序通过文件I/O函数操作文件。嵌入式文件系统是嵌入式系统的一部分,它的任务是对逻辑文件进行管理,其工作包括提供对逻辑文件的操作(复制、删除、修改等)接口,方便用户操作文件和目录。在文件系统的内部,又根据存储设备的特点,适用不同的文件组织模式来实现文件的逻辑结构,比如磁带终使用的顺序文件以及大多数操作系统适用的树状文件。此外,文件系统要对管理文件的安全性负责。目前支持闪存的文件系统技术有以下几种:

eJFFS2和Yaffs。这些文件系统可以使用在没有初始化的NANDFlash和有CFI接口的NORFlash中。eTrueFFS,该文件系统相当于Linux中的MTD层,必须配合其他文件系统。eFTL/NTFL,它是一种中间层解决方案的统称,为上层文件系统提供接口。eRAMFS、CRAMFS和ROMFS,这些文件系统用于早期的小容量闪存设备,系统

功能比较简单,仅提供基本接口,只属于只读的闪存文件系统。适合存储空间小的系统。可按照如下步骤制作自己的文件系统: 解开压缩的文件系统: $gamzipramdisk.gz 文件系统挂载:

$mount_oloopramdisk/mnt/nweramdisk(注:newramdisk是新建的目录)。 进入newramdisk目录进行操作,随意的增减文件:

Sod/nmt/newramdisk(注:进入目录后敲入命令随意的增减文件) 退出newramdisk目录后御载文件系统: Sumount/mnt/newramdisic

压缩文件系统,生成新的文件系统映象: $gzip-c-、,9ramdisk>./newramdisk

6.Linux中交叉编译器的搭建和环境变量的设置

1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装一下(如果已经安装好的话,就可以免去这一步了): #sudo apt-get install gcc g++ libgcc1 libg++ make gdb 2. 下载arm-linux-gcc-3.4.1.tar.bz2到任意的目录下。 3. 解压 arm-linux-gcc-3.4.1.tar.bz2

#tar -jxvf arm-linux-gcc-3.4.1.tar.bz2 解压过程需要一段时间,解压后的文件形成了 usr/local/ 文件夹,进入该文件夹,将arm文件夹拷贝到/usr/local/下 # cd usr/local/

#cp -rv arm /usr/local/

现在交叉编译程序集都在/usr/local/arm/3.4.1/bin下面。 4. 修改环境变量,把交叉编译器的路径加入到PATH。

方法一:修改/etc/bash.bashrc文件 #vim /etc/bash.bashrc 在最后加上:

export PATH=$PATH:/usr/local/arm/3.4.1/bin export PATH

方法二:修改/etc/profile文件: # vim /etc/profile

增加路径设置,在末尾添加如下,保存/etc/profile文件: export PATH=$PATH:/usr/local/arm/3.4.1/bin

方法三:#export PATH=$PATH:/usr/local/arm/3.4.1/bin 注:(这只能在当前的终端下才是有效的!) 5. 立即使新的环境变量生效,不用重启电脑: 对应方法一:#source /root/.bashrc 对应方法二:# source /etc/profile 6. 检查是否将路径加入到PATH: # echo $PATH

显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成。

7. 测试是否安装成功

# arm-linux-gcc -v

上面的命令会显示arm-linux-gcc信息和版本:

Reading specs from /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/specs Configured with

:/work/crosstool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc- 3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/usr/local/arm/3.4.1 --with-headers=/usr/local/arm/3.4.1/arm -linux/include --with-local-prefix=/usr/local/arm/3.4.1/arm-linux --disable -nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable- languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 3.4.1

8.编译Hello World程序,测试交叉工具链

写下下面的Hello World程序,保存为hello.c #include int main() {

printf(\ return 0; }

执行下面的命令:

# arm-linux-gcc -o hello hello.c

------------------------------------------------------------- 修改环境变量这一步修改/etc/profile文件 在path中添加arm-linux-gcc路径

if [ \

PATH=\/3.4.1/bin\else

PATH=\fi

再source /etc/profile就可以刷新环境变量

7.驱动程序的编写过程与关键点

7.1Linux网络驱动程序的结构

所有的Linux网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device 结构),它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就可以存取自身的数据(类似面向对象程序设计时的this引用)。 一个网络设备最基本的方法有初始化、发送和接收。

|deliver packets | |receive packets queue| |(dev_queue_xmit())| |them(netif_rx()) | ------------------- ---------------------

| methods and variables(initialize,open,close,hard_xmit,|

| interrupt handler,config,resources,status...) ------------------------------------------------------- | | ----------------------

|send to hardware | |receivce from hardware| ----------------------------------------------------- | hardware media |

-----------------------------------------------------

初始化程序完成硬件的初始化、device中变量的初始化和系统资源的申请。发送程序是在驱动程序的上层协议层有数据要发送时自动调用的。一般驱动程序中不对发 送数据进行缓存,而是直接使用硬件的发送功能把数据发送出去。接收数

据一般是通过硬件中断来通知的。在中断处理程序里,把硬件帧信息填入一个skbuff结构中,然后调用netif_rx()传递给上层处理。

7.2 网络驱动程序的基本方法

网络设备做为一个对象,提供一些方法供系统访问。正是这些有统一接口的方法,掩蔽了硬件的具体细节,让系统对各种网络设备的访问都采用统一的形式,做到硬件无关性。下面是最基本的方法。

(1) 初始化(initialize)(2)打开(open)(3)关闭(stop)

(4) 发送(hard_start_xmit)(5) 接收(reception)(6)硬件帧头(hard_header)(7) 地址解析(xarp)

(8) 参数设置和统计数据

7.3 网络驱动程序中用到的数据结构

最重要的是网络设备的数据结构。定义在include/linux/netdevice.h里。

7.4 常用的系统支持 7.4.1 内存申请和释放

include/linux/kernel.h里声明了kmalloc()和kfree()。用于在内核模式下申请和释放内存。

Void *kmalloc(unsigned int len,int priority); void kfree(void *__ptr);

与用户模式下的malloc()不同,kmalloc()申请空间有大小限制。长度是2的整次方。可以申请的最大长度也有限制。另外kmalloc()有priority参数,通常使用时可以为GFP_KERNEL,如果在中断里调用用GFP_ATOMIC参数,因为使用GFP_KERNEL则调用者可能进入sleep状态,在处理中断时是不允许的。 Kfree()释放的内存必须是kmalloc()申请的。如果知道内存的大小,也可以用kfree_s()释放。

7.4.2 request_irq()、free_irq()

这是驱动程序申请中断和释放中断的调用。在include/linux/sched.h里声明。 Request_irq()调用的定义:

int request_irq(unsigned int irq,

void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irqflags, const char * devname, void *dev_id);

irq是要申请的硬件中断号。在Intel平台,范围0--15。Handler是向系统登记的中断处理函数。这是一个回调函数,中断发生时,系统调用这个函数,传入的参数包括硬件中断号,device id,寄存器值。Dev_id就是下面的request_irq时传递给系统的参数dev_id。Irqflags是中断处理的一些属性。比较重要的有SA_INTERRUPT,标明中断处理程序是快速处理程序(设置SA_INTERRUPT)还是慢速处理程序(不设置SA_INTERRUPT)。快速处理程序被调用时屏蔽所有中断。慢速处理程序不屏蔽。还有一个SA_SHIRQ属性,设置了以后运行多个设

嵌入式Linux系统的搭建与配置过程电子教案

Uboot-1.3.4中对at91rm9200dk系列的开发板有很好的支持,只需做少量修改即可使用。但是在目前U-Boot-1.3.4引导系统中,不能识别本论文中采用的8MBNORFlash(SPANSION公司的S29GL064N90TFI04)和1GBNANDFlash(SAMSUNG公司的K9K8G08U0A)两款芯片,需要自行移植。
推荐度:
点击下载文档文档为doc格式
8f1nz7tj7p97tl37kuug5o77k30e1i00qo4
领取福利

微信扫码领取福利

微信扫码分享