ARM+Linux(共10篇)
ARM+Linux 篇1
1 引言
随着计算机技术和微电子技术的发展, 嵌入式系统已经应用于人们日常生活的各个领域。常见的嵌入式系统有Vx Works、Windows CE、μ C/OS-II以及嵌入式Linux, 在众多嵌入式系统里嵌入式Linux由于其源代码开放和遵循GPL (General Public License) 协议, 使得开发人员能够根据自己的需求对其进行相应的裁剪而不需缴纳任何费用, 再者由于嵌入式Linux稳定性高、内核精悍、运行占用资源少, 所以非常适合嵌入式领域的开发和应用。本文重点阐述如何将嵌入式Linux移植到目标平台上。
2 目标平台简介
本文采用的实验平台是由广州天嵌科技生产的TQ2440 开发板。它属于ARM9 架构所采用的嵌入式微处理器是由三星公司生产的ARM9 系列芯片S3C2440, 其主频为533MHz, 具有MMU (内存管理单元) , 16KB的指令Cache和16KB数据Cache, 256M NAND Flash、126M SDRAM 、4 个LED以及A R M J T A G接口等。
一个完整的嵌入式系统跟普通的台式机一样, 它的系统组成也分为硬件部分和软件部分, 硬件部分主要包括C P U以及其他外围接口, 软件部分主要包括嵌入式操作系统以及其他的嵌入式应用软件[1], 而嵌入式操作系统则是所有嵌入式应用软件的运行基础。
3 移植过程分析
嵌入式Linux系统的开发必须按照一定的步骤进行, 在硬件平台搭建好以后, 主要进行以下的几步操作[2,3]:
(1) Bootloader程序的编写与移植;
(2) 嵌入式Linux内核的裁剪与移植;
(3) 进程的初始化。此外, 如果要构造完整的操作系统还必须添加所需的硬件驱动程序、硬件接口程序以及制作文件系统等。
可见, 嵌入式Linux操作系统开发是有层次结构的, 在制作过程中应按其先后顺序自下而上逐层进行。
Boot Loader (引导装载器) 移植是嵌入式系统移植的第一步[4]。Bootloader是操作系统内核启动前运行的一段小程序, 其主要作用是对开发板硬件进行初始化, 给嵌入式系统提供板级的硬件资源信息, 并进一步装载、引导嵌入式操作系统内核, 其作用相当于PC机的BIOS[5]。因此, 嵌入式系统移植的第一步就是要移植一个适合硬件系统的Bootloader。
在移植Linux内核前, 需要先了解一下Linux的启动过程, 通常Linux的启动过程为:一个不隶属于任何操作系统的加载程序将Linux部分内核调入内存, 并将控制权交给内存中Linux内核的第一行代码, 至此程序的加载就完成了。随后Linux将自己的剩余代码加载到内存, 并初始化所有设备, 在内存中完成所需数据结构的建立。
一切准备工作做好以后, 内核开始加载设备并启动init进程, init进程根据配置文件加载文件系统, 配置相关服务, 之后系统就能正常启动了。可见, Linux移植过程中最主要的部分是其内核的移植, 内核移植出现问题的话, 后续的工作将无法进行。
由以上分析可知, Linux的内核是嵌入式Linux系统的心脏, 是操作系统的内部核心程序, 因此, 移植过程中最主要步骤就是对Linux内核的修改和编译。
4 移植过程实现
4.1 Bootloader的移植
在本实验中采用的Bootloader为U-boot1.1.6, Uboot全称为Universal Boot loader, 即通用Bootloader, 它是遵循GPL的开源项目, 很多U-boot的源码就是相应L i n u x内核源程序的简化, 尤其是一些设备驱动程序。U-boot可以引导多种操作系统, 如Wx Works、Net BSD等, 支持多种架构的CPU, 如ARM、MIPS、Power PC, 并且支持几百种目标板[6]。本实验所使用的U-boot文件是由开发板配套光盘提供的, 无需修改即可使用。
U - b o o t的烧写使用H - J T A G软件, 在W i n d o w s XP下进行。烧写之前需要在PC机的BIOS中将并口模式设置为“EPP”或“SPP”, 并口基地址设置为“378”, 否则H - J T A G有可能探测不到A R M芯片; 确保系统中已经安装了GIVEIO并口驱动。此时将PC机的并口通过J T A G板与A R M开发板的J T A G口相连, 安装H -J T A G软件并进行相关设置后根据提示即可开始烧写过程。图1 为启动H - J T A G后探测到的C P U信息, 图2 为U-boot烧写成功以后的提示信息, 点击“Close”烧写完成。
U-boot烧写成功后, 就可以进行嵌入式Linux内核的移植了。
4.2 交叉开发环境的建立
移植前应当确保在宿主机上已经正确安装了Linux操作系统和GCC交叉工具编译链, 本实验中宿主机上安装Cent OS版本的Linux操作系统, 交叉编译工具采用arm-linux-gcc_4.3.3.tar.bz2。
将交叉编译工具包复制到系统“/opt/test”目录下, 然后在PC的Linux终端输入命令“#tar xvfj armlinux-gcc_4.3.3.tar.bz2 C ”, 之后会在/opt/test目录下生成名为4.3.3 的目录, 这就是在后续的Linux内核移植过程中要用到的交叉开发环境, 之后对交叉编译器进行相关配置, 使其生效。
在终端输入如下命令“#vi /etc/profile”, 打开profile文件, 大概在文件的27 行添加环境变量“pathmunge/opt/test/4.3.3/bin”。修改完毕后退出vi编辑器, 在终端输入“#source /etc/profile”使交叉编译器生效, 可以使用命令“#arm-linux-gcc-v”来验证交叉编译器是否生效, 如果安装不成功, 则会提示没有找到该命令。
4.3 Linux内核的移植
从网络上获取嵌入式Linux系统的源码, 本实验中采用的Linux版本为linux-2.6.30.tar.bz2, 在PC终端使用命令“#tar xvfj linux-2.6.30.tar.bz2 C/opt/test”将其解压到/opt/test目录下。
进到内核源码目录, 修改Makefile文件, 在文件的第1 9 3 , 1 9 4 行找到" A R C H ? = ( S U B A R C H ) " 、" C R O S S _ C O M P L I E ? = " , 将这两行分别修改为"ARCH=arm" 和"CORSS_COMPLIE=arm-linux-", 然后保存。
修改内核时钟频率, 用vi编辑器进到内核源码文件“arch/arm/mach-s3c2440/mach-smdk2440.c”在代码163 行将“s3c24xx_init_clocks (16934400) ”修改为“s3c24xx_init_clocks (12000000) ”保存, 由于开发板使用的外部时钟源输入频率为12MHz, , 所以必须对内核时钟频率进行修改以满足开发板的工作频率。
下面编译镜像到开发板中。打开终端进到内核目录, 输入“make menuconfig”进入配置菜单进行相关设置, 如图3 所示。一定要在内核目录下输入, 否则无法打开配置菜单。配置过程中, 选择Linux选项时应当保证其与S3C2440 开发板的配置一样才行。
配置完成以后需要修改内核机器码[7], 由于开发板的U-boot中设定了机器码为168, 所以Linux内核也需要将机器码修改为1 6 8 , 否则会出现开发板不能启动。机器码保存在内核源码的“arch/arm/tools/machtypes”文件中第379 行, 把原来的263 改为168 保存即可, 如图4 所示。
待以上步骤完成以后, 就可以编译内核镜像了, 打开终端进入到内核目录, 即“/opt/test/linux-2.6.30.4”, 然后输入#make z Image, 就可以进行编译了, 编译完毕后, 会在内核源码的“arch/arm/boot/”目录下生成名为“z Image”的镜像, 然后将其烧写到开发板中, 开发板启动情况如图5 所示。
5 结束语
嵌入式Linux的移植是实现嵌入式应用的基础, 随着嵌入式系统的广泛应用, 嵌入式Linux的移植成为一项基础性工作, 本文针对嵌入式Linux的移植, 详细论述了其移植方法和步骤, 并在此基础上成功地将嵌入式Linux2.6 移植到由广州天嵌科技生产的基于S3C2440微处理器的A R M 9 开发板上。
摘要:介绍了基于ARM9微处理器 (S3C2440) 的Linux内核移植过程及方法, 通过具体实验完成了交叉开发环境的建立、Bootloader以及嵌入式Linux2.6.30.4内核的移植。对于不同的硬件平台来说都有其积极的参考价值。
关键词:ARM9微处理器,嵌入式Linux,交叉编译,内核,移植
参考文献
[1]王晓宁, 王振臣, 张少兵.Linux操作系统在ARM9处理器上的移植[J].化工自动化及仪表, 2010, 37 (2) :67-69.
[2]李绍勋, 陈朔鹰, 罗国良.Linux2.6内核测试及其到ARM嵌入式平台的移植[J].电子质量, 2005, (5) :5-7.
[3]陈铁军, 仇洪冰.基于S3C2410的嵌入式Linux的移植方法[J].桂林电子工业学院学报, 2006, 26 (4) :261-262.
[4]潘伟森, 邓胡滨.嵌入式Linux在S3C2410上的移植分析[J].仪器仪表用户, 2008, 15 (2) :121-122.
[5]李亚峰.ARM嵌入式Linux设备驱动实例开发[M].北京:中国电力出版社, 2008:150-171.
[6]胡英多.基于S3C2440的嵌入式Linux的应用[D].成都:电子科技大学, 2006.
[7]韦东山.嵌入式Linux应用开发完全手册[M].北京:人们邮电出版社, 2008:245, 293-334.
ARM+Linux 篇2
-o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件-Wall 指定产生全部的警告信息
-O2 编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高
-c 表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由.c 或.cc 变成.o 的目标文件
-S 只激活预处理和编译,就是指把文件编译成为汇编代码
arm-linux-ld 直接指定代码段,数据段,BSS段的起始地址-Ttest startaddr-Tdata startaddr-Tbss startaddr 示例: Arm-linux-ld –Ttext 0x0000000 –g led.o –o led_elf
使用连接脚本设置地址: Arm-linux-ld –Ttimer.lds –o timer_elf $^ 其中timer.lds 为连接脚本 完整的连接脚本格式: SECTIONS{ …
Secname start ALING(aling)(NOLOAD):AT(ldaddr){contents} > region:phdr=fill …..}
arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换 示例: Arm-linux-objcopy –o binary –S elf_file bin_file 常用的选项: input-file , outflie 输入和输出文件,如果没有outfile,则输出文件名为输入文件名 2.-l bfdname或—input-target=bfdname 用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析 3.-O bfdname 输出的格式
4.-F bfdname 同时指明源文件,目的文件的格式
5.-R sectionname 从输出文件中删除掉所有名为sectionname的段 6.-S 不从源文件中复制重定位信息和符号信息到目标文件中 7.-g 不从源文件中复制调试符号到目标文件中
arm-linux-objdump 查看目标文件(.o文件)和库文件(.a文件)信息 arm-linux-objdump-D-m arm led_elf > led.dis-D 显示文件中所有汇编信息-m machine 指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.常用选项:
1.-b bfdname 指定目标码格式
2.—disassemble或者-d 反汇编可执行段 3.—dissassemble-all或者-D 反汇编所有段 4.-EB,-EL指定字节序
5.—file-headers或者-f 显示文件的整体头部摘要信息
6.—section-headers,--headers或者-h 显示目标文件中各个段的头部摘要信息
7.—info 或者-I 显示支持的目标文件格式和CPU架构 8.—section=name或者-j name显示指定section 的信息 9.—architecture=machine或者-m machine 指定反汇编目标文件时使用的架构 1.修改源代码的顶层
Makefile
CC =$(CROSSCOM_PILE)gcc
-->
CC =$(CROSSCOM_PILE)gcc
-g
使成生的vmlinux中含有debug信息 2.所有生成.o的rule中再加一条
CC
-E
-dD-C $< > /preprocessing/$(shell pwd)/$<
生成预处理文件从这个文件里面能很容易找到c源文件的宏定义 3.objdump-h vmlinux > vmlinux.txt
显示
linux 内核段信息,如段的开始虚拟地址,段的长度 4.objdump-S-l-z vmlinux > vmlinux.txt
反汇编vmlinux到vmlinux.txt,vmlinux.txt含有汇编和c源文件的混合代码,看起来很方便。而且能一步步看linux怎么一步步运行的。
5.objdump-S-l-z-j xxxx(section name)vmlinux > vmlinux.txt
反汇编linux内核段xxxx到文件vmlinux.txt中。6.objdump-x vmlinux > x.txt
vmliux中所有段的头信息,其中包口vmlinux的入口地址等 7.objdump--debugging vmlinux > debugging.txt
很多有用的debug信息,如函数名,结构体定义等
我觉的用根据以上信息,ultraedit看很方便。尤其在vmlinux.txt中选中文件名,用ultraedit右键的open能马上打开文件,很方便。
objdump-j.text-S vmlinux > vmlinux.txt-S尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
-l用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的 区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。[-l |--line-numbers] [-S |--source]
ARM+Linux 篇3
当前,嵌入式的技术应用越来越广发,从航天科技到民用产品,嵌入式产品的身影无处不在,而这些嵌入式产品的核心——处理器决定了产品的市场和性能。在32位嵌入式处理器市场中,ARM处理器占有很大份额。ARM不仅是一个公司、一种技术也是一种经营理念,即由ARM公司提供核心技术,只出售芯片中的IP授权,采取了别具一格的“Chipless模式”(无芯片的芯片企业),不参与生产,而是由合作厂商去生产具体的芯片和产品。
现在由于存储空间等原因,在嵌入式芯片上编程有较大的困难,选取合适的平台就显得很重要。由于Linux是开放源码的操作系统,吸引着全世界的程序员参与到发展和完善的工作中来,所以Linux保持了稳定而且卓越的性能。由于源代码可以修改、移植,Linux在嵌入式领域中的应用也越来越广。选用Linux作为平台,可以根据具体需要自由裁减源码,打造适合目标平台的环境,编写最有效率的应用程序。
可以预见,ARM与Linux在未来已经越来越壮大,在嵌入式产品市场上会占有越来越大的份额。在这种形式下,学习和研究ARM非常有必要,所以在这里介绍一下关于基于Linux系统的ARM9嵌入式系统设计的基础理论。
首先进行一下ARM开发环境的简介:
根据功能的不同,ARM应用软件的开发工具可分为编辑软件、编译软件、汇编软件、链接软件、调试软件、嵌入式实时操作系统、函数库、评估板、JTAG仿真器、在线仿真器等。因此,一套含有编辑软件、编译软件、汇编软件、链接软件、调试软件、嵌入式实时操作系统及函数库的集成开发环境一般来说是必不可少的。至于嵌入式实时操作系统、评估板等其他开发工具则可以根据应用软件规模和开发计划选用。使用集成开发环境开发基于ARM的应用软件时,其中涉及的编辑、编译、汇编、链接等工作可全部在PC机上完成,调试工作则需要配合其他的模块或产品完成。目前进行ARM嵌入式系统开发常见的开发工具主要有Real View MDK、IAR EWARM、ADS1.2、WinARM等。
RealView MDK开发工具是ARM公司目前最新推出的针对各种嵌入式处理器的软件开发工具。RealView MDK集成了业内最领先的技术,支持所有基于ARM的设备,能够自动配置启动代码,集成了flash烧写模块,还具有强大的仿真模拟、性能分析等功能。
IAR Embedded Workbench for ARM是IAR System公司为ARM微处理器开发的一个集成开发环境。比较其他的ARM开发环境,IAR EWARM具有入门容易、使用方便和代码紧凑等特点。IAR EWARM中包含一个全软件的模拟程序,用户不需要任何硬件支持就可以模拟各种ARM内核、外部设备甚至中断的软件运行环境。由于ADS集成开发环境已经不再更新,因此无法支持新推出的微控制器芯片,而IAR EWARM在持续的更新环境中,因此IAR EWARM将成为越来越多的人进行嵌入式系统开发的首选开发环境。
基于ARM芯片的应用系统,多数为复杂的片上系统。在该复杂系统中,多数硬件模块都是可配置的,配置工作需要由软件预先完成。因此在用户的应用程序运行之前,需要专门的一段代码来完成系统基本的初始化工作。由于此类代码直接面对处理器内核和硬件控制器进行编程,所以一般使用汇编语言实现,这里我们称之为硬件启动程序。
在应用系统的程序设计中,如果所有的编程工作都由汇编语言来完成,其工作量巨大,并且不容易移植。由于ARM处理器的运算速度高,存储器的存取速度和存储量也很高,因此大部分编程工作可以使用c语言来实现。由此可见,c语言在ARM编程中具有非常重要的地位。
其次介绍一下ARM9嵌入式系统开发的过程:
第一,嵌入式软件开发的特点。学习嵌入式开发的过程,首先要了解嵌入式开发的特点。嵌入式系统与通用计算机在以下几个方面的差别比较明显:
一是人机交互界面,这是最大的区别,因为嵌入式系统很可能就不存在键盘,显示器等在计算机中常见的实现人机交互的设备,它所完成的事情也只能是不同的传感器的变化情况,并且按照事先规定好的过程仪式完成相应的处理任务;二是功能是有限的,嵌入式系统只能反复执行设计时已经定制好的并且在开发完成后不再变化的功能任务;三是时间的关键性和稳定性,大部分的嵌入式系统因为功能要求实时响应并且受到工作环境的影响很大,需要选择合理的硬件和保护措施,保证系统的稳定性可以正常运行。
除此之外,还要了解嵌入式软件开发具有的自身特点:
一是需要交叉的开发环境;二是引入设计方法;三是固化的程序;四是开发的难度很大。
第二,嵌入式软件开发的流程。嵌入式软件的开发因为它的开发难度大等自身特点,需要将硬件、软件、人力资源等集中起来,并进行适当的组合以实现目标应用对功能和性能的要求,而且实时性和功能一样重要。这就使嵌入式开发关注的方面更广,精准度更高。嵌入式软件开发的每个阶段都体现着嵌入式开发的特点。
一是需求分析阶段;二是设计阶段;三是生成代码阶段;四是固化阶段。
第三,嵌入式系统的调试。在进行嵌入式软件开发过程中,可以选择不同的调试方式,但应根据实际的开发需求和实际的条件进行选择,有以下几种主要的调试方式。
一是源程序模拟器方式;二是监控器方式;三是仿真器方式。
嵌入式系统的调试方法被分成不同的层次,就调试方法而言,分为硬件调试和软件调试两种。在使用硬件调试的时候,可以获得比软件调试功能更强大的调试性能,但是有的时候会价格昂贵,需要合适的开发工具。软件调试可以分为操作系统的内核调试和应用程序的调试,前者的操作比较困难,因为操作系统内核不方便增加一个调试器程序,而后者相对比较简单。
在这里我们只是对ARM9嵌入式系统做一个基础理论的讲解。嵌入式技术正在飞速发展,并期待着各种行业的深入渗透。我国具有雄厚的制造业基础,与传统的制造业结合,嵌入式系统有着巨大的市场空间。同时,基于嵌入式的应用可技术创新,将推动新产品、新产业的诞生。在新的高科技浪潮来临之际,我国正全力迎接机遇和挑战,嵌入式领域方兴未艾,Linux也越来越成熟,我们需要掌握更新的知识,实现自我价值,为祖国贡献力量!
参考文献:
[1]马忠梅,马广云,徐颖慧,等. ARM嵌入式处理器结构与应用基础(2版)[M].北京:北京航空航天大学出版社,2007.
[2]马忠梅,李善平,等. ARM&Linux嵌入式系统教程(3版)[M].北京:北京航空航天大学出版社,2014.
作者简介:刘阳(1993—),男,辽宁盘锦人,沈阳理工大学学生。
龙潜(1995—),男,江苏连云港人,沈阳理工大学学生。
ARM+Linux 篇4
1 图像采集模块
字符识别系统主要由图像采集模块和图像处理模块组成,其中图像采集模块是整个系统的硬件核心,图像采集的质量直接影响系统的整体性能。线阵CIS每次扫描得到一行像素值,配合运动平台的纵向运动可以完成一幅二维图像的扫描[2]。为保证图像采集的质量,必须精确控制运动平台与CIS之间的工作匹配,本系统以CPLD作为图像采集模块的控制核心,CIS传感器、步进电机、ADC以及高速缓存FIFO在CPLD的控制协调下完成一幅图像的采集、模数转换和数据缓存。系统总体结构框图如图1所示。
1.1 硬件平台
(1)ARM处理器
采用三星公司的ARM9系列S3C2410A作为处理器,工作频率可达203 MHz,片上资源丰富,可以满足实时性要求,为图像处理提供运行平台并配合CPLD完成图像采集模块的逻辑和读写控制。
(2)图像传感器及运动平台
接触式图像传感器(CIS)具有体积小、重量轻、功耗低、结构紧凑、连接方便以及无阱深等优点,在扫描仪等领域被广泛应用。本系统采用SV643C10型CIS,其物理分辨率600 dpi(23.6 dot/mm),有效扫描宽度29.2 mm,共688个传感器像素单元,其像素输出频率为5 MHz。
运动平台由步进电机和光电传感器等组成,光电传感器实现对进纸的检测,启动扫描。步进电机控制扫描件换行,配合CIS完成图像的采集。
(3)信号调理电路
信号调理电路完成对CIS输出模拟信号的差分、放大等,实现降噪和电压匹配的作用[3]。
(4)高速A/D转换器
由于CIS的像素输出频率高于处理器内部的A/D转换器,所以本系统采用高速的外部ADC器件TLC5540,其最大采样率40 MB·s-1,拥有8位分辨率。
(5)数据缓存
为了实现ADC和ARM的速度匹配,提高系统工作效率,在ADC与ARM处理器之间加一个FIFO存储器作为高速数据缓存,选用Averlogic公司的1 MB×8 bit的AL4V8M440。
(6)CPLD模块
实现图像采集模块的逻辑控制。为CIS传感器提供的时钟信号CP和行转移信号SP。为ADC提供采集时钟,为FIFO提供读写控制和写时钟等。本文的CPLD器件采用Altera公司的EPM7128SLC84-15。
(7)存储器
本系统采用三星公司的64 MB NAND Flash存储器K9F1208作为程序和数据的存储单元,采用两片16位的HY57V561620CT-H(总容量64 MB)SDRAM作为系统内存,同时作为DMA方式读取缓存数据的目的存储器。其中Flash存储器存储空间分配情况如图2所示。
1.2 软件设计
图像采集模块的程序设计主要任务是实现该模块各元器件的协调工作以及实现对图像数据的读取。主要分为3部分内容。
(1)CPLD上的逻辑设计。
采用VHDL语言编写,该程序将外部晶振的10 MHz输入进行分频,为CIS、ADC、FIFO等提供时钟和控制信号,并为步进电机提供工作时序。
(2)嵌入式Linux系统的裁剪、配置和移植[4]。
本系统采用2.6内核,宿主机环境为Ubuntu8.04。
(3)Linux驱动程序的编写。
由于采集模块对于Linux系统来说可看作为一个设备,因此该部分程序应作为嵌入式Linux设备驱动程序来编写,该驱动程序通过CPLD间接实现采集模块的逻辑控制和图像数据的读取,为应用程序的开发提供底层硬件的接口[5]。从FIFO缓存读取图像数据采用DMA方式,DMA的目的存储器为ARM系统的SDRAM。
图像采集模块工作流程图和图像采集效果分别如图4和图5所示。
2 图像识别模块
本文的目的是构建一个通用的字符识别系统,图像采集模块实现了对扫描件图像数据的获取。由于系统基于嵌入式Linux,使得后续的图像处理与字符识别软件设计可以脱离硬件系统独立进行,具有较高的通用性,可以根据实际应用场合开发和扩展不同的识别软件,本文仅探讨手写体数字识别的应用。
识别算法:
线性判别分析 (Linearity Distinction Analysis,LDA)是有效的特征抽取方法之一,广泛用于人脸识别和字符识别等领域[6]。其基本思想是选择使 Fisher准则函数达到极值的一组矢量作为最佳投影方向,样本在该矢量集上投影后,达到最大的类间离散度和最小的类内离散度。为找到投影轴,应最大化类间离散矩阵Sb和类内离散矩阵Sw的比值
J(A)=max(tr[(ASwAT)-1(ASbAT)]) (1)
类间离散矩阵Sb和类内离散矩阵Sw的定义为
其中,c表示为模式的类别数;μj表示为第j类的均值(其概率为pj);μ0为全部样本均值;xji为第j类模式i的h维向量;nj是第j类的样本数;N 是所有样本数。μj和μ0定义为
最优化问题可以通过Sb和Sw的特征值的求解而获得。如果在样本离散矩阵中非目标样本占有比重较大,LDA并不能保证找到最优子空间。LDA的最优分类标准并不一定对分类准确性最优,有可能使得已经分开的邻近类引起不必要的重迭。本文采用一种新的加权LDA方法(ILDA),其计算
σ(Δij)是个加权函数,σ(Δ)和Δij定义为
显然,如果σ(Δ)是个常数,在投影方向上,
实验样本取自手写体通用数据库UCI,在Bhattacharyya距离(BD)分类器下对加权线性判别分析与相应的算法进行实验比较和分析,取得较好的识别性能,证实了该方法提取的特征的有效性。
3 结束语
本文采用嵌入式Linux和ARM处理器软硬件平台,利用CIS传感器配合运动平台实现了图像的采集和存储,为嵌入式字符识别系统构建了一个图像采集平台。在字符识别的应用方面,探讨了广泛应用的手写数字识别算法,在已有的线性判别分析算法基础上,提出了一种改进的加权线性判别分析算法,并对该算法进行了实验验证,获得了较好的识别率。
摘要:提出了一种针对嵌入式系统的字符识别方法。介绍了一种基于ARM9处理器和嵌入式Linux的字符图像采集与识别系统。该系统采用嵌入式Linux操作系统,图像预处理和字符识别的软件开发可以脱离硬件。通过开发不同的识别软件,系统可应用于名片识别、二维条码识别、纸币序列号识别等多种字符识别的场合,提高了通用性。
关键词:字符识别,ARM,Linux,接触式图像传感器,CPLD
参考文献
[1]黄天耀,李殿为,秦四海,等.基于CPLD的清分机纸币图像采集系统[J].国外电子元器件,2008(11):61-64.
[2]林德辉,道克刚,钟绍俊.基于CPLD的线阵CCD驱动时序的设计与实现[J].仪表技术,2008(4):22-23.
[3]刘贵喜,杨万海.CIS信号检测与处理技术[J].光电工程,2000,27(4):18-20.
[4]邹颖婷,立绍荣.ARM9上的嵌入式Linux系统移植[J].自动化技术与应用,2009,28(6):43-45.
[5]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.
ARM+Linux 篇5
● 第一阶段 嵌入式Linux开发基础
◆ 开学典礼、职业素养:自我介绍;
◆ Linux基础知识和系统安装;
◆ Linux常用命令,文本编辑器vi,shell脚本编程;
◆ Linux开发环境基础:Gcc,Ddb,Maker和Makefile;
◆ 软件版本管理;
◆ 嵌入式软件开发环境搭建与使用
● 第二阶段 嵌入式C语言编程
◆ 复习C语言基础知识,强化指针和数组概念,学习数据结构和一些基本算法; ◆ 全面了解C语言标准库提供的功能;
◆ 深入介绍C程序在编译时与运行时的基本原理;
◆ GNU C的拓展知识;
◆ 从宏观和微观的角度讨论高质量C语言编程;
◆ 详细介绍嵌入式C的特性及应用;
◆ 职业素养:推销自己。
● 第三阶段 Linux系统程序设计
◆ 深入学习操作系统基础知识;
◆ Linux系统程序设计:系统编程环境、常用调试工具,创建中止进程,进程间通讯;
◆ Linux网络编程;
◆ 职业素养:礼仪沟通、语言沟通;
● 第四阶段 ARM原理与应用
◆ 嵌入式系统基础:嵌入式系统 定义、发展,嵌入式实时操作系统; ◆ ARM的基本概念及体系结构;
◆ ARM的编程模型;
◆ ADS集成开发环境;
◆ ARM汇编指令集;
◆ 嵌入式系统及接口设计;
◆ ARM协处理器。
● 第五阶段 u-boot和Linux移植
◆ Linux内核基础;
◆ Kernel的定制和编译;
◆ 内核移植;
◆ 内核调试。
欢迎下载该文档
● 第六阶段 嵌入式Linux驱动开发
◆ 驱动程序概述;
◆ 字符设备驱动程序开发; ◆ 设备驱动总的重要概念和机制;
◆ 块设备驱动程序开发; ◆ 块设备驱动程序开发实例; ◆ 网络设备驱动程序开发及实例; ◆ 音频和显示设备驱动程序开发; ◆ 素质培训:如何写简历。
● 第七阶段 项目实践
◆ 学习工程项目开发流程:项目需求、项目设计、程序编码、程序调试与测试、版本发布;
◆ 以团队方式分解项目,协作开发、各学员扮演不同角色; ◆ 项目开发:个人移动终端实时通讯图形管理系统; ◆ 素质培训:面试训练、职业前引导。
Arm学习
课程大纲
◆ 帮助学员了解ARM体系结构及工作原理,掌握
第一天
ARM指令集,学会操作ARM处理器基本方法。◆ 课程实验:
◆为提高系统的综合性能,“ARM和Thumb交互”是工程师在实际编程常用的一种方式。通过本天课程的学习,学员可以了解Thumb指令的特点,掌握
第二天
ARM和Thumb指令交互方法。“异常”作为处理器的一种特殊工作方式在系统工作中扮演着重要的角色,本期课程也将帮助学员掌握ARM平台异常产生的过程和处理方法。◆ 课程实验:
◆虽然汇编指令可以完成我们所需要的所有功能,但相对C语言来说,汇编语言存在编写复杂、可读
第三天
性差等缺点,所以在实际的项目开发中,工程师通常会使用C或C++等高级语言来编写主程序部分。通过第三天课程的学习,学员可以掌握汇编、c、欢迎下载该文档
c++混合编程的方法,完成对目标平台的软件编程,更好的熟悉嵌入式软件的开发流程。◆ 课程实验:
◆在学习完了理论知识后,该进入实践环节了。嵌入式编程最终目标还是对接口设备的操作。通过第第四天
四天课程的学习,学员可以掌握基于ARM的嵌入式硬件平台接口设计以及各种常用接口的开发; ◆ 课程实验:
◆单个接口的操作最终还是要为一个综合的软件项目服务,bootloader在嵌入式操作系统中占用重要地位,其编写、移植是一项常见而复杂的工作。通过第五天课程的学习,学员即能够通过这个综合第五天的软件项目将前面的主要内容融会贯通,还可以掌握 bootloader原理及开发过程,掌握和bootloader相关的接口开发,了解嵌入式操作系统的结构及启动流程等。◆ 课程实验:
三个月
◆ 企业项目实践(自行操作,专家答疑)(三个月)
ARM+Linux 篇6
目前, 嵌入式操作系统的种类很多, 如VxWorks, Windows CE和Linux等。在这些操作系统中, Linux是发展最快, 应用最广泛的。由于使用费用、开放源代码程度和使用习惯等各方面因素, Linux是得到较多推广的操作系统之一。由于Linux支持从x86到嵌入式处理器的多种处理器, 使得Linux桌面PC上开发的很多资源可以轻松的移植到各种嵌入式平台上, 这种便利使得在嵌入式系统中使用Linux操作系统具有很大吸引力。
开发环境
硬件环境
本系统中使用目标平台S3C2410 (SAM SUNG公司使用ARM920T处理器内核开发的一款嵌入式处理器) 。A R M 9 2 0 T核由ARM9TDMI, 存储管理单元 (MMU) 和高速缓存三部分组成。
S3C2410的资源还包括外围存储设备 (SDRAM和NandFlash) , 外围显示设备 (触摸屏和LCD) 与外围接口设备 (串口、网口与并口) 。
软件平台
嵌入式Linux系统从软件系统的角度通常可以分为以下4个部分。
·引导加载程序。包括固化在固件中的启动代码 (可选) 和Bootloader。
·内核。特定于嵌入式板子的定制内核以及控制内核引导系统的参数。
·文件系统。包括根文件系统和建立于Flash内存设备之上的文件系统。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好的运行环境的载体。
·用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会有一个嵌入式图形用户界面。同时装有Bootloader、内核启动参数、内核映象和根文件系统。
嵌入式Linux系统移植的实现
引导加载程序
Boot Loader是在操作系统内核运行之前运行的一段小程序。大多数Boot Loader都分为stage1和stage2两大部分。Stage1主要包含依赖于CPU的体系结构硬件初始化的代码, 通常都用汇编语言来实现。这个阶段的任务有: (1) 为基本的硬件设备初始化 (屏蔽所有的中断、关闭处理器内部指令/数据cache等) , (2) 为第二阶段准备RAM空间 (如果是从某个固态存储媒质中, 则复制Bootloader的第二阶段的代码到RAM) , (3) 设置堆栈并跳转到第二阶段的C程序入口点。Stage2通常用C语言完成, 以便实现更复杂的功能, 也使程序有更好的可读性和可移植性。这个阶段的任务有: (1) 初始化本阶段要使用到的硬件设备, 检测系统内存映射。 (2) 将内核映像和根文件系统映像从Flash读到RAM。 (3) 为内核设置启动参数, 调用内核。
本系统中采用的BootLoader是韩国Mizi公司开发的vivi, 适用于ARM9处理器。在配置编译之前, 首先要建立交叉编译环境。把cross-2.95.3.tar.bz2、arm-linux-gcc-3.4.1.tar.bz2软件包拷贝到/usr/local/arm目录下, 分别解压这两个包以构成本系统的交叉编译环境。
编译Bootload vivi主要步骤如下:
[1]解压vivi源文件tar jxvf vivi.tar.bz2
[2]进入vivi目录编译makefile, 主要修改如下:
[3]编译vivi/arch/s3c2410/smdk.c, 根据实际板子的实际情况对Nand Flash进行分区。需要注意的是要和下面Linux内核配置编译配合起来。本开发板提供的6 4 M的Nand Flash做为存储设备, 其空间分配表如表1所示。
至此, 可以生成vivi的bin文件, 通过开发板JTAG口和PC机并口建立连接, 把vivi移植到开发板上, 重新加电, 这样就可以引导内核。
Linux内核的移植
Linux的内核版本发行同Linux对嵌入式处理器支持程度的发展是不同步的。因此, 需要对特定的处理器体系结构选择合适的核。本系统采用的是linux-2.6.14.1.tar.bz2的版本, 与2.4的版本相比, 2.6版本对资源的定义进行了分类, 代码相当精练, 可读性很好, 条理清晰, 修改起来容易。
而且支持标准的高级电源管理apm。事实上, Samsung S3C2410已经成为linux的一个标准支持平台。
编译配置内核主要步骤如下:
[1]进入内核源代码目录, 修改Flash分区表部分的源码, 与vivi对NandFlash的分区相匹配。即定义文件arch/arm/machs3c2410/devs.c中的分区表结构体static struct mtd_partition partition_info[]中的分区名, 偏移量和分区大小。同时加入NandFlash分区, 即定义结构体struct s3c2410-nand-set nandset[]。与此同时, 修改结构体struct s3c2410-platformnandsupperlpplatform[]以建立对Nand Flash芯片的支持。最后, 加入Nand Flash芯片支持到Nand Flash驱动。
[2]对内核进行适当的配置。在本系统中, 配置过程的关键在于是:在对MTD配置时, 选择支持M T D驱动以及支持NANDFLASH驱动;选择支持要用到的各类文件系统。如果要建立及安装模块, 则要在配置内核时选择模块的支持。选择交叉编译工具arm-linuxgcc-3.4.1编译内核源码之后, 会在kernel/arch/arm/boot/下生成名为z I m a g e的内核映象。在vivi的命令提示模式下使用下载命令完成内核加载到开发板的存储设备上。
根文件系统
Linux系统采用文件系统组织系统的文件与设备, 为设备和用户程序提供统一的接口。文件系统的存在使得数据和设备可以被有效而透明地存取访问。
本系统使用CRAMFS格式的根文件系统, 它是具备最基本特性的文件系统, 主要用于嵌入式系统, 优点是将文件数据以压缩形式存储, 在需要运行的时候进行解压缩, 具有很大的压缩比, 可以做到高效的随机读取。
在本系统中, 首先, 在根文件目录rootfs下通过输入下面的命令:
mkdir dev proc etc mnt bin sbin lib tmp建立上述的目录。没有建立home目录是因为其内容只是针对工作站与服务器的设置有用, 在嵌入式Linux中即使有也是空的。然后把所需要的配置文件, 动态函数库放到相应的目录。
采用BusyBox是缩小根文件系统的一个好方法。BusyBox非常形象地称为嵌入式Linux系统的“瑞士军刀”, 因为它将许多常用的UNIX命令与工具结合到了一个单独的可执行程序中。虽然与相应的GNU工具比较起来, BusyBox所提供的功能和参数略少, 但在嵌入式系统中, 已经足够了。
将busybox-1.1.3.tar.gz放到上述tmp目录下, 进行解压:
PREFIX=/home/arm/dev_home/rootfs/my_rootfs/all install, 其中PREFIX指明了安装路径即我们根文件系统所在路径。
由于根文件系统采用的是CRAMFS格式, 所以使用mkcramfs生成cramfs映象, 具体的命令是:mkcramfs my_rootfs my_rootfs.cramfs。根文件系统映象文件就完成了。同内核加载一样, 通过vivi命令提示把根文件系统映象加载到开发板上。
按照上面的安排, 一个基本的嵌入式Linux系统构建完毕。其启动过程如图1所示。
结语
本工作对嵌入式Linux系统的启动加载程序bootloader进行配置, 对Linux内核进行裁剪, 完成对根文件系统的制作, 将嵌入式Linux移植到基于ARM920T处理器目标板, 为开发者提供了在ARM9平台上构建嵌入式Linux系统的方法的参考。实验表明其系统具有很好的实时性、稳定性。
参考文献
[1].孙天泽等编著, 嵌入式设计及Linux驱动开发指南, 电子工业出版社, 2005
[2].karim Yaghmour著, 韩存兵等译, 构建嵌入式Linux系统, 机械工业出版社, 2004
[3].詹荣开, 嵌入式系统Boot Loader技术内幕.zhangrk@sohu.com
ARM+Linux 篇7
Linux是目前最具活力的嵌入式操作系统之一,其对各类计算机架构的兼容和支持,强健的网络功能,独特的自由软件的特征,基于Linux的各种应用开发成为目前的主流技术之一。红外技术因其良好的技术成熟性和市场成熟性,在今后很长的时间内将保持良好的发展状况。因为红外通信的良好保密性和易用性,以及其廉价的成本,将在智能电器领域内长期使用,并可能有新的发展。这两种技术的结合,可以相得益彰,在信息家电的红外网络通信方面开辟一片新的领域。
1系统开发硬件平台
1.1系统硬件结构
系统硬件结构如图1所示。
S3C2410微处理器是基于ARM920T核的16/32位RISC处理器,工作频率203 MHz。根据S3C2410的最高工作频率以及内部PLL电路的工作方式,选择12 MHz的无源晶振。12 MHz的晶振频率经过S3C2410片内的PLL电路倍频后,可达到202.8 MHz的频率。片内的PLL电路兼有频率放大和信号提纯的功能,因此系统可以以较低的外部时钟信号获得较高的工作频率,以降低因高速开关时钟所造成的高频噪声。S3C2410的集成度高、功能强大,是便于便携设备以及其他工控设备如指纹识别器、车载系统等的应用的应用型处理器。
1.2 红外收发模块ZHX1010
ZHX1010[1]是Zilog公司出品的一款与IrDA(Infrared Data Association)协议标准兼容的红外收发器。
它支持所有红外通信协议支持的SIR红外传输速率,采用半双工串行传输方式。ZHX1010有6个引脚,依次是LEDA、TXD、RXD、SD、Vcc和GND。LEDA内部与IRED红外发光二极管相连,外部接到Vcc,以给红外管提供工作电流。ZHX1010发送数据输入RXD、接收数据输出端TXD分别与S3C2410的UART2的输出RXD2和输入TXD2相连,ZHX1010的掉电模式使能控制端与S3C2410的一个输出控制端口TOUT1引脚相连。ZHX1010把接收到的数据通过UART2的输入端传送给S3C2410,S3C2410把待发送的数据通过UART2的TXD2发送给ZHX1010的TXD端,再通过红外收发器发射管发送。
2 红外通信协议分析与实现
红外传输协议栈[2,3]的结构如图2所示。
如果将图2红外协议层集成在一个嵌入式系统中,可以分为三个模式:驱动模式、中断模式和用户模式[4],如图3所示。处于最低层的是物理层,是由红外收发器件和UART或者其他专用控制器组成。UART或者专用控制器将输入的数据流转换成一定调制方式的电流脉冲,然后输出到红外收发器件,由收发器件将电流脉冲转换成红外光脉冲。在物理层的上面是协议栈中的中断块,负责响应外控制器的接收发送中断。其中很重要的工作就是进行帧的处理,保证数据传输的正常进行。驱动部分是协议栈的最主要的部分,包括了IrLAP,IrLMP,TinyTP和IAS等协议。这些协议实现了红外协议的底层功能,IrLAP建立通信连接;IrLMP实现红外连接的管理和复用;TinyTP对数据传输的进行流控制;用户部分包括IrOBEX以及其他的应用协议和应用程序[5],用户应用程序可以直接使用驱动部分的协议或者通过应用程序间接使用,如图3所示。
3 红外网络驱动设计
在特定嵌入式系统上运行Linux,需要根据硬件规范移植各种驱动。由于IrDA不是单纯的串口物理通信规范,而是一种网络传输控制标准。Linux必须按网络设备驱动方法来组织红外数据的网络传输[6]。Linux对所有网络设备都抽象为一个接口,这个接口提供了对所有网络设备的操作集合。由数据结构device来表示网络设备在内核中的运行情况,以dev_base为头指针的设备链表来集体管理所有网络设备。数据结构device中有很多供系统访问和协议层调用的设备方法,包括供设备初始化和进行系统注册用的init函数,打开和关闭网络设备的open和stop函数,处理数据包发送的函数hard_start_xmit,以及中断处理函数等。
3.1 设备初始化
红外通信设备的初始化主要是由device数据结构中的init函数指针所指的初始化函数来完成的。当内核启动或加载驱动模块的时候,就会调用初始化过程。首先检测物理设备是否存在,这是通过检测系统中的红外串行接口硬件特征来完成。然后针对相关寄存器进行初始化,构造设备的device数据结构,用检测到的数值对device中的变量初始化。最后向Linux内核中注册该设备并申请内存空间。
3.2 红外设备的打开
用#ifconfig irda0 up来调用函数s3c2410_irda_open来打开相关的红外设备。当调用函数s3c2410_irda_open时,要在内核中完成几个主要的功能:注册接收中断函数s3c2410_irda_sir_rx_irq和发送中断函数s3c2410_irda_sir_tx_irq,分配并初始化红外线收发器所需的接收与传送buffer,启动红外设备,设置红外波特率和打开IrLAP。设备打开过程中,系统通过调用发送函数s3c2410_irda_hard_xmit发送红外数据的过程判断红外线收发标志是否为1来判断红外设备是否被真正打开。通过调用系统函数netif_start_queue(dev)来通知高层可以使用队列。
3.3 红外数据的发送和接收
红外数据的发送:当内核要发送数据时,系统调用s3c2410_irda_hard_xmit函数,禁止接收,关闭中断,然后将上层交付的帧放入到底层驱动的缓冲区中。然后打开发送中断,在中断服务时把底层驱动缓冲区中的数据发送出去。在数据发送过程中要用到以下几个函数来进行过程控制:函数s3c2410_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)中的参数skb中是否含有改变接口速度信息的请求来判断是否改变接口速度;调用系统函数netif_stop_queue(dev)来告知高层不要使用队列。
红外数据的接收:系统采用中断进行红外数据的接收。任意新的接收数据到达都触发中断。接收中断处理程序主要完成以下工作:处理接收错误、将URXH_IRDA中的数据送到接收缓冲区中。在中断处理中,系统在打开发送中断要关闭接收中断以保证红外通信是半双工通信工作正常;要避免多次调用函数netif_wake_queue,只有当装置因为缓冲区已满且有新的封包要传送时才调用。
3.4 红外设备控制
s3c2410_irda_ioctl控制函数主要根据s3c2410_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd)传递下来的参数cmd的不同情况进行控制处理的。处理流程图如图4所示。
3.5 红外设备的关闭
系统关闭红外设备通过函数s3c2410_irda _stop来实现:禁止接收、发送中断,释放接收、发送中断占用的资源,通知高层不要使用队列,关闭IrLAP。
以上就是基于S3C2410的Linux下红外线收发器网络驱动程序的主要功能模块和设计流程。采用直接编译进内核的方式,当系统启动,就可以执行#ifconfig irda0 up后,系统启动红外设备。当执行#ifconfig irda0 down后,系统自动关闭红外设备。
4 红外网络通信的实现
红外通信与常规网络设备的通信很相似,都有一个客户端和服务器端,采用套接字,建立通信双方的虚拟连接。红外通信的Socket称为IrSock,在Linux中每一种协议都有自己的网络地址数据结构,均以sockaddr_开头。以使用IrSock的服务端的开发为例:首先要使用Socket分配一个流套接字,对地址格式参数用AF_IRDA,对类型参数用SOCK_STREAM.其次完成用bind将服务名与套接字绑定,向address参数传送SOCKADDR_IRDA结构。使用listen侦听发送端的连接,用accept接收发送端的客户端。使用send和recv与客户端通信。最后使用closesocket关闭套接字。客户端开发方式类似。客户端和服务器端都开发好以后,当两个系统都启动时,互相就可以找到对方,并能按既定的协议通信了。
5 结论
文中结合实际的硬件平台,研究了基于嵌入式Linux操作系统下红外通信协议的实现过程,给出了一个红外设备基于网络传输控制标准的驱动程序设计的方法。通过对照硬件规范,就可以把红外协议移植到很多应用嵌入式Linux系统的特定硬件平台上,使红外通信的更广泛应用于仍采用红外控制方式的信息家电网络的通信中。
参考文献
[1]ZHX1010SIR Transceiver Product Specification.ZiLOG Worldwide Headquarters.http://shppotr.zilog.com/support/,2002-08-08
[2]Infrared Data Association(IrDA),IrDASerial Infrared Physical Lay-er Specification(IrPHY),Version1.4.http://www.irda.org/standards/specifications.asp,2001-05-30
[3]叶晖.红外通讯协议在嵌入式系统中的实现.电子技术应用,2004;7:53—55
[4]Megowan P J,Suvak D W,Knutson C D.IrDA infrared communi-eations:an overview.Counterpoint Systems Foundry,Inc.1998
[5]宗平,高军.红外通信在嵌入式Linux系统中的实现.计算机工程与科学,2003;5:79—81
ARM+Linux 篇8
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。[1]嵌入式Linux系统资源有限、专用性强,在部署到嵌入式平台之前必须对其进行裁剪、定制,减小嵌入式Linux系统体积,提高运行效率。
由于Linux具有内核小、效率高、源代码开放和强大的网络支持等一系列独特优势,嵌入式Linux将在未来的嵌入式发展中占最大的优势,其巨大的市场潜力已经吸引了众多的厂商进入这一领域。目前,国外的著名厂商,例如I B M、D E L L等,几乎都在嵌入式Linux操作系统的研究、开发和推广方面投入了巨资。国内有一些公司,例如华恒、共创软件联盟、中软、红旗、万禾等,也开始积极从事嵌入式Linux操作系统的研究、开发和推广。随着微电子技术的不断创新和发展,嵌入式系统 (E m b e d d e d Systems) 作为计算机应用的一个重要领域,已深入到社会的方方面面,越来越被人们所关注。嵌入式系统出现于60年代晚期,它最初被用于控制机电电话交换机,如今已经广泛地应用于工业制造、过程控制、通讯、航空航海、军事装备等相关行业,而且深入到信息家电、娱乐、社会文化等各个领域,掀起了一场数字化的技术革命。随着多媒体技术与I n t e r n e t应用的迅速普及,消费电子 (Consumptive electron) 、计算机 (Computer) 、通讯 (Comunication) 等3C一体化趋势日趋明显,极大地推进了嵌入式技术的发展,使嵌入式技术再度成为研究与应用的热点。
1 交叉编译环境的创建
基于Linux操作系统的应用开发环境一般是由目标系统硬件 (开发板) 和宿主PC机所构成。目标硬件开发板用于运行操作系统和系统应用软件, 而目标板所用到的操作系统的内核编译、应用程序的开发和调试则需要通过宿主PC机来完成 (所以称为交叉编译) 。双方之间一般通过串口、并口或以太网接口建立连接关系。交叉编译工具是嵌入式开发的基础,完善的工具链可以保证项目开发的进度和质量。交叉编译工具可以通过两种方式获得,一种是直接从网上下载已经制作好的交叉编译工具,另一种就是自己制作交叉编译工具,制作方式是: (1) 下载源码,准备补丁; (2) 设置环境变量, 指定交叉编译器的安装目录; (3) 内核头文件的设置; (4) 二进制工具包binutils的设置; (5) 编译器gcc的设置; (6) C链接库glibc的设置;最后是完整编译器的设置。本文用的交叉编译工具为arm-linux-gcc4.0.2, 将交叉编译器解压到相应的目录下, 命令为#t a r-z x c f armlinuxgcc4.0.2.tar.bz2, 要注意解压后的路径。
本文所使用的嵌入式系统目标平台是SamSung公司基于ARM920T内核的嵌入式处理S3C2410, ARM2410开发板支持W I N C E、L i n u x、U C O S以及N U C L E U S嵌入操作系统。面向手持式设备以及高性价比,低功耗的应用,内部集成LCD, USB等控制器。Linux内核采用2.6版本的内核,它吸收了一些新技术,在性能,可靠性和可扩展性方面有较大提高。本设计基于fedora-12进行开发。
2 嵌入式linux系统组成
嵌入式Linux系统从软件方面来说主要包括以下几个部分,Bootloader (引导程序) ,内核启动参数,内核 (kernel) 和根文件系统四个部分,在Flash中存储的示意图如图1所示。[2]
2.1 bootloader的移植
Bootloader指系统启动后,在操作系统内核之前运行的一小段程序。Bootloader主要完成硬件检测和系统引导, 操作系统的主要功能之一是管理系统硬件设备, 屏蔽硬件细节, 向其上的应用提供标准接口, 易于应用程序的编写和移植。我们可以初始化硬件设备,建立内存空间的映射图,从而为最终调用操作系统内核准备好正确的环境。Bootloader是依赖于硬件而实现的,但是不管事什么样的开发板,都是遵循以下流程:先关闭中断,设置cpu的速度和时钟频率,初始化RAM,将代码从F L A S H中复制到R A M中,设置堆栈,这样就搭建了一个C运行环境,之后跳转到C入口点,就是初始化驱动设备,设置linux内核参数,启动linux。[3]下载u-boot压缩包,经过解压修改和设置一些参数后,通过J T A G接口烧写到开发板的Flash中。
2.2 linux内核的移植
linux内核源码树[4]
/include子目录包含了建立内核代码时所需的大部分包含文件, 这个模块利用其他模块重建内核。
/init子目录包含了内核的初始化代码, 这是内核工作开始的起点。
/arch子目录包含了所有硬件结构特定的内核代码, 如i386和alpha。
/drivers子目录包含了内核中所有的设备驱动程序, 如块设备和SCSI设备。
/fs子目录包含了所有的文件系统的代码, 如ext2和vfat等。
/net子目录包含了内核的联网代码。
/m m子目录包含了所有内存管理代码。
/ipc子目录包含了进程间通信代码。
/kernel子目录包含了主内核代码
2.2.1 内核源码下载
标准的linux内核源码可以从http://www.kernel.org/pub/linux/kernel/v2.6/下载,也可以从镜像ftp站点获得,笔者用的是linux-2.6.26.tar.gz,将其解压到相应的目录下,命令为#tar–zxvf linux-2.6.26.tar.gz。armlinux是针对标准linux内核为arm做的补丁,也可以直接下载针对linux内核打好arm补丁的源码。
2.2.2 内核配置
内核配置通常是对内核的各个功能进行取舍配置,将配置的方案保存到configure文件中。在交叉编译内核之前,对编译选项的配置是很重要的,本文中选择对S3C2410开发板的支持,选择File System支持,对于File System应确保如下支持:
(1) proc file system support
(2) ROM file system support
(3) Second extended fs support
然后配置块设备,使其支持R A M disk。在编译内核的时候,就会根据此配置进行取舍编译。在编译目录下通过make menuconfig命令进入内核配置界面。
修改内核目录树根下的Makefile时,指定目标平台为arm, 指定交叉编译器,可向Makefile中添加如下内容:
2.2.3 内核编译
编译内核使其生成内核映像,编译内核有非压缩和压缩两种方式。[5]压缩方式,内核从R O M中启动,将被压缩的内核压缩到R A M,然后再执行内核,有点是可以将内核事先烧写至flash中,而无需手工下载,这种方式使用m a k e zimage来编译内核。
#make dep//设置依赖关系
#make zIamge//编译内核
交叉编译内核时间相对较长,编译完成后会形成一个文件zImage, 这就是编译成功后的ARMLinux内核。
2.3 根文件系统的制作
根文件系统一直是linux系统不可或缺的组件,在嵌入式linux中,内核在启动期间进行的最后操作之一就是安装根文件系统。Busybox是构建嵌入式根文件的软件,用它制作根文件系统简单,设置灵活。根文件系统一般都包括:1)基本的文件系统结构,包含一些必需的目录,比如:/dev,/proc, /bin, /etc, /lib, /usr, /tmp;2)基本运行程序所需要的库函数,如:lib/uc-libc;3)基本的系统配置文件,如:rc, inittab等脚本文件;4)必要的设备文件,如:/dev/tty, /dev/fd0;5) 基本的应用程序,如:sh, ls, cp, mv等;根文件系统制作就是生成包含上述各种文件系统的过程。[6]
2.3.1 安装busybox
从网站http://www.busybox.net/下载busybox-1.17.4.tar.bz2,使用tarzxvf busybox-1.17.4.tar.bz2解压,进入busybox-1.17.4.o目录后执行make munuconfig命令可进入配置界面。修改busybox根目录下的makefile使用交叉编译器。将A R C H?=$ (S U B A R C H) 修改为A R C H?=a r m,将C R O S S_C O M I L E?修改为CROSS_COMILE?=arm_linux-,修改后执行make命令编译busybox。然后安装busybox。
2.3.2 创建根文件
开发板的根文件系统在主机上的目录为/home/work/lsq, 在此目录下使用mkdir命令创建dev, etc, home, lib, mnt, proc, root, sys, tmp目录。在/etc目录下存放配置文件;创建etc/inittab文件,init进程根据/etc/inittab文件来创建其他子进程;创建etc/fstab文件,fstab文件描述系统中各种文件系统的信息,应用程序读取这个文件,然后根据其内容进行自动挂载的工作。
2.3.3 制作yaffs2文件系统映像文件
制作文件系统映像文件,就是将一个目录下的所有内容按照一定的格式存放到一个文件中,这个文件可以直接烧写到存储设备中。
在yaffs源码中有个utils目录,里面有mkyaffsimage和mkyaffs2image的源代码,前者制作yaffs映像文件,后者制作yaffs2映像文件,将下载的yaffs2解压,在目录/Dovelopment下有两个文件夹;进入yaffs2/utils目录,加入两个文件:nand-ecc.c和yaffs_packed-tagsl.c;修改makefile文件
MKYAFFSSOURCES=mkyaffsimage.c yaffs_packedtagsl.c nand-ecc.c然后执行make生成mkyaffs2image工具,复制工具到/usr/local/bin目录下, 执行#mkyaffsimage2 lsq/pyaffs2.img命令可生成文件系统映像文件,执行#gzip–pyaffs2img最终生成嵌入式linux根文件系统的映像文件为pyaffs2-.img.gz。根文件系统制作完成。
3 下载并执行映像文件
下载linux内核映像和根文件系统映像文件到目标板
#tftp 30008000 zImage/*下载linux内核映像到目标板内存*/
#fftp 300800000 pyaffs2.img.gz/*下载根文件系统映像到目标板内存*/
#g o 3 0 0 0 8 0 0 0/*启动目标板linux*/。
重启开发板,能看到嵌入式linux系统在超级终端完整的打印信息,说明嵌入式linux系统成功的移植到S3C2410上去了。
4 总结
文章研究了基于a r m-l i n u x和S3C2410的嵌入式系统设计,详细地介绍了移植的基本方法,重点说明了移植过程的关键步骤。这对于嵌入式linux系统的应用以后的发展具有重要意义。
参考文献
[1]曹玥.Linux内核分析及在S3C2440上移植过程[J].科技广场.2010, (1) :173-175
[2]邓俊华, 杜玉晓.基于S3C2410处理器的Linux移植[J].技术交流.2009 25 (8) :53-55
[3]王志诚.基于ARM9的嵌入式Linux操作系统的移植[J].陶瓷.2010 (3) :50-52
[4]黄义文.Linux操作系统内核裁剪的分析[J].中国民航飞行学院学报.2010 (3) :56-59
[5]赵炯.Linux内核完全剖析[M].北京:机械工业出版社.2006
ARM+Linux 篇9
传统的ARM嵌入式系统大多采用Nor Flash或Nand Flash这2种非易失闪存来存储程序和数据并且引导和启动系统的。而本文采用的是已经普遍应用于数字产品的SD存储卡。
SD卡较传统的Flash具有明显的优势:
首先, 价格便宜, 随着SD卡技术的发展和SD卡生产厂商的不断增加, SD卡的价格不断下降, 已经和Flash的价格相差无几。
其次, 存储容量大, 尤其是SDHC卡的出现, 目前已经能够达到32 GB, 并且增大趋势日益明显。再次, 读写方便, 我们可以通过读卡器读写SD卡, 比起仿真价格便宜, 读写速度快。
最后, 易插拔、更换和携带方便。
从上述分析可知, SD卡在今后ARM嵌入式的应用会逐渐增加, 且很多厂家的芯片已经外扩了SD卡接口。
2 系统组成及启动方式
ARM-Linux嵌入式系统包括硬件平台和软件平台2大部分。我个人在学习和研究ARM-Linux嵌入式系统时使用的平台如下:硬件平台采用Samsung公司的S3C6410处理器、128 M的mobile SDRAM、2 G的SD卡及其他外部接口设备。软件平台系统包括引导程序 (u-boot) 、嵌入式操作系统内核 (Kernel) 、文件系统 (File System) 。由于Linux的开源和使用的广泛性, 我选择了Linux内核。S3C6410是一种兼容性比较好的ARM11处理器。S3C6410的SD/MMC接口模块可以兼容MMC卡4.2协议和SD卡2.0协议。这样目前市场上流行的SD/MMC卡和SDHC卡基本就都可以兼容使用了。
S3C6410启动模式有多种方式, 分别由XSELNAND, OM[4:0], GNP[15:13]管脚控制。图1是系统引导的框图。系统引导的整个过程是先通过OM管脚确定系统通过什么器件启动。当把OM[4:1]设置为1111时, 表明系统从i ROM启动。i ROM启动后要把外围设备的代码拷贝到Stepping Stone中运行。此时GPN[15:13]用于识别设备的类型。当GPN[15:13]设置为111时, 即从SD/MMC (CH1) 设备中拷贝代码。Stepping Stone执行结束后要把BL2中代码拷贝到SDRAM中, 继续执行BL2中的程序。
3 S D卡引导Linux内核过程
3.1 BL1的引导
整个系统上电或复位后, PC指针指向i ROM的起始地址, 即0x08000000位置, 此段程序称为BL0, 大小为32 k B。这段代码是Samsung公司在做芯片的时候固化到芯片中去的。BL0执行最后的工作就是从SD卡中读取8 kB代码到I-RAM (Stepping Stone) 中, 然后PC指针指向I-RAM的起始地址。I-RAM的起始地址为0x0C000000, 此段程序称为BL1, 是用户自己写的代码并且存储到SD卡中的。
对于SD/MMC卡, S3C6410是从SD卡所有扇区的最后18个扇区 (每个扇区512 Bytes) 开始读取8 k B的程序。而对于SDHC卡是从SDHC卡所有扇区的最后1 042个扇区开始读取8 k B的程序。这是由S3C6410芯片中i ROM的代码决定的。因此我们要将程序根据使用卡的种类放到指定的位置上。以下都以SD/MMC为例进行研究, 代码分布结构如表1所示。其中MBR为SD卡分区后的主引导纪录, Kernel是Linux操作系统的内核, User File System是用户的文件系统, BL2是系统第二阶段引导的代码, ENV是Linux系统内核引导时需要的环境变量, BL1是系统第一阶段引导的代码, 最后的1 k B字节为保留使用。
往往研究Linux的时候都会借用很多源代码来进行, 因此我选用u-boot来进行说明。先来分析u-boot生成二进制代码的空间结构, 然后再分析具体内容。
一般而言u-boot生成二进制代码是大于8 k B小于256 k B的u-boot.bin文件。由于BL1只有8 k B, 所以需要把u-boot.bin转换为8 k B的BL1和BL2代码。具体实现可以把u-boot.bin的前8 k B的代码放到SD卡的BL1位置上, 然后把整个u-boot.bin文件写入到SD卡的BL2位置上。到目前为止我们只知道BL1的位置, 其他的位置并不知道, 这是因为其他段的写入位置和u-boot有很大关系。
3.2 BL2的引导
下面分析一下u-boot程序是如何从SD卡中把BL2和ENV引导出来的。
系统在BL1中首先执行的是cpu目录下对应平台的目录中有一个启动文件start.S, 当执行到blmovi_bl2_copy时, 这时PC指针要跳转到当前目录下的movi.c文件中执行movi-bl2-copy程序。movi-bl 2-copy中执行CopyMovitoMem (HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint*) BL2_BASE, MOVI_INIT_REQUIRED) 指令。而Copy Movito Mem是i ROM启动后提供给用户的一个函数, 函数的指针在0×0C004008地址中, 包含5个参数。还提供了一个SD/MMC卡总扇区的参数, 存放在0×0C003FFC地址中。参数MOVI_BL2_POS是要从SD/MMC中拷贝的第几个扇区开始, 参数MOVI_BL2_BLKCNT为拷贝扇区的数目, BL2_BASE为拷贝到什么位置上。
从movi.h中可以看出, MOVI_BL2_POS是SD/MMC中的总扇区数减去562个扇区, 如果是SDHC卡则为SDHC的总扇区数减去1 586个扇区。MOVI_BL2_BLKCNT是512个扇区也就是前面说到的256 kB。BL2_BASE是0×C7E00000, 为内存中代码存储的地址, 这个地址是通过MMU把0×57E00000影射到0×C7E00000中的。这样u-boot中就实现了BL2段代码的拷贝。并且也知道了应该把BL2放到SD卡的什么位置上。
同样的道理, 我们可以得到ENV段中的环境变量放在哪里, 只不过这次没有用到i ROM中提供的拷贝函数接口, 而是直接使用BL2中对SD卡读写的函数。这里直接给出ENV放到SD卡中的BL2和BL1中间的32个扇区的位置上。
代码拷贝完后, PC指针是如何跳到BL2中运行的呢?在启动文件start.S中有一条指令为ldrpc, _start_armboot, 而start_armboot是在BL2中的程序, 这样就实现了BL1到BL2的转换过程。但是, PC指针实际是跳到了start_armboot在编译时的地址, 因此在拷贝BL2时是把整个的u-boot.bin搬运到原来设计的地址。这样就保证以后所有的程序都在原本设计的位置开始运行。
3.3 Ke rne l的引导
通过上述可以了解到系统从BL0引导BL1, 从BL1引导BL2, 在BL2中获取了ENV中的环境变量。但是对于Linux内核如何引导到内存还一直不清楚。
其实Kernel是通过ENV中设置的环境变量引导的。在BL2中, u-boot会从SD卡读取ENV中的环境变量并且利用crc32来校验环境变量是否正确。如果校验正确则使用ENV中的环境变量。如果错误则使用u-boot中默认的环境变量。
我们以系统默认的环境变量为例来说明, 其中系统默认的环境变量为common目录下的env_common.c中的default_environment。d efault_environment中有这条语句“bootcmd=”CONFIG_BOOT-COMMAND。在include目录下smdk6410.h中又定义了#define CON-FIG_BOOTCOMMAND“movi read 32 0×00800000 0×c0008000;bootm 0×c0008000”。当系统执行到引导内核时, 实际上是执行上面命令中的两个命令:
第一个命令执行的是common目录下的cmd_movi.c中的do_movi函数, read参数是表示读操作的意思, 32参数表示从第32个扇区开始操作, 0×00800000个参数表示操作的大小为0×00800000个字节, 0×c0008000表示操作的目的地址从0×c0008000开始。其功能执行的是从SD/MMC的第32个扇区读取大小为0×00800000多的字节到内存中的0×c0008000开始的地址位置上。
第二个命令执行的是common目录下的cmd_bootm.c中的do_bootm函数, 0×c0008000参数表示执行的虚拟地址。其功能是从0×c0008000这个虚拟地址对应的物理地址0×50008000中开始执行程序。
从上面的介绍现在已经了解到Kernel的代码默认应该放到SD卡的第32个扇区开始的位置上, 大小应该在8 M字节以内。并且也知道了内核的执行默认是从物理地址为0×50008000中开始执行的。因此PC指针最后跳到了这个地址上执行, 并且从这以后u-boot的执行权利就交给了Linux的内核。
4 结语
通过SD卡在Samsung公司的S3C6410上引导Linux内核, 已经成功地把Linux的内核启动起来了。对于BL2和ENV在SD卡的存放位置和大小的改变可以通过修改u-boot代码来完成。对于如何把程序写入到SD卡中相应的位置, 我推荐使用Win Hex软件。Win Hex软件的下载和使用非常方便。
下一个阶段的工作就是如何制作文件系统和在整个系统上做属于自己的应用程序, 这是我今后主要研究的方向。
参考文献
[1]USER'S MANUAL S3C6410X RISC Microprocessor Aug22, 2008REV1.10
ARM+Linux 篇10
Linux内核,是Linux操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
嵌入式linux内核指的是针对具体的嵌入式设备硬件平台,裁减掉一些不必要的功能后,针对该具体的硬件平台编译产生的一个Linux内核。嵌入式Linux通常都需要裁减,主要目的是节省系统资源,提高系统运行效率。同时嵌入式Linux作为一种嵌入式操作系统有其得天独厚的优势,主要表现在:
首先,Linux是开放源代码的,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计,遍布全球的众多Linux爱好者又是Linux开发者的强大技术支持;
其次,Linux的内核小、效率高,内核的更新速度很快;
再次,Linux是免费的操作系统,在价格上极具竞争力。
2 Linux内核移植准备
所谓Linux移植就是把Linux操作系统针对具体的目标平台做必要改写之后,安装到该目标平台使其正确的运行起来。这个概念目前在嵌入式开发领域讲的比较多。其基本内容是:获取某一版本的Linux内核源码,根据我们的具体目标平台对这源码进行必要的改写(主要是修改体系结构相关部分),然后添加一些外设的驱动,打造一款适合于我们目标平台(可以是嵌入式便携设备也可以是其它体系结构的PC机)的新操作系统,对该系统进行针对我们目标平台的交叉编译,生成一个内核映象文件,最后通过一些手段把该映象文件烧写(安装)到我们目标平台中。而通常对Linux源码的改写工作难度较大,它要求你不仅对Linux内核结构要非常熟悉,还要求你对目标平台的硬件结构要非常熟悉。所以这部分工作一般由目标平台提供商来完成。我们所要做的就是从其网站上下载相关版本Linux内核的补丁(Patch),把它打到我们的Linux内核上,再进行交叉编译就可以。
其基本过程如下(以Linux2.6.24为例):
到ftp://ftp.arm.linux.org.uk/pub/linux/linux-2.6/上下载Linux2.6.24内核及其关于ARM平台的补丁(如:Patch-2.6.24.gz)。给Linux2.6.24打补丁:使用命令zcat../patch-2.6.24.gz|patch–p1(前面../表示补丁文件放在内核文件上一层目录),
然后准备交叉编译环境:交叉编译环境工具链一般包括binutils(含AS汇编器,LD链接器等),arm-gcc,glibc等。
接下来修改内核目录下的makefile文件,主要是以下几行:
注释掉ARCH:=$(shell uname–m|sed–e s/i.86/i386/-e s/sun4u/sparc64/-e s/arm.*/arm/-e s/sa110/arm/)这一行。
将ARCH:=改为ARCH:=arm
将CROSS_COMPILE:=改为CROSS_COMPILE:=交叉编译工具中arm-linux所在目录/arm-linux-(如:CROSS_COMPILE:=/usr/local/arm/2.95.3/bin/arm-linux-)此后就可以进行编译。
3 关于交叉编译环境
交叉编译环境的建立最重要的就是要有一个交叉编译器。所谓的交叉编译就是:利用运行在某机器上的编译器编译某个源程序生成在另一台机器上运行的目标代码的过程。这里我们主要用到的编译器是arm-linux-gcc,它是gcc的arm改版。无论编译器的功能有多么强大,但它的实质都是一样的,都是把某种以数字和符号为内容的高级编程语言转换成机器语言指令的集合。具体安装和配置工作我们一般不需要自己动手了,只要直接从网上下载相关工具包安装即可。
4 Linux内核裁减
Linux内核移植过程中最重要的一步就是内核裁减。由于目标板硬件平台的不同以及内核版本的不同,所以涉及的内容往往也有很大不同。下面我们以已改造好的ARM-linux,针对ARM2410平台来看看内核的裁减主要涉及的地方。
4.1 Linux内核裁减的配置菜单命令
Linux内核裁减的配置菜单命令有好几个版本,运行:
(1)make config:基于文本的最为传统的配置界面,进入命令行,可以一行一行的配置,这不好使用,并且很烦琐;
(2)make menuconfig:基于文本菜单的配置界面,是字符终端下常用的方式;
(3)make xconfig:基于图形窗口模式的配置界面,Xwindow下推荐使用。
这三个命令中,make xconfig的界面最为友好,如果机器可以使用Xwindow,那么就推荐你使用这个命令,如果不能使用Xwindow,那么就可以使用make menuconfig。界面虽然比上面一个差点,总比make config的要好多了。所有内核配置菜单都是通过Config.in经由不同脚本解释器产生.config,在内核配置完成后就就会在当前目录下产生一个.config的配置文件,当然我们也可以直接修改此文件来配置内核。
选择相应的配置时,有三种选择,它们分别代表的含义如下:
*-----将该功能编译进内核
空-----不将该功能编译进内核
M-----将该功能编译成可以在需要时动态插入到内核中的模块
4.2 Linux内核裁减的配置选项
在内核移植的过程中,最烦杂的事情就是配置内核选项了,但实际配置时大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。
针对ARM2410平台要配置的内核选项主要有:
(1)配置MTD,要使用Cramfs和YAFFS文件系统,首先需要配置MTD;
(2)配置文件系统;
(3)配置系统类型,主要是CPU类型;
5 内核的编译
在完成内核的裁减之后,内核的编译就是一个非常简单的过程。你只要执行以下几条命令就行:
(1)make clean
这条命令是在正式编译你的内核之前先把环境给清理干净。有时你也可以用make realclean或make mrproper来彻底清除相关依赖,保证没有不正确的.o文件存在。
(2)make dep
这条命令是编译相关依赖文件。
(3)make z Image
这条命令就是最终的编译命令。有时你可以直接用make(2.6.X版本上用)或make bz Image(给PC机编译大内核时用)完成后,就会编译出一个压缩内核映像文件,压缩内核映像所在路径为:arch/arm/boot/z Image
(4)make install
这条命令可以把相关文件拷贝到默认的目录,当然在给嵌入式设备编译时这步可以不要,因为具体的内核安装还需要你手工进行。
(5)make modules
这条命令是编译在配置时选择为模块的,即选项前为[M]的。如果你的内核配置选项中有选择编译为模块的,就需要此命令。
(6)make modules_install
这条命令将make modules生成的模块文件复制到相应的目录。在给嵌入式设备编译时这步也可以不需要。
6 结束语
最后我们就可以将上面第三步产生的压缩内核映像文件烧写到嵌入式系统中去,最终完成嵌入式系统内核的移植。
摘要:本文主要介绍了嵌入式Linux内核以及在ARM平台下的编译与移植过程。
关键词:Linux内核,移植,编译
参考文献
[1]孙纪坤,张小全.嵌入式LINUX系统开发技术祥解—基于ARM.北京:人民邮电出版社2006.
[2]魏洪兴,胡亮,曲学楼.嵌入式系统设计与实例开发实验教材—基于ARM9微处理器与Linux操作系统.北京:清华大学出版社,2005.
【ARM+Linux】推荐阅读: