综合资讯 技术文章 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

电子技术 | 技术资料 | 嵌入式系统 | 单片机专题 | DSP专题
EDA/PLD专题 | 电源技术专题 | 电子制作专题 | 其他综合 | 芯片选型

所在的位置:首页在线阅读嵌入式系统ARM技术专辑正文
 
基于S3C44B0X和uClinux的嵌入式平台设计与实现

作者:胡伟松 陈三宝

在现实生活中,嵌入式系统的应用可以说是无所不在,小到电子温度计,大到飞机的自动导航系统。嵌入式应用范围的不断扩大,人们对嵌入式应用越来越高的需求,促使嵌入式系统得到了快速的发展。嵌入式硬件系统具有如下特点: 硬件平台丰富,体系结构各异,计算和存储资源有限等等。不同体系结构的处理器如ARM, PowerPC, MIPS,SH等以及其他硬件设备性能的不断提高使得嵌入式软件系统朝着系统级软件的方向发展,以满足人们对嵌入式系统功能日益复杂的要求。从而使得嵌入式系统的构建与开发是以嵌入式操作系统为核心而进的。

uClinux 是专为无存储器营理单元(MMU )的微制器打造的嵌入式Linux操作系统,S3C44B0X是三星公司生产以ARM7TDMI为内核在国内应用很广泛的嵌入式处理器,本文将 uClinux移植到以S3C44B0X为基础的硬件平台上,在此基础开发各种应用程序。

嵌入式系统的软硬件平台结构图

1 硬件选型

本文选用国内应用比较广泛三星公司以ARM7TDMI为内核的S3C44B0X的处理器,存储器采用2MB16位数据宽度的NOR flash 和8MB16位数据宽度的SDRAM,外部接口用于下载和通信,配备以太网接口来支持网络功能。

2 uClinux 操作系统

由图可以看出,uClinux的系统与标准Linux的架构完全一致。

硬件平台结构图

uClinux框架图

2.1 内存管理

uClinux 是专门针对没有MMU的处理器而设计的,即uClinux无法使用虚拟内存管理技术。实际uClinux采用实存储器管理策略,通过地址总线对物理内存进行直接访问。所有程序中访问的地址都是实际的物理地址,所有的进程都在一个运行空间中运行(包括内核进程)。uClinux仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页,在加载应用程序时程序分页加载。一个进程在执行前,系统必须为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。系统不含MMU带来的另外一个问题是磁盘交换空间无法使用,对于资源有限的嵌入式系统而言,系统执行时如果缺少内存将无法通过磁盘交换来得到改善。

对于功能简单的专用嵌入式设备,内存的分配和管理完全可以由开发人员考虑。

2.2.文件系统

uClinux 系统多采用Romfs文件系统,Romfs是一种相对简单、占用空间较少的文件系统。空间的节约来自于两个方面:首先内核支持Romfs文件系统比支持 ext2文件系统需要更少的代码;其次romfs文件系统相对简单,在建立文件系统超级块(Superblock)需要更少的存储空间。Romfs是只读的文件系统,禁止写操作,因此系统同时需要虚拟盘(RAMDISK)支持临时文件和数据文件的存储。

随着技术的发展,近年来日志文件系统在uClinux系统上得到了较多的应用,其中以支持NOR FLASH的JFFS、JFFS2文件系统和支持NAND FLASH的YAFFS最为流行。这些文件系统都支持掉电文件保护,同时支持标准的MTD驱动。

2.3.多进程管理

由于uClinux没有MMU管理存储器,在实现多个进程时需要实现数据保护。uClinux的虽然支持fork函数,但其实质是和vfork:实际上uClinux所有的多进程管理都通过vfork来实现。

vfork 不拷贝父进程的页面,只是初始化私有的数据结构与准备足够的分页表。调用完成后父子进程事实上共享同一块存储器,因此子进程可以更改父进程的数据及堆栈信息,所有父进程进入睡眠,直到子进程执行exec。当子进程正确开始执行后,将唤醒父进程,使得父进程继续往后执行。这意味着uClinux系统fork 调用完程后,要么子进程代替父进程执行(此时父进程已经休眠)直到子进程调用exit退出,要么调用exec执行一个新的进程。

vfork是uClinux与标准Linux应用程序的开发中最重要的不同之处,只有对vfork与fork两个函数的差异和程序处理有详细的了解才能顺利地完成从Linux到uClinux的程序移植。

2.4uClinux应用程序库

uClinux对glibc库进行了改造,形成了自己的应用程序库uClibc,uClibc节约了内存空间,而且包含了glibc里所有函数。

2.5 可以执行文件格式

uClinux系统采用flat可以执行文件格式,elf是linux采用了文件格式,支持动态连接,flat文件对文件头和一些信息做了简化,缩小了可执行文件的大小。

3 开发环境

开发环境一般由目标系统硬件开发板和宿主PC机组成,uClinux的编译,应用程序的开发和调试由宿主PC完成。目标机运行由宿主机编译和调试好的可执行文件。他们由串口和网口连接。

3.1 建立交叉编译环境

嵌入式系统开发通常通过装有linux的PC机作为宿主机来编译uClinux和应用程序,然后将编译后的可执行文件下载到目标机上。

网上下载GNU开发软件包 arm-elf-tools-20030312.sh.  然后到源码目录下执行

sh arm-elf-tools-20030312.sh

这样在PC机上建立了ARM体系结构的编译器,连接器,调试器。可以用来编译OS内核,制作文件系统等。

