分类:
2006-06-01 10:45:24
目前Linux已被广泛应用于信息家电、数据网络、工业控制、医疗卫生、航空航天等众多领域。在嵌入式领域,由于价格低廉、结构小巧的各种微处理器的出现为外设连接提供了稳定可靠的硬件架构,限制嵌入式系统发展的瓶颈就突出表现在软件方面。
尽管从20世纪80年代末开始,陆续出现了一些嵌入式操作系统,比较著名的有VxWorks、pSOS、Neculeus和Windows CE。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步,并且其源代码的封闭性也大大限制了开发者的积极性。
结合中国实情,当前国家对自主操作系统的大力支持,为开放源码的Linux的推广提供了广阔的发展前景。对上层应用开发者而言,嵌入式系统需要的是一套高度简练、界面友善、质量可靠、应用广泛、易开发、多任务,并且价格低廉的操作系统。Linux对厂商不偏不倚而且成本极低,因此很快成为用于各种设备的操作系统。如今,业界已经达成共识:即嵌入式Linux是大势所趋,其巨大的市场潜力与酝酿的无限商机必然会吸引众多的厂商进入这一领域。
Linux 正在嵌入式开发领域稳步发展。因为 Linux 使用 GPL,所以任何对将 Linux 定制于自己特定开发板或PDA、掌上机、可佩带设备感兴趣的人都可以从因特网免费下载其内核和应用程序,并开始移植或开发。许多 Linux 改良品种迎合了嵌入式市场。它们包括RTLinux(实时Linux)、μCLinux(用于非 MMU 设备的Linux)、Montavista Linux(用于ARM、MIPS、PPC的Linux分发版)、ARM-Linux(ARM上的Linux)和其他Linux系统。
嵌入式Linux的发展比较迅速。NEC、索尼已经在销售个人视频录像机等基于Linux的消费类电子产品,摩托罗拉则计划在其未来的大多数手机上使用Linux,IBM也制定了在手持机上运行Linux的计划。
数年来,“Linux标准库”组织一直在从事对在服务器上运行的Linux进行标准化的工作,现在,嵌入式计算领域也开始了这一工作。嵌入式Linux标准吸引了“Linux标准库”以及UNIX组织中有益的元素。
虽然大多数 Linux 系统运行在 PC 平台上,但 Linux 也可以作为嵌入式系统的操作系统。Linux 的安装和管理比 UNIX 更加简单灵活,这对于那些 UNIX 专家们来说又是一个优点,因为 Linux 中有许多命令和编程接口同传统的 UNIX一样。但是对于习惯于Windows操作系统的人来说,需要记忆大量的命令行参数却是一个缺点。随着Linux社团的不断努力,Linux的人机界面开发环境正在不断完善。
典型的Linux系统经过打包,在拥有硬盘和大容量内存的 PC 机上运行,而嵌入式系统不需要这么高的配置。一个功能完备的 Linux 内核要求大约 1 MB 内存。而 Linux 微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用系统约100KB内存。只要有 500KB的内存,一个有网络栈和基本实用程序的完全的 Linux 系统就可以在一台 8 位总线(SX)的 Intel 386 微处理器上运行得很好了。由于内存要求常常是由应用的需要所决定的,例如 Web 服务器或者 SNMP 代理,Linux 系统甚至可以仅使用 256 KB ROM 和 512 KB RAM 进行工作。因此它是一个瞄准嵌入式市场的轻量级操作系统。
与传统的实时操作系统(RTOS)相比,采用像嵌入式 Linux 这样的开放源码的操作系统的另外一个好处是 Linux 开发团体看来会比 RTOS 的供应商更快地支持新的 IP 协议和其他协议。例如,用于 Linux 的设备驱动程序要比用于商业操作系统的设备驱动程序多,如网络接口卡(NIC)驱动程序以及并口、串口驱动程序。
Linux 操作系统本身的微内核体系结构相当简单。网络和文件系统以模块形式置于微内核的上层。驱动程序和其他部件可在运行时作为可加载模块编译到或者是添加到内核。这为构造定制的可嵌入式系统提供了高度模块化的构件方法。而在典型情况下该系统需结合定制的驱动程序和应用程序以提供附加功能。
嵌入式系统也常常要求通用的功能,为了避免重复劳动,这些功能的实现运用了许多现成的程序和驱动程序,它们可以用于公共外设和应用。Linux 可以在外设范围广泛的多数微处理器上运行,并早已经具备了现成的应用库。
Linux用于嵌入式的因特网设备也是很合适的,原因是它支持多处理器系统,该特 性使Linux具有了伸缩性。因而设计人员可以选择在双处理器系统上运行实时应用,提高整体的处理能力。例如,可以在一个处理器运行GUI,同时在另一个处理器上运行Linux系统。
在嵌入式系统上运行 Linux 的一个缺点是 Linux 体系提供实时性能需要添加实时软件模块。而这些模块运行的内核空间正是操作系统实现调度策略、硬件中断异常和执行程序的部分。由于这些实时软件模块是在内核空间运行的,因此代码错误可能会破坏操作系统从而影响整个系统的可靠性,这对于实时应用将是一个非常严重的弱点。尽管如此,已经有许多嵌入式 Linux 系统的示例,可以有把握地说,某种形式的 Linux 能在几乎任一台执行代码的计算机上运行。
嵌入式Linux可以运行的硬件平台十分广泛,从x86、MIPS、POWERPC到ARM,以及其他许多硬件体系结构。目前在世界范围内,ARM体系结构的SOC逐渐占领32位嵌入式微处理器市场,并且在国内市场上很容易购买到ARM核的嵌入式处理器,我们所介绍的硬件平台也是基于ARM体系结构的,由北京博创兴业科技有限公司开发的UP-NetARM3000和UP-NetARM2410/UP-NetARM2410-S实验仪器。
UP-NetARM3000的CPU为AMR7TDMI内核的三星S3C44B0X01芯片,由于没有MMU,只能运行μCLinux,UP-NetARM2410的CPU为AMR920T内核的三星S3C2410芯片,由于有MMU,就可以运行标准的ARM-Linux内核。通过这两个平台,可以学习嵌入式Linux中的针对有MMU和无MMU的不同开发过程。UP-NetARM3000及其他产品的资 料可以访问博创公司的网站获得。这里针对UP-NetARM2410作详细的介绍。
UP-NetARM2410的硬件配置如表1-1所示,实物如图1-1所示。
表1-1 UP-NetARM2410的硬件配置
配 置 名 称 |
型 号 |
规 格 |
CPU |
ARM920T结构芯片三星S3C2410X |
工作频率为203MHz |
以太网 |
AX88796 |
10/100Mbps自适应 |
Flash盘 |
SAMSUNG K29F2808 |
64MB |
内存SDRAM |
HY57V561620BT-H |
32MB×2=64MB |
LCD |
STN 240×320 256色 TFT 640×480 24位色 |
|
键盘LED数码管驱动器 |
ZLG7290 |
17键数字小键盘 |
触摸屏 |
FM7843驱动 |
|
USB主从接口 |
USB1.1 |
|
串口 |
RS232 |
2个 |
AD |
3个电位器控制输入 |
|
调试接口 |
JTAG,14针、20针 |
JTAG烧写Flash |
音频输出 |
IIS总线,UDA1341芯片,44.1kHz音频 |
|
扩展插槽 |
3个168Pin |
总线直接扩展 |
DA扩展板 |
|
DA转换 |
SD卡扩展板 |
|
|
GPS_GPRS扩展板 |
SIMCOM的SIM100-E模块 |
支持双道语音通信 |
PS/2&IC_CARD扩展板 |
|
外接键盘鼠标和IC卡 |
CAN扩展板 |
|
|
IDE_CF卡展板 |
|
|
图1-1 UP-NetARM2410实物图
(1)S3C2410X芯片集成了大量的功能单元,包括:
n 内部1.8V,存储器3.3V,外部I/O3.3V,16KB数据CACHE,16KB指令CACHE,MMU。
n 内置外部存储器控制器(SDRAM 控制和芯片选择逻辑)。
n LCD控制器,一个LCD专用DMA。
n 4个带外部请求线的DMA。
n 3个通用异步串行端口(IrDA1.0, 16-Byte Tx FIFO, and 16-Byte Rx FIFO),2通道SPI。
n 一个多主I2C总线,一个I2S总线控制器。
n SD主接口版本1.0和多媒体卡协议版本2.11兼容。
n 两个USB HOST,一个USB DEVICE(VER1.1)。
n 4个PWM定时器和一个内部定时器。
n 看门狗定时器。
n 117个通用I/O。
n 24个外部中断。
n 电源控制模式:标准、慢速、休眠、掉电。
n 8通道10位ADC和触摸屏接口。
n 带日历功能的实时时钟。
n 芯片内置PLL。
n 设计用于手持设备和通用嵌入式系统。
n 16/32位RISC体系结构,使用ARM920T CPU核的强大指令集。
n 带MMU的先进的体系结构支持WinCE、EPOC32、Linux。
n 指令缓存(CACHE)、数据缓存、写缓冲和物理地址TAG RAM,减小了对主存储器带宽和性能的影响。
n ARM920T CPU 核支持 ARM 调试的体系结构。
n 内部先进的位控制器总线(AMBA)(AMBA2.0,AHB/APB)。
S3C2410X芯片其结构图如图1-2所示。
图1-2 S3C2410X芯片
(2)系统管理
n 小端/大端支持。
n 地址空间:每个BANK128MB(全部为1GB)。
n 每个BANK可编程为8/16/32位数据总线。
n BANK 0到BANK 6为固定起始地址。
n BANK 7可编程BANK起始地址和大小。
n 一共8个存储器BANK。
n 6个存储器BANK用于ROM、SRAM和其他。
n 两个存储器BANK用于ROM、SRAM和同步DRAM。
n 每个存储器BANK可编程存取周期。
n 支持等待信号用以扩展总线周期。
n 支持SDRAM掉电模式下的自刷新。
n 支持不同类型的ROM用于启动(NOR/NAND Flash、EEPROM和其他)。
(3)芯片封装
272-FBGA封装图如图1-3所示。
图1-3 272-FBGA封装图
在一个嵌入式系统中使用Linux开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过如下的过程:
操作系统一般使用RedHat-Linux,版本从7到9都可以,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(例如arm-Linux-gcc、arm-μclibc-gcc),或者安装产品厂家提供的交叉编译器。
配置MINICOM,一般的参数为波特率为115 200bps,数据位为8位,停止位为1,无奇偶校验,软件硬件流控设为无。在Windows下的超级终端的配置也是这样的。MINICOM软件的作用是作为调试嵌入式开发板的信息输出的监视器和键盘输入的工具。配置网络,主要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。
从网络上下载一些公开源代码的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据自己具体的芯片进行移植修改。有些芯片没有内置引导装载程序,例如三星的ARM7、ARM9系列芯片,这样就需要编写开发板上Flash的烧写程序,网络上有免费下载的Windows下通过JTAG并口简易仿真器烧写ARM外围Flash芯片的烧写程序,也有Linux下的公开源代码的J-Flash程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是系统正常运行的第一步。如果购买了厂家的仿真器当然比较容易烧写Flash,这对于需要迅速开发自己产品的人来说可以极大地提高开发速度,但是其中的核心技术是无法了解的。
如μCLinux、ARM-Linux、PPC-Linux等,如果有专门针对所使用的CPU移植好的Linux操作系统那是再好不过的,下载后再添加自己的特定硬件的驱动程序,进行调试修改,对于带MMU的CPU可以使用模块方式调试驱动,对于μCLinux这样的系统则需编译进内核进行调试。
从下载使用BUSYBOX软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等,自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs、genromfs等工具产生烧写映像文件。
一般使用JFFS2或YAFFS文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性Flash(NOR型)512KB~32MB,有的系统使用非线性Flash(NAND型)8~512MB,有的两个同时使用,需要根据应用规划Flash的分区方案。
应用程序可以放入根文件系统中,也可以放入YAFFS、JFFS2文件系统中,有的应用不使用根文件系统,直接将应用程序和内核设计在一起,这有点类似于μCOS-II的方式。
开发环境有以下几个方案:
(1)基于PC机Windows操作系统下的CYGWIN。
(2)在Windows下安装虚拟机后,再在虚拟机中安装Linux操作系统。
)直接安装Linux操作系统。
由于基于Windows的环境要么有兼容性问题,要么速度有影响,所以推荐读者使用纯Linux操作系统环境。我们实际的开发环境为RedHat 9.0,它已经支持中文,并且包含了绝大部分的开发工具,不用担心装了Linux就不能使用Windows的问题,一般的情况都是用户已经有了Windows操作系统,再安装Linux,Linux会自动安装一个叫做GRUB的启动引导软件,可以选择引导多个操作系统。
绝大多数的Linux 软件开发都是以native方式进行的,即本机(HOST)开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即嵌入式目标系统)运行开发工具和调试工具。通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC 机)上,对应的开发板叫做目标板。
运行Linux的PC(宿主机)开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行)。然后把可执行文件下载到目标机上运行。调试时的方法很多,可以使用串口、以太网口等,具体使用哪种调试方法可以根据目标机处理器所提供的支持作出选择。宿主机和目标板的处理器一般都不相同,宿主机为Intel处理器,而目标板如UP-NETARM2410开发板为三星S3C2410。GNU编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标机从而建立开发环境。所以在进行嵌入式开发前第一步的工作就是要安装一台装有指定操作系统的PC机作为宿主开发机,对于嵌入式Linux,宿主机上的操作系统一般要求为RedHat Linux。嵌入式开发通常要求宿主机配置有网络,支持NFS(为交叉开发时mount所用)。然后要在宿主机上建立交叉编译调试的开发环境。环境的建立需要许多的软件模块协同工作,这将是一项比较繁杂的工作,但现在已完全由博创嵌入式教学套件中光盘的安装而自动完成了。
由于RedHat 9.0安装后占用空间约为2.4~5GB之间,还要安装ARMLinux开发软件,因此对开发计算机的硬盘空间要求较大。
硬件要求如下:
n CPU:高于奔腾500MB,推荐高于赛扬1.7GB。
n 内存:大于128MB,推荐256MB。
n 硬盘:大于10GB,推荐高于40GB。
在一台PC上安装RedHat Linux 9.0,选择Custom定制安装,在选择软件包时最好将所有包都安装,需要空间约2.7GB,如果选择最后一项:everything,即完全安装,将安装3张光盘的全部软件,需要磁盘空间大约5GB。因此建议提前为RedHat Linux的安装预留大约5~15GB的空间,具体视用户的硬盘空间大小来确定,在安装完RedHat后还要安装Linux的编译器和开发库以及ARMLinux的所有源代码,这些包安装后总共需要的空间大约为800MB。
配置网络,包括配置IP地址、NFS服务器和防火墙。网络配置主要是要安装好以太网卡,对于一般常见的RTL8139网卡,RedHat 9.0可以自动识别并自动安装好,完全不要用户参与,因此建议使用该网卡。然后配置宿主机IP为192.168.0.121。如果在有多台计算机使用的局域网环境使用该开发设备,IP地址可以根据具体情况设置,如图1-4所示。
图1-4 网络配置
双击设备eth0的蓝色区域,进入以太网设置界面,如图1-5、图1-6所示。
图1-5 以太网常规设置界面
图1-6 以太网路由设置界面
对于RedHat 9.0,它默认的是打开了防火墙,因此对于外来的IP 访问它全部拒绝,这样其他网络设备根本无法访问它,即无法用NFS mount,许多网络功能都将无法使用。因此网络安装完毕后,应立即关闭防火墙。操作如下:单击“红帽子”开始菜单,选择安全级别设置,选中“无防火墙”选项,如图1-7所示。
在系统设置菜单中选择服务器设置菜单,再选中服务菜单,将iptables服务取消,并确保nfs选项选中。
图1-7 安全级别设置
配置NFS的步骤如下:
单击主菜单“系统设置”→“服务器设置”→“NFS服务器”命令(英文为:SETUP→ SYSTEM SERVICE→NFS),单击“增加”按钮出现如图1-8所示的界面在目录(Drictory)中输入需要共享的路径,在主机(Hosts)中输入允许进行连接的主机IP地址,并选择允许客户对共享目录的操作为只读(Read-only)或读写(Read/Write)。
图1-8 NFS基本设置
如图1-9所示为一些常规选项设置,可以保留默认值。
图1-9 NFS常规设置
如图1-10所示为对客户端存取服务器的一些其他设置,一般不需要设置,取默认值。
图1-10 NFS用户访问设置
当将远程根用户当作本地根用户时,对于操作性比较方便,但是安全性较差。最后退出时则完成NFS 配置。配置好后,应显示如图1-11所示的界面。
图1-11 配置好的NFS界面
也可以手工编写/etc/exports文件,其格式如下:
共享目录可以连接的主机(读写权限,其他参数)
例如:
/arm2410 192.168.0.*(rw,sync)
表示将本机的/arm2410目录共享给IP地址为192.168.0.1-192.168.0.254的所有计算机,可以读取和写入。
配置完成后,可用如下办法简单测试一下NFS 是否配置好了:在宿主机上自己挂载(mount)自己,看是否成功就可以判断NFS 是否配好了。例如在宿主机/目录下执行命令:
mount 192.168.0.10:/arm2410 /mnt
其中192.168.0.10应修改为自己主机的IP地址。
然后到/mnt/目录下看是否可以列出/ arm2410 目录下的所有文件和目录,如果可以则说明mount 成功,NFS 配置成功。
将北京博创兴业科技有限公司提供的附带开发工具光盘插入CDROM,然后执行以下命令:
mount /dev/cdrom /mnt
若系统不识别/dev/cdrom,可以执行如下命令,假设CDROM为从盘,即为/dev/hdb,则:
mount –t iso9660 /dev/hdb /mnt
cd /mnt (进入mount 后的目录)
如果CDROM在安装RedHat 的时候已经默认安装,以上命令不要执行,直接进入CDROM 所在目录(一般为/mnt/cdrom)。这种情况下,则执行命令:
cd /mnt/cdrom
./install.sh (运行安装脚本)
安装脚本程序将自动建立/ arm2410 目录,并将所有开发软件包安装到/ arm2410 目录下,同时自动配置编译环境,建立合适的符号连接。
表1-2为Linux开发软件的安装目录说明,均以/arm2410目录为起点。
表1-2 /arm2410下的文件说明
目 录 名 |
说 明 | |
busybox-1.00-pre10 |
Busybox-1.00源代码 | |
editor |
Linux 下编辑编译器 | |
doc |
Arm2410forLinux 使用说明书 | |
microwindows-0.9 |
MicroWindows图形系统源代码 | |
insight-6.0 |
Linux下源代码查看器 | |
Rootfs |
开发板中根目录下文件 | |
Kernel |
ArmLinux内核源代码 | |
Demo |
所有实验演示程序 | |
mplayerdemo |
多媒体演示程序 | |
minigui_src |
做minigui实验需要的资源,需要按照指导书安装 | |
img |
root.cramfs |
根文件系统映像文件,可以直接写入Flash中 |
zImage.bin |
ARMLinux-2.4内核压缩映象文件,可以直接写入Flash中 | |
exp |
所有实验的源代码 | |
sh |
install.sh 安装脚本 uninstall.sh 反安装脚本 mount-dos.sh Linux下挂装Windows的分区示例脚本 mk_romfs_img.sh 生成根文件系统映像文件示例脚本 mnt_udisk.sh MOUNT U盘 |
编译器安装路径说明如表1-3所示。
表1-3 编译器安装路径说明
编 译 器 |
安 装 路 径 |
说 明 |
arm-elf-gcc-2.95.3 |
/opt/host/armv4l |
应用开发库和头文件 |
Armv4l-unknown-Linux-gcc |
/opt/host/armv4l/bin |
主编译器 |
上述诸多程序的源代码都在光盘中提供。
在安装完成Linux后,就是对Linux的网络环境的配置,最主要是配置NFS服务器。