3.2 windows下ADS工具

ADS 是ARM公司推出的新一代ARM集成开发工具,已代替SDT。可在windows下运行,方便了windows用户。在硬件开发板完成后,可用ADS各硬件模块进行测试。包括各种应用软件开发工具,如armcc,armcpp,armasm等支持ARM c,c ++,ARM汇编等。

3.3编译uClinux

在宿主机建立了编译环境,就可以编译源代码了。首先要把代码解压缩到你的目录下面:

tar xjvf uClinux-dist-51EDA.tar.bz2

它会把全部的文件解压缩到uClinux-dist 的目录下。然后进入目录

cd uClinux-dist

menuconfig 或者 make xconfig对uClinux 进行配置,订制自己的系统

注意对于编译uClinux,不能简单地通过make 来实现。我们需要有一些特定的步骤才能保

证编译的正确。这是因为uClinux 所需要支持的硬件平台太多了,不能考虑的很周到。为了编译最后得到的镜像文件,我们需要linux 的内核以及romfs。对于我们的S3C44B0X的移植来说,romfs 是被编译到内核里面去的。因此,在编译内核前需要一个romfs。为了得到romfs 的image,我们又需要编译用户的应用程序。而为了编译用户的应用程序,我们又需要编译C 运行库,这里我们用的C 运行库是uClibc。根据上面的分析,我们编译uClinux 的步骤如下:

make dep

为的是在编译的时候知道文件之间的依赖关系,在进行了多次得编译后,make 会根据这个依赖关系来确定哪些文件需要重新编译、哪些文件可以跳过)。

make lib_only

编译uClibc。以后我们编译用户程序的时候需要这个运行库。

make user_only

编译用户的应用程序,包括初始化进程init,和用户交互的bash。

make romfs

它会在uClinux 的目录下生成一个romfs 目录并且把user 目录下的文件、以及vendors 目录下特定系统所需要的文件(我们的vendors 目录是vendors/Samsung/44B0X)组织起来,以便下面生成romfs 的单个镜像所用。

make image

是生成romfs 的镜像文件和生成Linux 的镜像。这个时候由于还没有编译过Linux,因此在执行这一步的时候会报错。但是没有关系,我们在这里需要的仅仅是romfs 的镜像,以便在下面编译Linxu 内核的时候使用。

make linux

有了romfs 的镜像我们就可以编译Linux 了。因为我们的romfs 是嵌入到linux 内核中去了,所以在编译Linux 内核的时候就要一个romfs.o 文件。这个文件是由上面的 make image生成的。

make image

这里再一次 make image 就是为了得到uClinux 的可执行文件的镜像了。执行了这一步之后,就会在images 目录下找到3 个文件:image.ram,image.rom,romfs.img。其中,image.ram和 image.rom 就是我们需要的镜像文件。这个在下面“使用uClinux”会提到。

3.4 加载uClinux内核

uClinux 内核加载到Flash是运行,也可以加载到RAM 中运行。Flash运行方式是把内核的可执行映像下载到flash上,系统从flash某个地址开始运行。上面我们提到了两个文件:image.ram 和image.rom。其中,image.ram 是直接下载到RAM 执行的文件。可载入从ox8000开始的SDRAM中,加载后,修改PC指针寄存器的值为0x8000并执行如果你还处于调试阶段,那么就没有必要把文件烧写到FLASH 里面。这个时候我们可以使用image.ram。对于image.rom 来说,它是一个zImage 文件,也就是自解压的内核。由于它使用了gzip将内核压缩过,所以可以减小文件的大小。这个image 应该烧写到FLASH 的0x10000 的位置,而不能直接下载到RAM 并执行。

4 uClinux的应用开发

上述工作完成了,一个嵌入式软硬件平台就搭建成功,在这个平台之上就可以进行嵌入式应用开发了,嵌入式开发集中在两个方面:驱动程序和用户程序的编写,本文介绍一个经典、简单的程序“ hello,world”应用程序例子,主要说明在uClinux中加入的过程。

第一步:首先在/user/目录下建立自己的文件夹,如取名为myapp,在新建文件夹下编辑应用程序hello.c,然后编写自己的makefile,同样保存在文件夹myapp下。

第二步:在/user/makefile中的适当位置加入下行语句;

Dir_$(CONFIG_USER_MYAPP_HELLO)+=myapp

第三步:在/config/configure.help的适当位置添加以下语句:

CONFIG_USE_MYAPP_HELLO

第四步:在/config/config.in的适当位置添加以下语句:

bool‘hello’CONFIG_USER_MYAPP_HELLO

最后重新编译内核,在make menuconfig时,选中自己的应用程序,完成后在/bin目录可以看到HELLO的可执行文件,通过控制台直接输入该文件就可以运行.烧写image.rom, 运行

>hello 可看到输出“hello,world”

5 结束语

本文首先简单介绍了S3C44B0X硬件开发平台结构和uClinux的特点,然后介绍了开发工具。特别对uClinux的内核的编译进行了详细的分析,最后用一个实例说明了应用程序的添加过程,这样就可以在此基础上进行各种驱动程序和应用程序的开发了。


返回 上一页 下一页   信息发布:工号01   转引自: 【 】 【打印】 【关闭

关于我们 ┋ 友情链接


深圳市福田区海滨广场福业大厦12C
电话:0755-88305880 25960580 传真:0755-88305880
Copyright©2005-2007 无忧电子开发网版权所有

粤ICP备05064233号