分类:
2006-06-01 09:28:00
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
目录
第一章 产品简介...................................................................................................... 4
第二章 软件系统...................................................................................................... 8
2.1 使用说明...................................................................................................... 11
2.1.1 建立宿主机开发环境.......................................................................... 11
2.1.2 文件与目录结构.................................................................................. 20
2.1.3 GNU 编译器(gcc)、链接器等全套工具集....................................... 25
2.1.4 BDM 调测工具(chk)......................................................................... 33
2.1.5 以太网下载和烧写FLASH 工具(gdbtftpflash) .......................... 40
2.1.6 默认烧制的嵌入式LINUX 系统.......................................................... 47
2.1.7 USB 支持.............................................................................................. 48
2.1.8 bootloader ............................................................................................ 50
2.1.9 FLASH 扇区保存IP 方式...................................................................... 52
2.2 软件应用开发............................................................................................... 55
2.2.1 开发模式............................................................................................... 55
2.2.2 应用程序调试方法................................................................................ 57
2.2.3 如何创建编译自己的应用.................................................................... 61
2.2.4 如何移植软件........................................................................................ 63
2.2.5 关于多进程............................................................................................ 64
2.3 设备驱动开发............................................................................................... 65
2.3.1 简介....................................................................................................... 66
2.3.2 设备驱动程序的框架............................................................................ 69
2.3.3 设备驱动编程注意事项...................................................................... 70
2.3.4 添加自己的设备驱动............................................................................ 71
2.3.5 RAM版调试内核................................................................................... 73
华恒科技 HHCF5272-R1 技术手册 第 2 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
第三章 硬件系统.................................................................................................... 76
3.1 功能模块结构图........................................................................................... 76
3.2 各个部分的构成........................................................................................... 77
3.3 内存映射....................................................................................................... 78
3.4 总线............................................................................................................... 79
3.5 端口分配....................................................................................................... 80
3.6 片选分配...................................................................................................... 81
3.7 中断分配...................................................................................................... 81
3.8 外设接口图.................................................................................................. 82
3.9 接口管脚说明.............................................................................................. 84
第四章 机械特性.................................................................................................... 93
第五章 底板的硬件设计........................................................................................ 96
5.1 基本板的设计............................................................................................... 96
5.2 用户底板原理性设计和硬件方案制定....................................................... 97
5.2.1 基本端口的设计.................................................................................... 97
5.2.2 电源的设计............................................................................................ 97
5.2.3 其它电路部分的设计.......................................................................... 100
5.2.4 PCB 设计和排版时的注意事项.......................................................... 100
5.2.5 PCB 在电路稳定性和抗干扰方面的考虑.......................................... 101
第六章 售后服务及技术支持.............................................................................. 102
附录........................................................................................................................ 103
附录A 系统初始化........................................................................................... 103
附录B LINUX 常见术语.................................................................................... 113
附录C 常用LINUX 命令................................................................................... 116
华恒科技 HHCF5272-R1 技术手册 第 3 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
附录D GCC 与GDB ............................................................................................... 133
附录E MAKEFILE ................................................................................................. 141
附录F UCLINUX 系统分析................................................................................ 147
uClinux 简介.................................................................................................. 147
uClinux 小型化的做法.................................................................................. 147
uClinux 的开发环境...................................................................................... 149
uClinux 的内存管理...................................................................................... 153
工具及内核................................................................................................... 163
附录G 参考资料............................................................................................... 165
华恒科技 HHCF5272-R1 技术手册 第 4 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
第一章 产品简介
华恒HHCF5272-R1 套件是一套完整的基于摩托罗拉MCF5272 处理器
的嵌入式开发平台。华恒HHCF5272-R1 套件由核心板(HHCF5272-K1)
和底板(外设板或称基本板)组成,核心板上集成摩托罗拉 MCF5272 处
理器,16M SDRAM 以及4M 的FLASH,为用户的软件研发提供了足够
的空间。底板上则提供非常丰富的外设接口:一个10M/100M 自适应快速
以太网接口、两个RS-232 串口、一个USB 口及一个BDM 调试口。核心
板和底板配合即构成一个最小的完整应用系统。系统具有体积小、耗电低、
处理能力强、网络功能强大等特点,能够装载和运行嵌入式Linux 操作系
统。用户可以在这个系统平台上进行自主软件开发,并对HHCF5272-R1
进行测试和评估,也可在保持核心板不变的情况下,针对具体的应用通过
对底板的更改来实现定制自己的应用系统。HHCF5272-R1 套件中提供底板
硬件电路图及硬件设计文档,并在本手册中给出所有管脚说明及信号定
义,极大的方便了用户进行硬件扩展开发。
华恒HHCF5272-R1 套件提供完备的嵌入式LINUX 开发环境及丰富的
开发调测工具软件。
MCF5272 微处理器是迄今为止摩托罗拉推出的最高集成度的ColdFire
微处理器。凭借附加的10/100 以太网控制器和一个USB 模块,MCF5272
集成通信微处理器将ColdFire 系列的集成水平提升至更高。这款处理器不
仅提供了一套新的通信外围设备,同时还包含了以往ColdFire 标准产品所
具备的广受欢迎的通用外围设备处理器。MCF5272 扩展的外围设备组加之
诱人的价格使这款高集成的ColdFire 微处理器成为一款广泛适用于各类嵌
入式应用的优秀配备,这些应用包括互联网设备、LAN 电话技术、低端网
络控制、工业控制、图像和存储等等。
MCF5272 微处理器是基于第二代ColdFire 核心版本(V2)ColdFire 核心
华恒科技 HHCF5272-R1 技术手册 第 5 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
而設計。它采用智能DigitalDNA 技术,在66MHz 下操作速度为63Dhrystone
2.1MIPS,能够达到迄今最高的V2 性能。 ColdFire 产品的系统结构提供
优秀的编码密度,同時达到出色的系统性能水平。由于MCF5272 共用68K
的编程模式,并为通信外围设备组的需要而提供了更高性能选择,MCF5272
是68302 系列产品的重要补充。
MCF5272 微处理器具有精彩的新型外围设备:
&<048766; 快速以太网媒体存取控制(MAC),支持100Mbps MII,10Mbps MII
和 10Mbps 7 线实际接口
&<048766; 符合USB1.1 标准,可操作内外收发器的设备控制器(device controller)
&<048766; 时分多工(TDM)控制器,可使产品以物理级水平与外部编码、ISDN
收发器以及其它使用GCI(General Circuit Interface)或IDLI(Interchip
Digital Link)串行接口协议的外围设备连接
&<048766; 多信道HDLC 软件模块
&<048766; QSPI 模块,提供带有序列传输性能的串行外围接口
&<048766; 用于控制应用的脉冲宽度调制(PWM)单元
&<048766; MCF5272 设备同时还提供许多嵌入式应用产品所共有的外围产品,如
SDRAM 控制器、DMA、计时器、UART、芯片选择、通用I/O、片
上存储以及世界级的ColdFire 除错模块,所有这些都采取高效节省的
方式,从而减少系统成本,加速系统设计。
MCF5272 微处理器的推出基于业界标准的68K 系列,并通过为68K
和ColdFire 微处理器用户提供一个兼容的环境用以发挥世界级的第三方开
发工具、软件和对程序的熟识度,将68K 系列的成功发扬光大。
处理器特性
* V2ColdFire 处理器
* 1 Kbyte 指令高速缓冲存储器
* 4 Kbyte SRAM
* 乘法及累计单元 (MAC)
* 硬件整数除法单元
华恒科技 HHCF5272-R1 技术手册 第 6 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
* 业界先进的除错模块,提供背景和实时性能
* 高集成处理器
- 符合IEEE 802.3 、10/100 快速以太网控制器(FEC),有专用
DMA
- USB1.1 设备控制器和收发器
- 4 个2B+D TDM 端口
- HDLC 软件模块
- QSPI
- 3 个PWM 输出
- 2 个UART
- 1 信道DMA 【仅限CPU 内部使用】
- 8 芯片选择
- 16 位通用I/O
- 4 个16 位计时器
- SW 监视器计时器
* 休止模式
处理器产品规格:
* 63 Dhrystone 2.1MIP @ 66MHz
* 0°C ~ 70°C 操作温度
* 0.35μmTLM 内执行
* 3.3-V 电源,5-V I/O 容差
* 196 脚MAPBGA 封装
华恒HHCF5272-R1 套件硬件主要构造:
&<048698; MCF5272 处理器
&<048698; 4Mbytes 16 位FLASH
&<048698; 16Mbytes 32 位SDRAM
华恒科技 HHCF5272-R1 技术手册 第 7 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
&<048698; 10/100 Base-T 自适应快速以太网接口
&<048698; RS-232 接口(两个)
&<048698; BDM 接口
&<048698; 9V 直流电源
&<048698; H/W 复位建
&<048698; 电源、运行及以太网状态指示LED 灯
套件的标准配置由核心板、底板(外设接口板)、9V 直流电源变压器、
BDM 接口卡及BDM 线、USB 线、串口线、软件安装光盘、技术手册以
及配置清单组成。
套件简单检测:
用户拿到套件后,打开包装,用串口线将串口1 与一台WINDOWS PC
机的串口1 连接起来(不要插BDM),在“开始”->“程序”->“附件”
->“通讯”中打开超级终端,选择COM1,波特率19200,无硬件流控。
然后将9V 直流电源接到板子上,这时在超级终端便可看到板子上嵌入的
Linux 操作系统的启动信息打印出来,并最终进入提示符状态。这是检测
套件软硬件工作是否正常的最为简捷的方法。
进一步检测串口2:
参见后面2.1.4 节“BDM 调测工具”的“串口2 检测”部分。
检测USB 口:
参见后面2.1.7 节“USB 支持”部分,即用WINDOWS 端的usbshell
工具来检测。
若以上检测有问题,请立即与华恒公司联系:0551-3638368 或0551
-3652357,华恒公司将立即给您更换产品。
【注意】
串口线,BDM 线都不能带电拔插!
华恒科技 HHCF5272-R1 技术手册 第 8 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
第二章 软件系统
HHCF5272-R1 为一台采用MOTOROLA COLDFIRE5272 处理器、提供以太
网接口、RS232 接口、安装有LINUX 操作系统的开发原型机,其功用相当
于一台装有REDHAT LINUX,装有网卡和串口的PC 机。对于HHCF5272-R1,
它提供的所有软件(操作系统和应用软件)都固化在板上两片FLASH 内,
就相当于PC 机的硬盘。FLASH 上的内容可通过烧写工具来更新升级。用户
可为HHCF5272-R1 开发应用程序或更改其上的操作系统工作方式(因为操
作系统是开放源代码的),和在PC 上开发应用唯一的不同之处在于它要采
用一种交叉编译的开发模式,即为HHCF5272-R1 开发应用,不能直接在
HHCF5272-R1 板子上编辑、编译和调试,而必须把这些工作寄宿到另一台
PC 机上去完成。详细介绍请参见后面章节。
随着微处理器的产生,价格低廉、结构小巧的CPU 和外设连接提供
了稳定可靠的硬件架构,那么限制嵌入式系统发展的瓶颈就突出表现在了
软件方面。尽管从八十年代末开始,陆续出现了一些嵌入式操作系统,比
较著名的有Vxwork、pSOS、Neculeus 和Windows CE。但这些专用操作
系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;
而且,源代码封闭性也大大限制了开发者的积极性。另外,结合国内实情,
当前国家对自主操作系统的大力支持,也为源码开放的LINUX 的推广提
供的广阔的发展前景。还有,对上层应用开发者而言,嵌入式系统需要的
是一套高度简练、界面友善、质量可靠、应用广泛、易开发、多任务,并
且价格低廉的操作系统。在不久的将来,从冰箱到收音机都会内置处理器。
因为Linux 的开放性,许多人认为Linux 非常适合多数Internet 设备。他们
认为Linux 可以支持不同的设备,支持不同的配置。Linux 对厂商不偏不
倚而且成本极低,能够很快成为用于各种设备的操作系统。如今,业界已
经达成共识:即嵌入式linux 是大势所趋,其巨大的市场潜力与酝酿的无
华恒科技 HHCF5272-R1 技术手册 第 9 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
限商机必然会吸引众多的厂商进入这一领域。
嵌入式操作系统主要有 Palm OS,Windows CE,EPOC,LinuxCE,
QNX,ECOS,LYNX,高端嵌入式系统要求许多高级的功能,如图形用
户界面和网络支持。很多高端RTOS 供应商已经提供了这些功能,但其
价格也很高端,一般人难以接受。微软的Windows CE 也有此类功能,却
不具备大多数嵌入式系统要求的实时性能,而且难以移植,也曾经有人想
以DOS 为基础用单独的第三方工具拼凑一个系统,但这种努力将是白费。
现在需要的是一个便宜、成熟并且提供高端嵌入式系统所必须特性的操作
系统,嵌入式Linux 操作系统以价格低廉、功能强大又易于移植而正在被
广泛采用,成为新兴的力量,所以,众多商家纷纷转向了嵌入式LINUX。
Linux 为嵌入操作系统提供了一个极有吸引力的选择,它是个和Unix
相似、以核心为基础的、完全内存保护、多任务多进程的操作系统。支持
广泛的计算机硬件,包括MOTOROLA,X86,Alpha,Sparc,MIPS,PPC,
ARM,NEC 等现有的大部分芯片。软件源码全部公开,任何人可以修改
并在GNU 通用公共许可证(GNU General Public License)下发行,这样,开发
人员可以对操作系统进行定制,再也不必担心像MS WINDOWS 操作系统
中“后门”的威胁。同时由于有GPL 的控制,大家开发的东西大都相互兼
容,不会走向分裂之路。Linux 用户遇到问题时可以通过Internet 向网上成
千上万的Linux 开发者请教,这使最困难的问题也有办法解决。
Linux 带有Unix 用户熟悉的完善的开发工具,几乎所有的Unix 系统
的应用软件都已移植到了Linux 上。Linux 还提供了强大的网络功能,有
多种可选择窗口管理器(X windows)。其强大的语言编译器gcc、g++等也
可以很容易得到。不但成熟完善、而且使用方便。
嵌入式系统选择linux 的原因 :
&<048766; 可应用于多种硬件平台。Linux 已经被移植到多种硬件平台,这对受
开销、时间限制的研究与开发项目是很有吸引力的。原型可以在标准
平台上开发然后移植到具体的硬件上,加快了软件与硬件的开发过
程。
华恒科技 HHCF5272-R1 技术手册 第 10 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
&<048766; Linux 可以随意地配置不需要任何的许可证或商家的合作关系。唯一
的限制是开发者必须做出对Linux 社区有益的改动。
&<048766; 它是免费的,源代码可以得到。这是最吸引人的。毫无疑问,这会节
省大量的开发费用。
&<048766; 微内核直接提供网络支持,而不必象其他操作系统要外挂TCP/IP 协
议包。
&<048766; Linux 的高度模块化使添加部件非常容易。
&<048766; Linux 在台式机上的成功,也保证了Linux 在嵌入式系统中的辉煌前
景。
HHCF5272-R1 开发板上提供的LINUX 操作系统为一种专为嵌入式NOMMU
微处理器定制的操作系统:uClinux(具体介绍参见附录F)。
Linux 是一种很受欢迎的操作系统,它与UNIX 系统兼容,开放源代
码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影
响在于它正逐渐的应用于嵌入式系统领域。uClinux 正是在这种氛围下产
生的。在uClinux 这个英文单词中u 表示Micro,小的意思,C 表示Control,
控制的意思,所以uClinux 就是Micro-Control-Linux,字面上的理解就是
“针对微控制领域而设计的Linux 系统”。 uClinux 的默认的标准输入输出
被重定向到串口1(/dev/ttyS0),内核在启动时所有的信息都打印到串口终
端,同时也可以通过串口终端与系统交互。
LINUX 是一个自由开放的世界,在LINUX(无论PC 还是嵌入式系
统)上进行软件开发都可以在广袤的网络资源中获取帮助。下面是uClinux
开发常用的两个资源站点:
www.uclinux.org
www.lineo.com
华恒科技 HHCF5272-R1 技术手册 第 11 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
2.1 使用说明
2.1.1 建立宿主机开发环境
绝大多数的Linux 软件开发都是以native 方式进行的,即本机(HOST)
开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的软件
开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即板子上系
统)运行开发工具和调试工具。通常的嵌入式系统的软件开发采用一种交
叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC 机)上,
对应的开发板叫做目标板。
【目标板】
运行Linux 的PC【宿主机】
开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进
制代码,(这种可执行代码并不能在宿主机上执行,而只能在目标板上执
行。)然后把可执行文件下载到目标机上运行。调试时的方法很多,可以
使用串口,以太网口等,具体使用哪种调试方法可以根据目标机处理器所
提供的支持作出选择。宿主机和目标板的处理器一般都不相同,宿主机为
华恒科技 HHCF5272-R1 技术手册 第 12 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
INTEL 处理器, 而目标板如HHCF5272-R1 为MOTOROLA
COLDFIRE5272,GNU 编译器提供这样的功能,在编译编译器时可以选择
开发所需的宿主机和目标机从而建立开发环境。所以在进行嵌入式开发前
第一步的工作就是要安装一台装有指定操作系统的PC 机作宿主开发机,
对于嵌入式LINUX,宿主机上的操作系统一般要求为REDHAT LINUX。
嵌入式开发通常要求宿主机配置有网络,支持NFS(为交叉开发时mount
所用),支持TFTP 服务器(为下载烧写所用)等等。然后要在宿主机上建
立交叉编译调试的开发环境。环境的建立需要许多的软件模块协同工作,
这将是一个比较繁杂的工作,但现在已完全由套件中光盘的安装而自动完
成了。
下面逐步介绍常用的安装步骤:
&<048698; 在一台PC 上安装LINUX,建议RedHat7.2。建议选择Custom 定
制安装,在选择软件Package 时选择最后一项:everything,即完
全安装。
&<048698; 配置好网络,TFTP 服务和NFS(Enable Running)。
网络配置主要是要安装好以太网卡,对于一般常见的RTL8139 网
卡,REDHAT7.2 可以自动识别并自动安装好,完全不要用户参
与,因此建议使用该网卡。然后配置宿主机IP:
ifconfig eth0 192.168.2.32
【注意】
对于REDHAT7.2,它默认的是打开了防火墙,因此对于外
来的IP 访问它全部拒绝,这样其它网络设备根本无法访问它,
即无法用NFS mount 它,无法通过TFTP 从它下载,无法telnet,
ftp 它等。因此网络安装完毕后,应立即关闭防火墙。操作如下:
运行setup(见下图),选择Firewall configuration,选中No firewall。
然后到上一层菜单选择System services,去掉ipchains 和iptables
两项服务。最后退出setup。
华恒科技 HHCF5272-R1 技术手册 第 13 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
TFTP 服务的配置参见后面2.1.5 节介绍。
配置NFS:运行linuxconf,在config 选项下选Server tasks,选中
Exported File systems(NFS),见下图:
华恒科技 HHCF5272-R1 技术手册 第 14 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
然后选择Add Directory,加入根目录/,然后Accept。
输出根目录允许NFS mount 后,配置界面显示如下:
华恒科技 HHCF5272-R1 技术手册 第 15 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
选择Dismiss(或者按下ESC)退出这个界面。
下一步再选择Control 项下面Control panel 下的Control Service activity,(界
面见下图),然后选择nfs enabled,然后start。
华恒科技 HHCF5272-R1 技术手册 第 16 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
配置好后的界面显示如下,其中nfs 必须为: Automatic Running。
华恒科技 HHCF5272-R1 技术手册 第 17 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
【注意】
这里建议把ipchains 和iptables 都取消其自动运行的状态:
见下图:
最后,在Control 项下面Control panel 下选择Activate configuration,则弹
出如下界面,提示系统配置的改动,选择“Do it”,
华恒科技 HHCF5272-R1 技术手册 第 18 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
最后退出时则完成NFS 配置。
华恒科技 HHCF5272-R1 技术手册 第 19 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
配置好后,界面应显示如下:
配置完成后,可用如下办法简单测试一下NFS 是否配置好了:
在宿主机上自己mount 自己,看是否成功就可以判断NFS 是否
配好了。例如在宿主机/目录下执行:
mount 192.168.2.32:/ /mnt
然后到/mnt/目录下看是否可以列出/目录下的所有文件和目录,
可以则说明mount 成功,NFS 配置成功。
【注】Redhat 6.x 下配置时有时会异常退出,多试几次即可。对
于REDHAT7.2,则一定要关闭防火墙。(默认安装是打开的。)
&<048698; 将我们附带的光盘插入CDROM,然后执行以下命令:
mount /dev/cdrom /mnt
若系统不识别/dev/cdrom 的话,可以用如下命令,假设CDROM
为从盘,即为/dev/hdb,则:
mount –t iso9660 /dev/hdb /mnt
cd /mnt :进入mount 后的目录
如果您的CDROM 已经在安装RedHat 的时候已经默认安装,
以上命令请不要执行,请直接进入CDROM 所在目录。
cce (或其它中文环境如gce) :进入中文环境
华恒科技 HHCF5272-R1 技术手册 第 20 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
./ucinst :执行安装程序
敲入y,回车。
【注意】第一步要进入中文环境只是为了能够看到安装启动
时的一些中文提示信息,若没有中文环境也无所谓,只是看到一
些乱码而已,用户只需按下y 回车即可完成全部安装。
执行完毕后,会在根目录下生成工作目录:/HHCF5272-R1,
内含LINUX 内核、应用程序源代码以及各个工具软件。
2.1.2 文件与目录结构
软件光盘安装后宿主机下目录如下:
[root@coldfire /HHCF5272-R1]# ls
bdm bootldr chk ddd-5272 gdbtftpflash image minirc.dfl uClinux
其中:
bdm 为BDM 设备驱动及其源代码目录。
bootldr 为bootloader 映像文件目录。
chk 为BDM 调测软件工具及其源代码目录。chk 代码中包
含了CPU 底层初始化的所有代码;并且提供了FLASH
擦除、写入的时序代码,对于要开发FLASH 烧写工具
及JFFS 文件系统的用户,可见参见这里的代码。
ddd-5272 为X-WINDOW 下集成调试环境ddd。
gdbtftpflash 为以太网烧写工具目录
image 为板子出厂所烧制uClinux 内核映像文件目录。将其复
制到/tftpboot/目录下,便可直接烧写。
uClinux uClinux 内核及应用程序目录。
其中uClinux 目录内容结构如下图:
华恒科技 HHCF5272-R1 技术手册 第 21 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
uClinux user
vendor
所有的应用程序,用户的应用程序也要放在此目录下。
各个厂商配置文件
lib 应用程序C函数库
romfs 烧写文件目录,对应板子上所有的目录,要在板子上
多加一个目录,就只需在这里mkdir 该目录,烧写后
就会出现在板子上。
tools 提供编译开发工具
char
设备驱动
linux
uClinux内核源代码目录
drivers
net
mcfserial.c/h,usb.c/h
fec.c/h
arch / m68knommu/platform/5272/MOTOLORA/crt0_rom.S
arch / m68knommu/platform/5272/sysinit.c
images 编译生成的二进制image文件
其中user 目录为各个应用程序的父目录,其下各个应用对应的目录结构如
下:
华恒科技 HHCF5272-R1 技术手册 第 22 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
user get get 工具
dhcpcd DHCP 客户端
dhcp-isc DHCP 服务器
ipfwadm 防火墙
boa WEB 服务器
diald 拨号
pppd pppd
put put 工具
fileutils 文件操作
ping ping
init 初始进程
mount mount 操作
route route 命令
inet inetd 服务
sash SHELL
sysutils 常见命令
上述诸多应用程序的源代码都在光盘中提供,但并未标准发行版本中只把
华恒科技 HHCF5272-R1 技术手册 第 23 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
其中几个加入编译并烧到板子上(可在uClinux/romfs/bin/下面看到所有加
入编译的应用程序),若用户需要,可把在user 下增删定制自己所需的应
用程序。具体参见后面2.2.4 节介绍。
板子启动后的目录结构列表见下图:
它完全就是PC 机上uClinux/romfs 目录下的内容。
其中/bin/目录用于存放可执行程序。/dev/是所有存放所有设备文件的目录。
例如用户添加自己的设备驱动时,要为该设备创建设备文件,例如增加JFFS
文件系统支持时,为其作设备驱动,要用到/dev/flash0~flash3 等设备名,
首先要在宿主机uClinux/romfs/dev/目录下用mknod(仅用于uClinux2.0.38
内核)创建,命令如下:
mknod flash0 b 60 16
这样在该目录下就会看到这个设备文件:
brwxr-xr-x 1 root root 60, 16 Feb 3 12:18 flash0
gdbtftpflash/flash 烧写板子后,在板子的/dev/目录下也可以看到:
brw------- 1 0 0 60, 16 Jan 01 1970 flash0
板子上/etc/目录包含系统启动脚本rc 和inittab,/etc/config 目录是被mount
作RAM 盘,它可读可写,可用于临时存放、修改应用程序的配置脚本,(但
系统掉电文件就会丢失)。HHCF5272-R1 标准发行版本中没有使用
/etc/config/下的文件,用户可在自己的应用中使用之。
华恒科技 HHCF5272-R1 技术手册 第 24 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
/etc/目录下重要的文件就是系统启动rc 脚本文件,其内容如下:
[root@test etc]# cat rc
hostname HHCF5272-R1
/bin/expand /etc/ramfs.img /dev/ram0
/bin/expand /etc/ramfs.img /dev/ram1
mount -t proc proc /proc
mount -t ext2 /dev/ram0 /var 【/var/目录mount 作RAM 盘】
mount -t ext2 /dev/ram1 /etc/config 【/etc/config/目录mount 作RAM 盘】
mkdir /var/tmp 【/var/tmp/也是RAM 盘】
mkdir /var/log 【/var/log/也是RAM 盘,一般可用作存放syslog 文件】
ifconfig lo 127.0.0.1
route add -net 127.0.0.0 lo
ifconfig lo up
ifconfig eth0 192.168.2.111 【配置以太网IP】
route add -net 192.168.2.0 eth0
usbshell& 【系统一启动就执行用户应用程序即可类似的放在rc 脚本最后】
【注意】
板子启动后默认的IP 就是在这个rc 脚本文件中指定的,系统启动后
可以用通过minicom 用ifconfig/route 命令修改板子的IP,但一重启就又执
行rc 脚本,又变回192.168.2.111。要想永久改变启动IP,就必须在宿主机
上uClinux/romfs/etc/下修改rc 文件,将文件中指定的IP 改为需要的IP,
然后重新烧制板子即可。例如:要求系统启动后IP 为10.1.1.2,则如下修
改rc 文件:
ifconfig eth0 10.1.1.2
route add -net 10.1.1.0 eth0
gdbtftpflash/flash 重烧板子系统启动后的IP 就总是10.1.1.2 了。
华恒科技 HHCF5272-R1 技术手册 第 25 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
2.1.3 GNU 编译器(gcc)、链接器等全套工具
集
嵌入式LINUX 内核及设备驱动全部源代码(光盘安装后建立完备的开
发环境)。注意:新安装或手工移动目录后重编,就直接:
make dep
make
不要make xconfig,否则默认的设置就会被覆盖掉,导致编出的内核
无法启动。若要更改内核配置选项,则就要先make xconfig。这里不支持
make menuconfig。
编译过程简介:
在uClinux 执行make,它总体上完成三个工作:
1. 编译内核:即编译linux 目录。生成linux.bin
2. 编译应用程序:
先编译应用程序所用的libc 库,即uClinux/lib 目录下内容;
然后再根据user/Makefile 中DIRSy 所指定的要编译应用程序目录链
表逐一进行编译,并将各个可执行文件复制到uClinux/romfs/bin/目
录下,以供打包烧写。
3. 生成二进制格式文件image.bin:
它是由两部分组成的:(参见uClinux/images 目录下内容)
image.bin=内核(linux.bin)+文件系统(romfs.img),
而romfs.img 是由uClinux/romfs/目录打包生成的,它里面的文
件目录结构就是最终用户在板子minicom 下ls 所看到的文件和
目录。
整个make 过程由uClinux/Makefile 文件指定并控制, 执行make 就
是执行这个Makefile 中指定的操作。Makefile 是由编译器(gcc)解释执
华恒科技 HHCF5272-R1 技术手册 第 26 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
行的,它的语法是gcc 可识别的。Makefile 的使用是为了简化编译过程,
它本身可以看作是一个批处理过程,使得编译器可以连续完成对大量C 代
码文件的编译和链接而不需要认为的参与。例如,在PC LINUX 上要手工
编译一个hello.c 文件,并生成hello 的可执行程序,只要手工输入执行:
gcc –o hello hello.c
即可。但若要有数千个.c 文件需要编译,这样手工的命令式编译显然是不
可行的,因此就有了Makefile 的需求,它把所有的编译链接命令写成一
个文件,由编译器自动调用执行。
uClinux/目录下的这个Makefile 是个总领式的文件,通过它又层层
包含调用各个目录、子目录下面对应的Makefile,就这样层层调用下去,
从而完成整个软件系统的编译。
下面根据uClinux/Makefile 文件的内容(内容有删节)大致介绍一
下整个编译的调用关系:
include common.mk
【首先包含common.mk,它里面定义了一些通用的全局变量,例如:
common.mk 文件中有如下内容:
.EXPORT_ALL_VARIABLES: (相当于C 中的extern 关键字,表
示下面的宏变量可以为其它文件所使用)
ifndef ROOTDIR
ROOTDIR = $(shell pwd)
endif
TOOLS = $(ROOTDIR)/tools
】
.EXPORT_ALL_VARIABLES:
#输出下面所有全局变量
华恒科技 HHCF5272-R1 技术手册 第 27 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
IMAGEFILE = image.bin
IMAGEZFILE = imagez.bin
ELFFILE = image.elf
SRECFILE = image.srec
IMAGE = $(ROOTDIR)/images/$(IMAGEFILE)
IMAGEZ = $(ROOTDIR)/images/$(IMAGEZFILE)
ELFIMAGE = $(ROOTDIR)/images/$(ELFFILE)
SRECIMAGE = $(ROOTDIR)/images/$(SRECFILE)
ROMFS = $(ROOTDIR)/romfs
ROMFSIMG = $(ROOTDIR)/images/romfs.img
TOPDIR = $(ROOTDIR)/linux
HOSTCC = unset GCC_EXEC_PREFIX ; gcc -I$(TOPDIR)/include
DIRS = linux lib user
#all 告诉编译器执行make 都要分完成哪些工作步骤,这是最重要的地方!
#看一个Makefile 首先要从它的all 看起,就相当于C 语言的main()函数
#的作用。然后再从all 层层分析下去。
all: config-test subdirs build-romfs $(IMAGE)
这里共四步工作,即:
&<048633; config-test
&<048633; subdirs
&<048633; build-romfs
&<048633; $(IMAGE),即上面的IMAGE 变量,Makefile 中用$(变量名)来使
用变量,这中用法对许多熟悉各种脚本语言的用户并不陌生。
下面在Makefile 分别找到各步工作对应的部分:
&<048633; config-test:
@if [ ! -f .config -o ! -f linux/.config -o ! -f
vendors/.config ]; then \
华恒科技 HHCF5272-R1 技术手册 第 28 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
【若找不到.config 文件或者找不到linux/.config 或者找不到
vendors/.config 文件,就提示需要make config 或者make xconfig】
echo "ERROR: you need to do a 'make config' first" ; \
exit 1 ; \
fi
@if [ ! -d romfs ]; then \
【必须有romfs 这个目录】
echo "ERROR: you need to run 'make romfs' as root first" ;\
exit 1 ; \
fi
&<048633; subdirs
subdirs:
@if [ ! -f linux/.depend ] ; then \
【若没找到linux/.depend 文件,就提示要make dep】
echo "ERROR: you need to do a 'make dep' first" ;
exit 1 ; \
fi
for dir in $(DIRS) ; do make -C $$dir || exit 1 ; done
【上面这一句虽短,但确是最主要的工作所在,注意到前面定义了:
DIRS = linux lib user
因此这一句:
make -C $$dir
就完成了对内核(linux 目录)的编译、对libC 库(lib)的编译、对所
有应用程序(user 下所有指定要编译的目录)的编译。
make -C $$dir 就调用对应那个目录下的Makefile , 即分别是
linux/Makefile,lib/Makefile 和user/Makefile,这些Makefile 又层
层包含调用下面的各个目录的Makefile,从而完成整个编译过程。
】
华恒科技 HHCF5272-R1 技术手册 第 29 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
其中编译user 下各个应用程序时,每个应用程序目录下的Makefile 中都
要执行如下一句:
$(CONVERT)
这个宏是在uClinux/user/arch/coldfire/目录下的build.mk 文件中指定
的,这个文件的作用就相当于uClinux/common.mk,它为应用程序的编译
定义了许多公共的宏,例如所采用的编译器(CC)等。
这个文件的部分内容如下:
.EXPORT_ALL_VARIABLES:
CC = $(TOOLS)/m68k-elf-gcc
CXX = $(TOOLS)/m68k-elf-g++
AR = $(TOOLS)/m68k-elf-ar
LD = $(TOOLS)/m68k-elf-ld
OBJCOPY = $(TOOLS)/m68k-elf-objcopy
RANLIB = $(TOOLS)/m68k-elf-ranlib
ELF2FLT = $(TOOLS)/elf2flt
GCC_EXEC_PREFIX = $(TOOLS)/m68k-elf-
LIBC = $(ROOTDIR)/lib/libc/libc.a
LIBM = $(ROOTDIR)/lib/libm/libmf.a
LIBNET = $(ROOTDIR)/lib/libnet/libnet.a
LIBDES = $(ROOTDIR)/lib/libdes/libdes.a
LIBPCAP = $(ROOTDIR)/lib/libpcap/libpcap.a
LIBSSL = $(ROOTDIR)/lib/libssl/libssl.a
LIBCRYPTO = $(ROOTDIR)/lib/libssl/libcrypto.a
LIBGCC = $(TOOLS)/gcc-lib/libgcc.a
ARCH = -m5200 -Wa,-m5200 -DCONFIG_COLDFIRE
华恒科技 HHCF5272-R1 技术手册 第 30 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
DEFS = -Dlinux -D__linux__ -Dunix -DEMBED
INCS = $(INCGCC) $(INCLIBC) $(INCLIBM) $(INCVEND)
CCFLAGS = -O2 -msoft-float 【编译参数】
CFLAGS = $(DEBUG_CFLAGS) $(ARCH) $(DEFS) $(CCFLAGS) $(INCS) -
fno-builtin 【编译参数】
LDFLAGS = --sort-common -r $(STARTUP) 【链接参数】
最后定义了CONVERT 宏:
CONVERT = mv $$@.elf .$$@.elf; \
$(LD) -T $(LDSCRIPT) -Ur -o $$@.elf .$$@.elf; \
$(LD) -T $(LDSCRIPT) -o $$@.gdb .$$@.elf; \
rm -f .$$@.elf; \
$(ELF2FLT) $$(FLTFLAGS) -o $$@ $$@.elf
它采用elf2flt 工具将编译生成的ELF 格式可执行文件转换为uClinux 所
支持的FLAT 文件格式。
【注】
uClinux 唯一支持的可执行文件格式就是FLAT 格式。其它都不支持。
所以所有要在uClinux 上跑的应用都必须转换为FLAT 格式。PC REDHAT
LINUX 不支持这种格式的可执行文件,所以这些可执行文件都无法在PC 上
执行。
&<048633; build-romfs
build-romfs: images
make -f romfs.mk
build-romfs 后面跟了images,表明它依赖于images 先执行的结果:
images:
[ -d images ] || mkdir images
华恒科技 HHCF5272-R1 技术手册 第 31 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
images 只是检查是否有images 目录,若没有就创建该目录。
下面的make -f romfs.mk 就调用执行romfs.mk。
下面是romfs.mk 文件中的内容:
这也是个Makefile,因此如前所述,要从它的all 入口看起:
all: copy-files
$(TOOLS)/genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d
$(ROMFSDIR)
all 要先依赖copy-files 部分的完成:
copy-files:
cp $(RAMFSy) romfs/etc/ramfs.img
[ ! "$(BINy)" ] || cp $(BINy) romfs/bin/.
rm romfs/etc/services
rm romfs/etc/inetd.conf
make -C user build-romfs
-find romfs -name CVS | xargs rm -rf
这里主要的工作就是一句:
[ ! "$(BINy)" ] || cp $(BINy) romfs/bin/.
完成user/下各个参与的应用程序目录下的编译生成的可执行文件的收
集,将它们复制到romfs/bin/目录下。
下一步就是romfs 目录的打包,生成romfs.img 二进制IMAGE 文件,它就
是我们常说的ROMFS 文件系统的映像文件:
$(TOOLS)/genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d $(ROMFSDIR)
至此就完成了romfs.mk 中的工作,下面返回uClinux/Makefile 的内容继
续:
&<048633; $(IMAGE)
IMAGE 变量为:
IMAGE = $(ROOTDIR)/images/image.bin
华恒科技 HHCF5272-R1 技术手册 第 32 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
这就是最后被复制到/tftpboot/目录下的image.bin 文件,也就是最
后可以烧写或下载的二进制IMAGE 文件。
$(IMAGE): images images/linux.bin
cat images/linux.bin $(ROMFSIMG) > $(IMAGE)
$(TOOLS)/cksum -b -o 2 $(IMAGE) >> $(IMAGE)
cp $(IMAGE) /tftpboot
首先依赖于images 和image/linux.bin。
images/linux.bin: images linux/linux
$(TOOLS)/m68k-elf-objcopy -O binary
--set-section-flags=.romvec=CONTENTS,ALLOC,LOAD,READONLY,CODE
linux/linux images/linux.bin
image/linux.bin 又依赖linux/linux,它是前面make –C linux 时根据
linux 目录下的Makefile 规则编译生成的。然后用m68k-elf-objcopy 将
linux/linux 文件转换为二进制文件images/linux.bin。
然后用:
cat images/linux.bin images/romfs.img > images/image.bin
最后,将images/image.bin 复制到/tftpboot 目录下,从而完成整个编译
过程。
【注意】
Makefile 中使用了许多.PHONY:节,它并没有什么作用,只是告知编
译器,它的:号后面并不是一个文件。例如:
.PHONY: romfs (没有这句也可以,但是若目录下有一个文件名字叫做
romfs,则会报错make: ` ‘romfs’ is up to date。加了PHONY 就是通知
编译器,不要把romfs 看作一个目标文件。)
romfs:
……
Makefile 还提供了许多独立的目标,可以直接用make 命令指定目标
华恒科技 HHCF5272-R1 技术手册 第 33 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
单独编译。例如:
dep:
@if [ ! -f linux/.config ] ; then \
echo "ERROR: you need to do a 'make config'
first" ; \
exit 1 ; \
fi
make -C linux dep
就可以直接make dep 执行。
romfs:
make -f romfs_cvs.mk
[ "$(CONFIG_VENDOR)" ] || echo "******\nrun 'make config'
first\n******"
make -C vendors/$(CONFIG_VENDOR)/$(CONFIG_PRODUCT)/. romfs
就可以直接make romfs 执行。
2.1.4 BDM 调测工具(chk)
BDM 工具完成板卡硬件检测、下载、运行、烧写FLASH、内核调试、
单步调试等最底层的调测功能。
【注意】
插了BDM 后,核心板的reset 键就失效,而且有时板子加电也不启动,
即核心板上的运行指示灯不亮也不闪,串口终端什么不显示,这就是因为
华恒科技 HHCF5272-R1 技术手册 第 34 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
BDM 钳制了reset 信号,导致板子无法启动。这时要重启板子,可以先进
一下chk,然后立刻退出则板子就会自动重启。
cd chk
./chk
>>>x
以后若要重启板子,因为还插着BDM 卡,所以不能用reset 键,可直
接在minicom 下键入reboot 即可重启。
若不插BDM 则板子的reset 是有效的。
有时,执行chk 时报错:
device busy 表示有其它程序在使用BDM
在宿主机上用ps -A 看看是否有其它程序在使用BDM,例如gdb(即
gdbtftpflash 下的./flash)或者另外一个chk 没有退出。
若提示device not found,则表明BDM 驱动没有装好。
&<048766; 安装bdm 驱动模块
1. cd HHCF5272-R1/bdm
2. insmod linux-bdm.o 【可将此句写入/etc/rc.d/rc.local 文件
中,如:
/sbin/insmod /HHCF5272-R1/bdm/linux-bdm.o
这样每次PC 启动都会自动执行,否则每次启动宿主机都要
执行这一句】
3. ./MAKEDEV 【在/dev/下创建设备bdmcf0,只要执行一次】
【注意】
&<048698; 在insmod 时有可能出现.o 文件与内核版本不匹配现象,这
时只要重编该模块驱动即可。光盘提供了BDM 的全部源代
码,生成linux-bdm.o 的源代码目录在HHCF5272-
R1/bdm/driver/linux 下,编译后重新安装即可。
cd HHCF5272-R1/bdm/driver/linux
make clean
华恒科技 HHCF5272-R1 技术手册 第 35 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
make
insmod linux-bdm.o
&<048698; 在Redhat 7.x 上编译时若有错误,这时只要修改一下
bdm/driver/linux/下的Makefile 即可,改动只需一处,将下面
一句:
MODVERSIONS=-DMODVERSIONS
改为:
MODVERSIONS=
即可。
安装好BDM 模块后,将BDM 卡(带排线)一头插在PC 并口,
另一头插在板子BDM 接口上(注意接线的方向),然后便可以运
行华恒提供的BDM 调测工具chk 来进行硬件检测及下载烧写。
&<048766; BDM 调测工具chk 的使用方法
安装目录为:/HHCF5272-R1/chk
运行chk 工具:
./chk
进入chk 的命令行提示符>>>,以下命令都是在这个提示符下输入
的。
>>>help
1) x : quit
2) s : test the sdram
3) fa
4) fs
5) fw
6) fg
7) ff
8) fr
9) pl/pw/pb
华恒科技 HHCF5272-R1 技术手册 第 36 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
10) gl/gw/gb
11)fp
【注】
&<048698; 上述中
格。这是因为该工具默认要求输入三个参数,没有三个就随
便输入凑足三个,代码并不处理。
&<048698; 基本的内存读写工具get/put,分别提供4 字节(long)读
写gl/pl,双字节(word)读写gw/pw 和单字节(byte)读
写gb/pb。注意:gl/gw/gb 可读取RAM 和FLASH 中某一地址
中的数值,但pl/pw/pb 不能对FLASH 进行写入,只能写入
RAM,写入FLASH 只能用fw 命令。
&<048698; 内存(SDRAM)检测:
首先可以用s 命令,
>>>s
检查所有16M SDRAM,逐点写入并读出校验是否一致。运行
后屏幕将不停翻动,这就表明这些检测的RAM 都是好的。若
某一处RAM 有问题则会自动停下来报错。注意0 地址处出错
可以忽略不算作问题。此外,9),10)提供了内存读写工具。
&<048698; FLASH 检测
首先可以用fa 命令擦除FLASH,【注意】:一片FLASH 要调
用fa 命令两次。然后用读操作读取FLASH 中内容,多读几
次,直到读出内容均为F 就表示擦写成功。若读出为005C0018
等值就表明还处于中间状态,FLASH 尚未稳定下来。FLASH
一定要擦除稳定后才可以写入,否则写入必然失败。
下面以擦除第一片FLASH 为例,给出命令:
>>>fa xxx 1 【xxx 可为任意字符】
>>>fa xxx 1 【xxx 可为任意字符】
>>>gl ffc00000 100 【0xffc00000 为第一片FLASH
华恒科技 HHCF5272-R1 技术手册 第 37 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
起始地址】
还有一个按扇区擦除命令fs,从FLASH 芯片资料上查到其
扇区分布情况,输入扇区起始地址即可擦除该扇区。
【HHCF5272-R1 核心板所用FLASH 资料参见3.3 节。】扇区
擦除要比整片擦除快许多,立刻就会变为FF。例如要烧写
一个小的image 到FLASH,可以先看一下这个image 文件的
大小,比如chk 下面的bootloader.bin 文件,它为32K 大
小,把它烧入到板子的第一片FLASH 上。而要写入FLASH 前
必须先擦除,但整片擦除太慢了,这时就可以手工用fs 为
bootloader.bin 擦出32K 的空间来。查FLASH 扇区分布【3.3
节】,FLASH 前四个扇区大小不规则,大小分别为:16K,8K,
8K,32K,起始地址分别为:0xffc00000, 0xffc04000, 0x
ffc06000, 0xffc08000,则扇区擦除命令如下:
>>>fs ffc00000 1
>>>fs ffc04000 1
>>>fs ffc06000 1
>>>fs ffc08000 1
烧写命令参见下面介绍。
下一步,就检测FLASH 是否可以正确的写入。即向FLASH 某
个地址写入数值,然后再读出来看是否一致,通过这种手段
可以对FLASH 进行初步检查。所用命令即fw 命令,因为板
上FLASH 为16 位模式,所以一次能且只能写入2 个字节数
据,命令如下:
>>>fw ffc00000 1234 【向FLASH 地址0xffc00000 写入
0x1234】
>>>gl ffc00000 10 【读取0xffc00000 地址开始的40 个
字节,看前两个是否为1234】
烧写linux 映象文件时可以实现对FLASH 进一步全面的检
华恒科技 HHCF5272-R1 技术手册 第 38 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
查。
&<048698; 烧写文件到FLASH 上
擦除FLASH 稳定后,执行ff 命令进行烧写。因为用chk 是
通过并口烧写,速度很慢,所以一般只用来烧写小文件,大
文件都要用gdbtftpflash 工具通过以太网进行烧写。
例如烧写bootloader 到板子上,
【注意】
烧写前一定要先擦除。擦除参见前面介绍。
>>>ff bootloader.bin ffc00000
>>>x
然后在minicom 下就可以看到华恒提供的5272 bootloader
的命令行界面了。
&<048698; 外设手工检查
通过直接读写CPU 外设寄存器,完成设置片选及片上RAM 读
写等操作,从而可以完成对外设的初步检测。例如:串口1,
串口2 等。又因为只要系统启动信息可以打印到minicom 或
超级终端上就表明串口1 是好的,所以只有串口2 才需要用
BDM 检测。
&<048698; 串口2 检测
将板子的串口2 和宿主机的串口1 连接起来,在宿主机
的一个TTY 启动minicom,另一个TTY 执行chk
./chk
>>>fr colilo2.bin e00000【下载到RAM 中0x00e00000 地
址处】
>>>fg xx e00400 【从0x00e00400 地址处开始执
行,加上0x400 是要跳过前面1024 个字节的ramvect】
代码下到板子RAM 中,然后用fg 将其激活跑起来后,CPU 就
由那个代码控制了,这时就不要在chk 中输入任何命令了。
华恒科技 HHCF5272-R1 技术手册 第 39 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
不要在chk 中执行退出(x),否则板子立即reset,下载到RAM
中的内容就丢了。【注意】没有fg 之前,核心板上运行指示
灯(LEDK1)是不亮不闪的。一旦fg xx e00400 后就应该亮
闪起来。这是判断下载软件是否跑起来的唯一标准,与串口
是否打印完全无关。若minicom 没有打印信息,就只能说明
串口2 是坏的。
&<048698; 下载代码到RAM 中执行
使用fr/fg 命令,fr 完成下载工作,fg 则指示处理器从RAM
中代码的第一句开始执行。例如上述检测板子串口2 工作是
否正常时,就是下载一个可执行小代码(colilo2)的bin
文件到板子RAM 中执行,看是否有信息打印到PC 的minicom
终端上。
&<048698; 单步调试工具
例如:已经通过bootloader 将linux 内核烧制到FLASH 中
0xffc40000 处。这时运行:
./chk
>>>fp ffc40400 xx 【从0xffc40400 开始单步执行】
addr=FFC40400
PC = FFC40400 【这是程序打印出的当前PC 指针值】
>>> fp ffc40400 xx 【第二句的后两个参数已无效,只是
为了凑足三个参数】
PC = FFC40402
……
通过这个工具便可单步调试linux 内核,若PC 指针长久固
定在某个值不变,就表示内核跑死了,应该通过反汇编查看
映象文件该地址处汇编语句,从而正确定位错误。华恒开发
工具包中提供该工具,均在安装目录:
华恒科技 HHCF5272-R1 技术手册 第 40 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
/HHCF5272-R1/uClinux/tools/下,具体命令如下:
cd /HHCF5272-R1/uClinux/linux
../tools/m68k-elf-objdump –D linux > asm
vi asm
则反汇编代码被重定向到asm 的文本文件中,查看该文件即
可。
2.1.5 以太网下载和烧写FLASH 工具
(gdbtftpflash)
该工具的作用是通过以太网从指定IP 的TFTP 服务器下载固定文
件名的Linux 映象文件(image.bin)并烧写到FLASH 中。
使用该工具需要两个条件:
&<048698; 宿主机端BDM 驱动已经安装好,chk 工具已经可用。(参见
前一节)
&<048698; 宿主机端TFTP 服务已经开通。
开通宿主机上的TFTP 服务,对于REDHAT6.x,可以在宿主机上:
vim /etc/inetd.conf
查找tftp,若发现前面有#就表示这一行被注释掉了,即服务没有打开,
去掉#就打开了TFTP 服务,然后重启宿主机即可。
对于REDHAT7.2,则在宿主机上执行setup,选择System services,
将其中的tftp 一项选中(出现 [*]表示选中),并去掉ipchains 和iptables
两项服务(即去掉它们前面的*号)。然后还要选择Firewall configuration,
选中No firewall。最后,退出setup,执行如下命令以启动TFTP 服务:
对于Redhat6.2,
killall inetd
华恒科技 HHCF5272-R1 技术手册 第 41 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
inetd&
对于Redhat7.2,则:
service xinetd restart
或者:
xinetd --restart
配置完成后,建议简单测试一下TFTP 服务器是否可用,即自己tftp
自己,例如在宿主机上执行:
cd /
cp /HHCF5272-R1/image/image.bin /tftpboot/
tftp 192.168.2.32
tftp>get image.bin
若出现如下信息:
Received 634732 bytes in 0.7 seconds
就表示TFTP 服务器配置成功了。若弹出信息说:Timed out,则表明
未成功,需要按照上述步骤重新检查一遍。
或者用如下命令查看tftp 服务是否开通:
netstat -a|grep tftp
完成上述配置工作后,就可以开始使用该以太网烧写工具了。
该工具的使用十分简单,只要将板子及TFTP 服务器PC 都连接到同
一个HUB 上(直接对接也可以),同时将板子通过BDM 线连接到一台Linux
宿主机上,【一般的,就用宿主机做TFTP 服务器,即用同一台Linux PC
即可】
其工作机制如下:
./flash 调用hhco.gdb 脚本对CPU 进行初始化,(sys-init)
然后指定
target bdm /dev/bdmcf0
load 即下载一个小软件(tftp.elf,约80K)到板子的RAM 中,并用
c(continue)命令让它跑起来,这时CPU 完全由这个小软件接管。这个
华恒科技 HHCF5272-R1 技术手册 第 42 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
小软件跑起来后初始化以太网及TFTP 协议栈,然后它运行TFTP 客
户端,从内存中0x00200004(2M+4 处)读取gdb 脚本放在此处的TFTP
服务器IP 地址,并从该IP 的TFTP 服务器PC 下载image.bin 到板子
内存1M 地址处,再将其烧写到FLASH 上,重启板子,这时引导起
来的就是LINUX 了。
使用具体步骤如下:
参见下图完成系统连接:【接串口线是为了监测打印到串口的信息】
串口线
华恒HHCO5272-R1
开发板【目标板】
运行Linux 的PC【宿主机】
【TFTP 服务器】
HUB
网线网线
标准开发配置连接图示
BDM 线
192.168.2.32
该工具出厂默认指定的TFTP 服务器IP 为:192.168.2.32,默认的image
文件名为:image.bin。用户可以修改TFTP 服务器IP,方法如下:
vim hhco.gdb
在该脚本中,指定在内存地址0x00200000~0x0020000c 连续存
放板子IP,TFTP SERVER,子网掩码,网关IP 这4 个4 字节地址,
其中第二个为TFTP SERVER IP 地址,默认值为
set *((long*) 0x00200004) = 0xc0a80220
0xc0a80220 即代表192.168.2.32,其中c0 对应192,a8 对应168,
02 对应2,20 对应32,用户要修改IP,只需对应修改这四个字节的
华恒科技 HHCF5272-R1 技术手册 第 43 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
值即可。
先在一个登录界面上启动minicom,
然后在宿主机上键入如下命令:
cd HHCF5272-R1/gdbtftpflash
./flash
然后立即切换到minicom 的界面去,则在宿主机的minicom 终端窗口就可
看到打印出从TFTP 服务器下载并烧写FLASH 的全部信息,这也是诊断
烧写过程中出错的唯一手段,所有的出错信息均要从这里获取。对于执
行./flash 侧TTY 终端显示的信息都不必理会。在minicom 中用ctrl+a,松
手然后按b,接着用上下箭头,可以翻看前面的信息,从而查看出了什么
错误。例如,TFTP 连接失败的信息就要前翻来查看,例如:
Unable to locate 192.168.1.46
Errors in TFTP download.
Read 0 bytes (0 blocks)
一次正确烧写的具体信息如下:
在一个LINUX TTY 终端执行
./flash
然后立刻切换到另一个TTY 终端启动的minicom 下去查看信息,例如:
Reading image.bin from 192.168.2.32 to 0x00100000
TFTP download successful 【这里查看TFTP 连接是否成功】
Read 1004740 bytes (1963 blocks)
>>>>>>>>>> Init mflash
>>>>>>>>>> Init mflash Successfully
********** File size : 0xF54C4 bytes
********** Address base : 0x0
********** Manufacturer ID 1
********** Device ID 2249
华恒科技 HHCF5272-R1 技术手册 第 44 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
********** Sector 0 [FFC00000] (0-unprotect, 1 protect):0
********** Sector 1 [FFC04000] (0-unprotect, 1 protect):0
********** Sector 2 [FFC06000] (0-unprotect, 1 protect):0
********** Sector 3 [FFC08000] (0-unprotect, 1 protect):0
********** Sector 4 [FFC10000] (0-unprotect, 1 protect):0
********** Sector 5 [FFC20000] (0-unprotect, 1 protect):0
********** Sector 6 [FFC30000] (0-unprotect, 1 protect):0
********** Sector 7 [FFC40000] (0-unprotect, 1 protect):0
********** Sector 8 [FFC50000] (0-unprotect, 1 protect):0
********** Sector 9 [FFC60000] (0-unprotect, 1 protect):0
********** Sector 10 [FFC70000] (0-unprotect, 1 protect):0
********** Sector 11 [FFC80000] (0-unprotect, 1 protect):0
********** Sector 12 [FFC90000] (0-unprotect, 1 protect):0
********** Sector 13 [FFCA0000] (0-unprotect, 1 protect):0
********** Sector 14 [FFCB0000] (0-unprotect, 1 protect):0
********** Sector 15 [FFCC0000] (0-unprotect, 1 protect):0
********** Sector 16 [FFCD0000] (0-unprotect, 1 protect):0
********** Sector 17 [FFCE0000] (0-unprotect, 1 protect):0
********** Sector 18 [FFCF0000] (0-unprotect, 1 protect):0
********** Sector 19 [FFD00000] (0-unprotect, 1 protect):0
********** Sector 20 [FFD10000] (0-unprotect, 1 protect):0
********** Sector 21 [FFD20000] (0-unprotect, 1 protect):0
********** Sector 22 [FFD30000] (0-unprotect, 1 protect):0
********** Sector 23 [FFD40000] (0-unprotect, 1 protect):0
********** Sector 24 [FFD50000] (0-unprotect, 1 protect):0
********** Sector 25 [FFD60000] (0-unprotect, 1 protect):0
********** Sector 26 [FFD70000] (0-unprotect, 1 protect):0
********** Sector 27 [FFD80000] (0-unprotect, 1 protect):0
华恒科技 HHCF5272-R1 技术手册 第 45 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
********** Sector 28 [FFD90000] (0-unprotect, 1 protect):0
********** Sector 29 [FFDA0000] (0-unprotect, 1 protect):0
********** Sector 30 [FFDB0000] (0-unprotect, 1 protect):0
********** Sector 31 [FFDC0000] (0-unprotect, 1 protect):0
********** Sector 32 [FFDD0000] (0-unprotect, 1 protect):0
********** Sector 33 [FFDE0000] (0-unprotect, 1 protect):0
********** Sector 34 [FFDF0000] (0-unprotect, 1 protect):0
xxxxxxxxxx Program sector 0 : Read Fill Erase Program End
xxxxxxxxxx Program sector 1 : Read Fill Erase Program End
xxxxxxxxxx Program sector 2 : Read Fill Erase Program End
xxxxxxxxxx Program sector 3 : Read Fill Erase Program End
xxxxxxxxxx Program sector 4 : Read Fill Erase Program End
xxxxxxxxxx Program sector 5 : Read Fill Erase Program End
xxxxxxxxxx Program sector 6 : Read Fill Erase Program End
xxxxxxxxxx Program sector 7 : Read Fill Erase Program End
xxxxxxxxxx Program sector 8 : Read Fill Erase Program End
xxxxxxxxxx Program sector 9 : Read Fill Erase Program End
xxxxxxxxxx Program sector 10 : Read Fill Erase Program End
xxxxxxxxxx Program sector 11 : Read Fill Erase Program End
xxxxxxxxxx Program sector 12 : Read Fill Erase Program End
xxxxxxxxxx Program sector 13 : Read Fill Erase Program End
xxxxxxxxxx Program sector 14 : Read Fill Erase Program End
xxxxxxxxxx Program sector 15 : Read Fill Erase Program End
xxxxxxxxxx Program sector 16 : Read Fill Erase Program End
xxxxxxxxxx Program sector 17 : Read Fill Erase Program End
xxxxxxxxxx Program sector 18 : Read Fill Erase Program End
********** Verify Complete
下面可以看到minicom 中打印出来的板子重启的信息。
华恒科技 HHCF5272-R1 技术手册 第 46 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
在宿主机上执行./flash 一侧的TTY 终端在烧写完毕后会显示如下信息:
Program received signal SIGBUS, Bus error.
0x488 in asm_exception_handler ()
1: x/i $pc 0x488
然后退出返回到提示符状态。上述信息并非错误,烧写完退出时都要显示
这个信息,并不能表示烧写是否成功。烧写成功与否完全要看minicom 端
的显示信息来判断。
【注意】
一定要看到上述诸行Read Fill Erase Program End 信息才表示烧写进去了,
前面********** Sector 0 [FFC00000] (0-unprotect, 1 protect):0 等只是显示
FLASH 的扇区分布,并没有进行烧写,只有看到Read Fill Erase Program End
信息才表示在进行烧写。
常见错误:
无法在minicom 中看到:
Reading image.bin from 192.168.2.32 to 0x00100000
这可能是BDM 没有安装好或BDM 卡线的问题,断电重新拔插一下
即可。
无法连接TFTP 服务器:
可能是PC 宿主机上的TFTP 服务没有打开。
还有可能是因为安装Redhat 时没有完全安装,所以没有/tftpboot 目
录,这时就必须重新安装REDHAT。
运行./flash 时报错,内容如下:
./gdb:error while loading shared libraries:libncurses.so.4:cannot load shared
object file:No such file or directory.
这是由于宿主机REDHAT 安装时不完全,不支持DEVELOPMENT 工
具,如gcc,gdb 等工具,导致系统没有安装运行这些工具所需的共享库。
建议重新完全安装REDHAT 操作系统。
华恒科技 HHCF5272-R1 技术手册 第 47 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
若报错为Device busy,则表明另有程序在使用BDM 而尚未退出。./chk
和./flash 都要使用BDM,因此只要有其中一个没有退出,另一个就无法执
行。
2.1.6 默认烧制的嵌入式LINUX 系统
用串口连接好系统后,通过串口可以看到板子上内嵌LINUX 操作系
统启动打印到串口的信息。该嵌入式LINUX 系统提供以太网FEC、USB
及两个串口的驱动。系统支持丰富的命令,如:ifconfig,route,reboot,ping,
mount/umount,telnet 等,并支持gdbserver 调试手段。系统支持串口终端
( minicom ) 及网络终端( telnet/telnetd )。板子出厂默认的IP 为
192.168.2.111,用户可以通过ifconfig/route 命令任意修改IP。例如:在
minicom 下修改板子的IP 为10.1.1.2,命令如下:
ifconfig eth0 10.1.1.2
route add –net 10.1.1.0
当插了BDM 后,要重启系统,可用reboot 命令。
可用cat 命令来查看板子上的文件。
板子还提供了操作完全类似chk 工具的SDRAM/FLASH 读写工具mt。
它的命令使用与前面介绍的chk 完全一致,只是不再需要插BDM 调试卡,
直接在minicom 下执行即可。
/> mt
Please input your command :
>>>Usage :
SDRAM_START_ADDR = 00000000
(2nd)FLASH_START_ADDR = FFE00000
1) x : quit
华恒科技 HHCF5272-R1 技术手册 第 48 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
2) fa
3) fs
4) fw
5) ff
6) pl/pw/pb
7) gl/gw/gb
由上命令菜单可见,它与BDM 的chk 工具相比,少了fr/fg/fp 三个命
令,而且对FLASH 的操作也仅限于第二片FLASH,因为第一片FLASH
上为操作系统,第二片空余,可留给用户做数据存储(保存板子IP 的例子
可参见2.1.9 节)。其实这个工具主要的作用在于提供了对内存的三种读写
方式:长整型(四字节)读写gl/pl、短整型(双字节)读写gw/pw、单字
节读写gb/pb。这个工具的典型用途就是在扩展新的接口芯片时,可以读
写芯片内的寄存器值。例如,有的外设芯片为16 位模式,它只支持双字
节读写,这时就需要用到gw/pw,而gl/pl 等就不能使用了。
当板子插了网线时,核心板上的百兆以太网连接和碰撞指示灯
(LEDL2)就会亮起来,若这时板子ping 一台PC 机或者一台PC 机ping
板子的话,LEDL2 灯就会闪烁起来。若LEDL2 不亮,可能是以太网插口接
触不好所致,用力插紧即可。
HHCF5272-R1 提供了串口2 可用于作MODEM 拨号, 需要把
uClinux/user/pppd/、chat/和diald/三个目录加入编译,并编写正确的
拨号脚本和配置文件。华恒提供完备的PPP 拨号软件包。
HHCF5272-R1 板上采用的是ROMFS 的文件系统,它是只读的。可以扩
展支持JFFS 文件系统,它可读可写。华恒提供完备的JFFS 支持软件包。
2.1.7 USB 支持
华恒HHCF5272-R1 支持USB DEVICE 模式。USB 支持软件包包含
华恒科技 HHCF5272-R1 技术手册 第 49 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
LINUX 端FIRMWARE、WINDOWS 端设备驱动程序(支持WIN98 及
WIN2000)、USB 测试程序USBShell LINUX 端及WINDOWS 程序。
USBSHELL 只是一个用来对USB 设备进行简单测试的小工具,可以
使用它来执行在板上/bin 目录中的命令。因为这个小程序只是用来测试USB
设备是否正常工作的,所以支持的命令有限,例如ping 命令就不支持。
测试时,首先要用USB 线连接板子和一台WINDOWS PC 机。板子一
加电,PC 机就会自动检测到USB 设备,提示安装驱动程序。华恒提供的
USB WINDOWS 端设备驱动包含两个文件, 即: USB_BUF.INF 和
USB_BUF.SYS,安装驱动程序时只要将搜索路径指定到光盘中包含这两个
文件的目录即可成功安装驱动。驱动安装成功后,在WINDOWS PC 机的
硬件系统中“通用串行总线控制器”下可以看到5272 router 的设备。
驱动安装成功后,首先在板子端通过MINICOM 执行usbshell&
然后在WINDOWS PC 机上双击usbshell 则会弹出窗口,见下图:
该程序提供一个命令输入窗口及一个命令结果显示窗口。用户输入的命令
通过USB 发送到板子,板子SHELL 执行后将结果通过USB 反馈回来显
示在上面的窗口内。
华恒科技 HHCF5272-R1 技术手册 第 50 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
2.1.8 bootloader
华恒HHCF5272-R1 提供的bootloader 初始化以太网FEC 及串
口,实现tftp 客户端协议,支持从tftp SERVER 下载(到RAM),烧
写FLASH 及运行。华恒HHCF5272-R1 光盘安装目录下提供一个
bootloader 的image 文件:bootldr/bootloader.bin,同时已经复制到chk
目录下。用chk 工具或改名(/tftpboot/image.bin)后用gdbtftpflash 工
具可将改image 文件烧写到板子的FLASH 中,重启后则进入
bootloader。
华恒HHCF5272-R1 bootloader 提供丰富的功能,所支持命令及使用说
明如下:
华恒科技 HHCF5272-R1 技术手册 第 51 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
help 【显示命令帮助信息】
read
0x00100000 处。可在这里指定文件名,默认的文件名为image.bin。】
&<048633; md 【显示指定地址处RAM 中内容】
&<048633; show 【显示系统配置参数】
&<048633; set < option value > 【参数设置,可修改内容即show 命
令所显示】即:
server : 192.168.1.15
client : 192.168.1.122
gateway : 192.168.1.255
netmask : 255.255.255.0
mac : 00:50:BF:0A:4E:CF
filename : image.bin
例如:经常可能要改动的就是TFTP server 的IP 了,命令如
下:
HHCN>set server 192.168.1.100
又如:
HHCN>set filename bootloader.bin
&<048633; write
&<048633; quit 【退出TFTP】
&<048633; go 【从指定的地址开始执行,默认的地
址输入为16 进制值】
&<048633; flash 【将下载到RAM 中的映象文件烧写
到FLASH 中,烧写的起始地址为0xffc40000。】
嵌入式LINUX 开发中bootloader 的很大一个用途是可以调试RAM 版
LINUX 内核,而这正是移植LINUX 内核的必不可少的重要一步,是
将网络开放资源变为己用的关键所在。LINUX 内核向某一硬件平台移
植的过程相对应用的移植要复杂得多,因此若每次修改都烧写FLASH
华恒科技 HHCF5272-R1 技术手册 第 52 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
的话,将大大缩短板子的寿命,因此使用RAM 版内核来进行移植过
程中的调试至关重要,而这必然离不开bootloader。HHCF5272-R1 提
供的bootloader 通过以太网下载RAM 版内核,1.5M 的image 文件下
载只需十几秒即可完成。
2.1.9 FLASH 扇区保存IP 方式
在uClinux/user/memtools 这个目录下提供了设置板子IP 的配置文
件/etc/config/start 的FLASH 扇区保存和启动时恢复的两个工具软件:
save 和recover。
这个例子的工作原理如下:
板子上的/etc/config/start 配置文件是用来设置板子IP 的RC 文件,
/etc/config 是RAM 盘,可读可写。
板子的IP 先后由两个文件设置它: 先是/etc/rc , 然后再执行
/etc/config/start。这个顺序是由uClinux/user/init/simpleinit.c 中的启动
代码决定的。
当用户的应用程序(例如WEB/CGI)修改了板子的IP,并记录到
/etc/config/start 文件后,需要执行save 命令,则将/etc/config/start 文件
保存到板子第二片FLASH 的最后一个扇区,即地址为:0xFFEF0000。
数据保存的格式为:
文件名(32 字节)+文件长度(4 字节)+文件内容
每次板子重启时,都要执行/etc/rc 这个脚本文件,其中有一句执行
/bin/recover
这个程序根据上述数据保存的格式,从板子第二片FLASH 的最后一
个扇区中恢复出/etc/config/start 文件的内容,紧接着系统就执行
/etc/config/start 中的内容,从而完成对板子IP 的二次修正。
华恒科技 HHCF5272-R1 技术手册 第 53 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
下面给出/etc/rc 和/etc/config/start 两个文件的内容:
/etc> cat rc
hostname HHCO5272-R1
/bin/expand /etc/ramfs.img /dev/ram0
/bin/expand /etc/ramfs.img /dev/ram1
mount -t proc proc /proc
mount -t ext2 /dev/ram0 /var
mount -t ext2 /dev/ram1 /etc/config 【作为RAM 盘】
mkdir /var/tmp
mkdir /var/log
cp /etc/default/* /etc/config
/bin/recover 【从第二片FLASH 最后一个扇区恢复/etc/config/start
文件】
ifconfig lo 127.0.0.1
route add -net 127.0.0.0 lo
ifconfig lo up
ifconfig eth0 192.168.2.111 【对板子IP 的第一次设置】
route add -net 192.168.2.0 eth0
usbshell&
/etc/config> cat start
ifconfig eth0 192.168.2.151 netmask 255.255.255.0 【对板子IP 的二次
修正】
route add -net 192.168.2.0 eth0
这样板子启动的IP 为192.168.2.151 , 而不是第一次设定的
192.168.2.111。
软件的可扩展性:
若用户需要保存的数据或文件比较大,一个扇区(64K)无法容下,
华恒科技 HHCF5272-R1 技术手册 第 54 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
则可以在这个软件例子模板的基础上很轻松的扩展到多扇区,多文件
保存。
下面是save.c 的main 函数代码:
int main(int argc,char *argv[]){
unsigned long addr;
addr = 0xffef0000;
erase_sector(addr);
sleep(3); //这里是为了等待FLASH 擦除后稳定下来变为FF。
write_file_to_flash("/etc/config/start",addr);
}
下面是recover.c 的main 函数代码:
int main(int argc,char *argv[]){
unsigned long addr;
addr = 0xffef0000;
recover_file_from_flash(addr);
}
由上代码可见,若要增加扇区保存,唯一要改动的就是
addr = 0xffef0000;
且占用多个扇区就要多次调用erase_sector(addr)分别擦除各个扇区。
而且由于定义的数据保存格式中含有全路径文件名和文件长度,因此
很容易的扩展到多文件保存/恢复的应用场合。
代码中用到的两个基本功能函数API:
1.erase_sector(addr) 【扇区擦除,addr 为扇区起始地址】
2.write_word(addr,value) 【向addr 地址写入value 的双字节数值】
注意:addr 限制为第二片FLASH 地址范围内,第一片FLASH 为操作
系统,不要破坏。
华恒科技 HHCF5272-R1 技术手册 第 55 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
2.2 软件应用开发
2.2.1 开发模式
在进行开发前,有必要先阐述一下宿主机和目标板的概念。宿主
机是一台运行LINUX 的PC 机,目标板即华恒HHCF5272-R1 开发板。
应用程序的开发有两种模式:
1. 先在宿主机(Intel CPU)上调试通过后,再移植到目标板
(MCF5272)上。这种HOST 方式下有gdb 调试工具可用,
这对大型复杂应用是有帮助的。
移植的工作包括两个方面:
&<048698; 函数库的问题。由于开发平台提供的libc 库同标准的libc
库有一些不同,在程序移植时可能会有函数未定义的问
题。对于这种问题,一般要求开发者自己编制这些要用
到却又未定义的函数。
&<048698; 改动Makefile 以适应目标板。
2. 直接在目标板上进行开发(通用开发模式,建议采用该模
式)。将宿主机和目标板通过串口1 相连,在宿主PC 机上运
行minicom 作为目标板的显示终端,mount 上宿主机硬盘,
直接在目标板上调试应用。下面给出这种直接TARGET 开
发模式下的开发流程:
华恒科技 HHCF5272-R1 技术手册 第 56 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
用串口和网线(可不插BDM 线)将宿主机和目标板连
在宿主机上编辑(放在user 目录下,如hello),在hello 目录下的
Makefile 中加入如下一句:
cp –f hello /
返回HHCO5272-R1/uClinux 目录,执行make 进行编译,这样编
译通过后的可执行程序hello 就被复制到宿主机/目录下以方便下
面mount 执行,避免mount 时要进入很深的目录。
在宿主机上启动minicom 作为目标板的仿真终端
mount 宿主机存放该应用程序的目录,例如:
mount 192.168.2.32:/ /mnt
在minicom 下执行:
cd /mnt
./hello
调试信息通过串口打印在宿主机的minicom 屏幕上或记录在syslog 文
件中,这样便可进行应用程序的调试。有问题,便切换去编辑编译,
只要不重启板子端就不必作任何操作,因为mount 的宿主机硬盘上的
应用程序会自动覆盖更新,再重新执行的就是更改后的新版本。这样
反复调试、更改、编译再调试,而不必烧写板子,直至程序工作正常。
调试通过后,用gdbtftpflash 下的./flash 将最终定版的image.bin
烧写到板子上,则应用程序就会出现在板子的/bin 目录下。
华恒科技 HHCF5272-R1 技术手册 第 57 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
2.2.2 应用程序调试方法
直接在目标板上调试应用程序有两种办法:
&<048698; 打印串口:
这是嵌入式系统中最常用的调试手段,虽然简单但却有效实
用。其实几种方法相比之下,最有效便捷的方法还是printf,
因为gdb 远程调试一旦更改代码后还要烧写FLASH(mount 上
用gdbserver 应该也可以),而且gdb 调试的变量观察及设置断
点都要手工输入命令,有这时间在uClinux 下编译早已完成了。
&<048698; 使用log 记录文件。例如使用syslog 将应用程序运行过程中的
中间信息全部记录在/var/log/syslog 下。
&<048698; gdb 调试
板子上移植了gdbserver,所以支持通过以太网或串口远程调
试。下面介绍以太网调试步骤:(当然首先要求板子与宿主机
的以太网可以互相ping 通)
先在板子端启动gdbserver
cd /bin
gdbserver 192.168.2.111:4444 myapp
【注】这里myapp 为用户应用程序可执行文件名,设已烧制在
板子/bin 目录下,4444 为TCP 端口号,以后宿主机就通过这
个端口与板子建立调试通道。(端口号可任取,一般 >2000)
然后在宿主机侧:
cd /HHCF5272-R1/uClinux/user/myapp
/HHCF5272-R1/uClinux/tools/m68k-elf-gdb myapp.gdb
则进入gdb 提示符:
(gdb) target remote 192.168.2.111:4444
上一步就是与板子建立TCP 连接以进行调试,192.168.2.111 为
华恒科技 HHCF5272-R1 技术手册 第 58 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
板子出厂默认的IP。进行调试时不要运行run,而应该用
continue,即c。
下面是调试板子上的ifconfig 命令时板子上的信息记录:
/bin> gdbserver 192.168.2.175:4000 ifconfig
Process ifconfig created; pid = 68
code at 1a0058, data at 1a567c
Remote debugging using 192.168.2.175:4000
同时宿主LINUX PC 机上的信息记录为:(PC 机上ifconfig 的
代码在uClinux/user/route 下)
[root@localhost route]# /HHCO5272-R1/uClinux/tools/m68k-elfgdb
ifconfig.gdb
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,
and you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty"
for details.
This GDB was configured as "--host=i686-pc-linux-gnu --
target=m68k-bdm-elf"...
(gdb) target remote 192.168.2.175:4000
Remote debugging using 192.168.2.175:4000
0x1a0058 in _stext ()
(gdb) c
Continuing.
华恒科技 HHCF5272-R1 技术手册 第 59 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
Program exited normally.
(gdb)
【注意】
要实现gdb(或ddd)的源代码级调试,必须在编译应用程
序时打开-g 参数。这个要修改uClinux/user/arch/coldfire/build.mk
文件来实现:
CCFLAGS = -O2 -msoft-float -g
修改完毕后,在uClinux 下执行make,重编后,FLAT 格式的
可执行文件大小没有变化,只是.gdb 文件变大了很多。这样在
gdb 和ddd 环境中就可以看到原代码了。
或者是:
修改uClinux/linux/.config 文件,使之有如下内容:
CONFIG_FULLDEBUG=y
同时uClinux/linux/include/linux/autoconf.h 文件中有如下内容:
#define CONFIG_FULLDEBUG 1
这样做和上面的方法是一个道理,都是为了加入-g 参数。
&<048698; ddd 窗口集成调试环境
软件目录:HHCF5272-R1/ddd-5272,下面有三个文件
ddd-5272.tgz 【ddd 源代码】
ddd.pdf 【ddd 使用英文手册】
lesstif-0.93.15.tar.gz 【ddd 使用过程中可能要用到的库,
对于Redhat 6.x 的宿主环境就要使用该库。库的安装方法是首
先解开压缩包,进入解开的目录,运行./configure,make 以及
make install 然后修改/etc/ld.so.conf, 在其中加入
/usr/local/LessTif/Motif2.0/lib 路径并运行ldconfig 就可以了。】
1. ddd-5272 的安装:
tar zxvf ddd-5272.tgz
华恒科技 HHCF5272-R1 技术手册 第 60 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
cd ddd-5272
./ddd-5272-install
2. ddd-5272 的使用:
首先,在minicom 下设置,例如TARGET 的IP 要设为宿主
机的IP 192.168.1.1,运行gdbserver 时要绑定4000 端口。
例如:>gdbserver 192.168.1.1:4000 myapp
ddd-5272 连接的宿主机IP 地址可以通过修改配置脚本:
/etc/ddd-5272.init 来完成。
注:上述myapp 是需要调试的应用程序,并且一定要写全路径。
然后,宿主LINUX PC 机startx 进入XWindows,运行ddd-5272
就可以了。
例如: bash#ddd-5272 myapp.gdb
进入ddd 环境后的显示如下图示:
华恒科技 HHCF5272-R1 技术手册 第 61 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
2.2.3 如何创建编译自己的应用
&<048698; 代码编写前应多阅读一下user 目录下的类似应用程序的代码或从
华恒科技 HHCF5272-R1 技术手册 第 62 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
网上查找相关代码下载后阅读。
函数调用可参见《UNIX 环境高级编程》(见附录B),因为书中
所述为UNIX 环境开发,但基本类似,具体应用到LINUX 时请
使用man 查看帮助。uClinux 的lib(uClinux/lib)虽然实现了很
大部分的C 函数,不过与标准的linux 库还是有很大的区别的。
而且由于实现的问题,可能会碰到一些莫名其妙的问题,这些可
能是由于uClinux 本身的库不完备造成的。在程序移植时可能会
有函数未定义的问题。对于这种问题,一般要求开发者自己编制
这些要用到却又未定义的函数。
uClinux 下所有的应用程序都采用静态连接。
&<048698; Makefile 可以从user 下某个目录中的Makefile 作为样本,稍做改
动即可使用。
&<048698; 修改user 目录下的Makefile,使其将用户的应用程序目录加入编
译队列。具体方法:加入如下行:DIRy += dir
其中dir 是你的应用程序源码目录。注意,要在你自己的应用程
序的Makefile 文件中加入拷贝命令以拷贝可执行文件到romfs/bin
目录下。
下面举例说明:
在user 目录下创建hello 的目录
cd /HHCF5272-R1/ uClinux/user
mkdir hello
修改user 下Makefile,加入:
DIRSy+=hello
编写hello.c,只是打印串口hello 字符串。Makefile 则以user/ping 的
Makefile 为模板,将两处ping 改为hello 即可,Makefile 见下:
EXEC = hello
OBJS = hello.o
FLTFLAGS = -s 8192
华恒科技 HHCF5272-R1 技术手册 第 63 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
all: $(EXEC)
$(EXEC): $(OBJS)
$(LD) $(LDFLAGS) -o $@.elf $(OBJS) $(LDLIBS)
$(CONVERT)
cp $(EXEC) ../../romfs/bin
cp –f hello /
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
然后退到/HHCF5272-R1/uClinux/目录下执行make,编译通过后,
再用gdbtftpflash 工具将编译生成的/tftpboot/image.bin 烧写到FLASH
中重启,则板子的/bin 目录下就会看到hello 可执行应用。
【注意】
&<048698; 用户自己开发应用程序一定要放在HHCF5272-
R1/uClinux/user 目录下,否则,若放在其它目录下将有太多
的宏要自己定义,非常繁琐。而且编译时一定要返回uClinux
进行编译,而不能直接在自己应用的目录下编译。
&<048698; Makefile 中的缩进一律要用Tab 键,不允许有任何空格键。
2.2.4 如何移植软件
在LINUX 这个开放的世界里,从网上下载相关软件并移植到给定的
平台上将是一种常见的工作模式,其实就具体的工作而言,同上一节没有
什么区别。下面以telnetd 的移植为例说明。从网上下载的软件包中user 目
录下包含了许多应用软件,但编到板子上的只是其中一部分,要加入新的
华恒科技 HHCF5272-R1 技术手册 第 64 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
应用就要自己作一些工作。在光盘安装后都提供了这些应用源代码,这些
代码其实都已经是成功移植到uClinux-Coldfire 平台上的,用户只要改动一
些宏及Makefile 即可将其加入romfs/bin,然后烧制到板子上。其实加入只
需要两个步骤:
&<048698; 修改user 下Makefile,加入:
CONFIG_USER_TELNETD_TELNETD = y
&<048698; 修改uClinux/romfs.mk,将原来的:
BIN$(CONFIG_USER_TELNETD_TELNETD)+=$(USER)/telnetd/telnetd
改为:
BINy += $(USER)/telnetd/telnetd
这样在uClinux 目录下make 后就会在romfs/bin 目录下看到telnetd 这
个可执行文件,烧写后就在板子的/bin 目录下。
2.2.5 关于多进程
由于uClinux 没有mmu 管理存储器,在实现多个进程时(fork 调用生
成子进程)需要实现数据保护。uClinux 只支持vfork。uClinux 的fork 等
于vfork。实际上uClinux 的多进程管理通过vfork 来实现。这意味着uClinux
系统fork 调用完程后,要么子进程代替父进程执行(此时父进程已经sleep)
直到子进程调用exit 退出,要么调用exec 执行一个新的进程,这个时候将
产生可执行文件的加载,即使这个进程只是父进程的拷贝,这个过程也不
能避免。当子进程执行exit 或exec 后,子进程使用wakeup 把父进程唤醒,
父进程继续往下执行。
下面给出一个典型的用vfork 实现的多进程代码:
int pid;
if ((pid=vfork())<0){
printf("vfork error\n");
华恒科技 HHCF5272-R1 技术手册 第 65 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
}
else if (pid==0){//子进程
execl("/bin/ifconfig","ifconfig",(char*)0);
exit(0);
}
else{//父进程
//若需要等待子进程返回,则需要调用waitpid
if(waitpid(pid,NULL,0)!=pid)
printf("wait pid error! ");
……
}
uClinux 的这种多进程实现机制同它的内存管理紧密相关。
uClinux 针对nommu 处理器开发,所以被迫使用一种flat 方式的
内存管理模式,启动新的应用程序时系统必须为应用程序分配存
储空间,并立即把应用程序加载到内存。缺少了MMU 的内存重
映射机制,uClinux 必须在可执行文件加载阶段对可执行文件reloc
处理,使得程序执行时能够直接使用物理内存。
2.3 设备驱动开发
华恒COLDFIRE 嵌入式LINUX 系列开发套件都提供接口底板的电路
图,并有和核心板接口的250 芯插座信号的详细定义,这样用户可以通过
定制底板来扩展自己需要的接口,例如,可外接ISA 总线的以太网控制芯
片来增加以太网接口、扩展多串口、扩展A/D 数据采集接口、扩展红外接
口等等。所有这样硬件接口的扩展都需要在操作系统软件上提供设备驱动
程序的支持,从而可以为上层软件所访问。
华恒科技 HHCF5272-R1 技术手册 第 66 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
下面设备驱动开发的介绍均基于uClinux 2.0 内核版本,2.4 内核的设
备驱动与2.0 略有区别。
在具备了基本的概念之后,驱动开发最为快捷有效的方式就是在
uClinux/linux/drivers/下的各种驱动中找到与自己设备相类似的驱动代码,
阅读代码框架结构,并以此为基础进行修改从而使之变为自己的驱动程
序。
2.3.1 简介
Linux 的设备管理(即输入输出子系统)是操作系统的重要组成部分。
与进程管理、内存管理、和文件系统相比,设备管理相对来说要“乱”一
些。这主要是应为存在多种多样的输入输出设备,导致难以形成一个通用
的解决方案。尽管如此,输入输出子系统的基本功能就是要提供一个统一
而简单的输入输出系统调用接口。
输入输出子系统可分为上下两部分:一部分是下层的、设备相关的,即所
谓的设备驱动程序,它直接与相应设备打交道,并向上提供一组访问接口。
另一部分是上层的、设备无关的,这部分根据输入输出请求,通过特定设
备驱动提供的接口,与设备进行通信。
虽然设备种类繁多,但是为了便于使用,输入输出子系统必须提供一
个简单统一的设备使用接口。与其它UNIX 一样,LINUX 将各种设备都作
为特殊文件来处理。也就是说,对设备可以进行read 和write 等操作。这
些都是由输入输出子系统的设备无关部分来完成的。
为LINUX 内核编写驱动程序,并不像其他操作系统那么复杂。实际
上,我们所要做的只是为相应的设备编写几个基本函数并向VFS 注册即
可。当上层应用要使用该设备时,VFS 就会调用相应的设备函数。
LINUX 下设备驱动程序的编制和pSOS 下写BSP 类似,一般的工作方式
都是在一个现成的驱动程序的基础上针对特殊的硬件设备做相应的改动,
华恒科技 HHCF5272-R1 技术手册 第 67 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
并不是要求从头编起,当然,还是要求对设备驱动程序有相当的了解。设
备驱动多数是基于中断的(安装中断处理函数,即注册对应置中断向量表,
使用LINUX 提供的注册函数request_irq);但也有基于轮询方式的;有的
甚至是在运行时动态切换,如并口驱动。
&<048715; 外设I/O 空间编址
根据内存空间是否独立,可以将I/O 空间的配置分为两种情况:一种
是I/O 空间与内存空间相互独立,这样I/O 空间的访问需要使用专门的I/O
语句如inb 和outb 等。INTEL CPU 就使用这种方法。另一种事将I/O 寄存
器作为内存的一部分,这样使用普通的内存访问语句就可以读写I/O 寄存
器。Motorola 680x0 就采用这种体系结构。我们华恒板子所采用处理器的
MCF5272 就是这样。即其RAM,FLASH,外设I/O 均参与统一平坦编址,
也没有地址变换,没有内存保护。
&<048715; 模块支持
标准PC 上的LINUX 可以以模块的形式加载各种类型的设备。
要求在设备驱动中编制两个入口点:
init_module();
cleanup_module();
与内核相关的所有内容都在:
uClinux/linux/include/linux
uClinux/linux /include/asm
两个目录下的头文件中。
uClinux 2.0 内核并不支持模块化lkm:(loadable kernel modules),即不支
持模块化载入,因此只能将设备驱动(.o)静态的编入内核。这就要求修
改内核驱动部分编译时的Makefile,具体参见后面例子。由于uClinux 只
支持静态链接的设备驱动,它与内核编为一体, 不需要注销
(cleanup_module)。只有按模块(lkm)加载的设备,才有必要注销。
&<048715; 设备分类
设备驱动程序通常可归类为以下三种类型:
华恒科技 HHCF5272-R1 技术手册 第 68 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
字符设备(char):以字节为单位;只能按顺序访问;不用缓存。
块设备(block):以块为单位;允许随机访问;多用缓存技术。
网络接口(net)
其它设备驱动程序模块,都在uClinux/linux/drivers/目录下有分类的子
目录,如:cdrom,scsi,pci,isdn,sbus,sound。对于2.4 内核,则分类
的子目录要更多。LINUX 的文件系统:实际上就是一种软件设备驱动程序
(如ROMFS 文件系统使用的blkmem.c 和JFFS 文件系统使用的flash.c)。
所有的字符和块设备的驱动程序都支持文件操作的接口,因此用户对
任何一个设备的存取都如同对文件操作一样,即把每一个设备都当作一个
特殊文件对待。因为内核对设备的操作时通过文件接口的,因此只要特定
设备的驱动程序支持这一抽象的文件接口即可。在内核中增加一种新的设
备驱动程序是相对容易的。
&<048715; 内核空间与用户空间
设备驱动编程实际就是对LINUX 内核编程,设备驱动都是以内核态
在内核空间运行。若驱动代码编制不良,就会导致整个系统死掉,例如:
Kernel panic……
&<048715; 设备驱动程序接口
LINUX 把每一个设备都当作一个特殊文件对待,存放在/dev/目录下。
输入输出子系统向内核其它部分提供了一个统一的标准设备接口。这是通
过数据结构file_operation(include/linux/fs.h)。
struct file_operations
{
int (*lseek)(struct inode *,struct file *,off_t,int);
int (*read) (struct inode *,struct file *,char *,int);
int (*write) (struct inode *,struct file *,const char *,int);
int (*readdir) (struct inode *,struct file *,void *,filldir_t);
int (*select) (struct inode *,struct file *,int,select_table);
int (*iocrl)
华恒科技 HHCF5272-R1 技术手册 第 69 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
int (*mmap)
int (*open)
int (*release)
int (*fsync)
int (*fasync)
int (*check_media_change)(kdev_t dev);
int (*revalidate)(kdev_t dev);
};
2.3.2 设备驱动程序的框架
SVR4 曾提出DDI/DKI 规范,用以规范化设备驱动程序与内核之间的接口。
LINUX 的设备驱动与内核的接口与DDI/DKI 规范类似,可分为三部分
&<048698; 与内核接口:通过file_operations 来完成。
&<048698; 与系统启动代码的接口:对设备进行初始化。
&<048698; 与设备的接口。即对设备的读写等操作。
以uClinux 为例,系统引导时,通过sys_setup(linux/fs/filesystems.c)
进行系统初始化。而sys_setup 又调用device_setup
(linux/drivers/block/genhd.c)进行设备初始化。这里又可分为字符设备的
初始化和块设备的初始化。字符设备初始化由chr_dev_init
( linux/drivers/char/mem.c ) 完成。块设备初始化由blk_dev_init
(linux/drivers/block/ll_rw_blk.c)完成。对于字符设备,chr_dev_init 中又
分别对不同类别的字符设备进行初始化,如:tty_init,lp_init,misc_init
等,USB 驱动的初始化代码就在这里调用usb_init 。其中misc_init
(linux/drivers/char/misc.c)中又对多种属于misc 类的设备(如各类鼠标)
进行初始化。例如若加个手写板的驱动,手写板就可划为misc 类字符设备,
华恒科技 HHCF5272-R1 技术手册 第 70 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
因此手写板的设备驱动代码中提供的初始化函数,如handpad_init 函数就
应该加到linux/drivers/char/misc.c 文件中的misc_init 函数中进行调用。而
设备的注册就在这些init 函数中被调用,例如misc 类字符设备的init 函数
中就要调用misc_register,例如busmouse.c 中的bus_mouse_init 最后就调
用misc_register。而对于其他非misc 类字符设备,就在其init 函数中调用
register_chrdev。例如:打印驱动lp.c 中的lp_init 中就调用register_chrdev。
2.3.3 设备驱动编程注意事项
&<048698; 库函数使用
由于内核是个自我封闭的系统,无法使用libc 中提供的标准库函数,
内核重新封装实现了一些常用的库函数,如字符串操作,memcpy 等,
这都是经过多人高度优化的代码,可读性不是很强,但性能却是最佳,
这也正是内核所追求的。
&<048698; 内存分配
内核态下编程也要使用栈,即内核栈,只有8K 大小。且一旦栈溢出,
就可能会导致内核崩溃。因此使用栈一定要小心。对于大数组使用,
应该用静态变量或分配到堆上。
&<048698; I/O 空间检查
在为设备分配要使用的I/O 地址时,需要检查该地址空间是否已经被
其它设备所占用。即:request_region。
&<048698; 睡眠唤醒队列 interruptible_sleep_on
在设备驱动代码中经常遇到要等待数据到达的情况,如DMA 操作,
但内核态不能陷入死循环等待,它必须要处于这样一种状态:等待但
又不占用CPU。
LINUX 支持这种工作模式,驱动程序处于睡眠状态并交出CPU,这
华恒科技 HHCF5272-R1 技术手册 第 71 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
时该进程被放入一个睡眠等待唤醒队列。在中断处理程序中有数据到
达时,就从队列中找到该进程并唤醒之。
2.4 内核和2.0 内核代码中对睡眠唤醒队列的定义有所不同,但调用函
数是相同的。(具体可阅读uClinux/drivers/下面的具体的驱动代码,大
多数驱动代码中都要使用睡眠唤醒队列)
在2.0 内核下睡眠唤醒队列的定义和使用如下:
struct wait_queue *wq = NULL;
在2.4 内核下,睡眠唤醒队列的定义和使用如下:
DECLARE_WAIT_QUEUE_HEAD(wq);
睡眠唤醒队列的使用和调用函数都相同,即:
interruptible_sleep_on(&wq);
wake_up_interruptible(&wq);
&<048698; 设备的中断
轮询方式要做在应用程序层,只有采用中断方式的设备驱动才需要在
内核中完成。一般的,可以在打开设备或初始化设备时调用request_irq
注册一个中断,在关闭设备时调用free_irq 注销这个中断。
&<048698; 实现file_operations 指定的接口操作函数。
初始化、注册等操作完成后,才开始真正构建设备驱动程序的大部分
代码,即通常要实现的操作,如open,read,write,ioctl 等。
2.3.4 添加自己的设备驱动
字符设备驱动的典型例子有:
串口驱动(uClinux/linux/drivers/char/mcfserial.c)、
打印驱动(uClinux/linux/drivers/char/lp.c)、
华恒科技 HHCF5272-R1 技术手册 第 72 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
USB 设备驱动(uClinux/linux/drivers/char/usb.c)等。
块设备驱动的典型例子有:
ROMFS:uClinux/linux/drivers/block/blkmem.c
JFFS 驱动:uClinux/linux/drivers/block/flash.c
硬盘驱动:uClinux/linux/drivers/block/hd.c 等。
以太网驱动的典型例子:
FEC 驱动:uClinux/linux/drivers/net/fec.c
具体步骤:(仅适用于字符设备和块设备,网络设备)
&<048698; 在/dev/下用mknod 手工创建一个设备,设备名即下面要注册使用的设
备名。例如:
mknod usb c 23 0
其中c 代表字符设备,23 代表主设备号,0 代表次设备号。
对于2.4,则是要用touch,例如:
touch @usb,c,23,0
uClinux 自带工具集中的genromfs 工具会将@usb 自动转换为usb。
usb 这个名字要与下面注册函数中使用的字符串统一。
&<048698; 设备初始化函数, 一般为xxx_init , 例如usb_init 。将它加到
uClinux/linux/drivers/char/mem.c 文件的chr_dev_init 函数中,
chr_dev_init 函数将在LINUX 操作系统启动过程中被调用,它完成所
有字符设备驱动的初始化。同理块设备的初始化函数调用要加到
uClinux/linux/drivers/block/ll_rw_blk.c 文件的blk_dev_init 函数中,这
个函数也是在LINUX 操作系统启动时调用执行,它完成所有块设备
的初始化调用。同理,所有以太网设备驱动的初始化xxx_probe 函数
调用都要加到uClinux/linux/drivers/net/Space.c 中去。在这些初始化函
数中要完成如下工作:
&<048698; 填充file_operations 数据结构,指定要实现向上提供的接口操作。
并以此为参数,用register_chrdev 和register_blkdev 向操作系统
注册。实际上就是向内核注册一个设备文件(主设备号/次设备号)
华恒科技 HHCF5272-R1 技术手册 第 73 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
及其一系列标准操作接口。注册的工作就是向LINUX 管理的设
备链表中加入一个节点。
&<048698; 外设芯片的片选、中断等相关的初始化工作。
&<048698; 用request_irq 向操作系统申请中断。
&<048698; 外设芯片自身所需要的一些硬件初始化工作。
&<048698; 剩余就是大量的编码工作,完成那些向操作系统注册的接口函数以及
中断处理函数的编码。这些代码都是和外设芯片的硬件特性密切相关
的。它们构成了设备驱动.c 文件的大部分代码量。
2.3.5 RAM 版调试内核
因为设备驱动开发实际上就是对LINUX 内核编程,因此它的调试无
法像前面应用程序处介绍的mount 调试,而只能每次都烧写FLASH 来调
试,这样反复烧写既慢又影响FLASH 寿命,因此烧写FLASH 的ROM 版
不适合于作内核开发调试。
uClinux 支持RAM 版本内核,即将内核编译成在RAM 中执行的方式,
然后将image.bin 下载到开发板的RAM 中指定(ld 文件中指定)的位置,
并从其代码段第一句开始执行,则内核就可以跑起来,就像从FLASH 上
启动一样,只不过它完全在RAM 中跑,一断电就没有了。
有了RAM 版,就大大方便了用户对内核改动的调试,例如调试设备
驱动代码,每次修改完代码后,到uClinux 目录下编译,生成image.bin,
然后用华恒提供的bootloader(要先烧到开发板的FLASH 上)read 下载到
板子的RAM 中,再用go 100000 命令将内核跑起来调试,看设备驱动工
作是否正常。
对驱动的调试可以通过在驱动代码中用printk 打印串口来调试,对内
核级的调试也就只有这种最原始的方法有效了。
华恒科技 HHCF5272-R1 技术手册 第 74 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
光盘安装后uClinux 目录下内核源代码中默认的设置为ROM 版,即
要烧制到FLASH 中运行。
&<048727; 从ROM 版修改为RAM 版
1. 修改uClinux/linux 下.config 文件:
platform 处CONFIG_RAMKERNEL=y
2. 修改uClinux/linux /include/linux/autoconf.h
platform 处
#define CONFIG_RAMKERNEL
#undef CONFIG_ROMKERNEL
然后重新编译即可(这里用户不必自己修改ld 文件,因为华恒出
厂安装光盘中提供了默认的RAM 版的ld 文件,即:
uClinux/linux/arch/m68knommu/platform/5272/MOTOROLA/ram.ld
,只要前面指定了CONFIG_RAMKERNEL,编译器就会自动使
用这个ram.ld)。
在进行内核调测时可以先用chk 工具将华恒提供的bootloader 映
象chk/bootloader.bin 烧写到FLASH 中,然后每次重编RAM 版LINUX
内核后(其image.bin 将自动被复制到/tftpboot 目录下),在bootloader
提示符HHCN>下执行:
set server 192.168.2.32 【假设宿主机IP 为192.168.2.32】
set client 192.168.2.112
read 【若TFTP 连接读取正确,这里可以看到有一个小
竖线在不停的转动,表明正在通过TFTP 下载数据。】
go 100000 【不是100400,因为RAM 版没有使用ramvect】
则板子就会将RAM 版linux 跑起来,用户可进行测试,发现问题
只要重编并下载执行即可,这样又快又可避免反复烧写FLASH 而缩
短板子寿命。
【注意】
上面选择0x00100000 这个RAM 地址用来作RAM 版uClinux 的
华恒科技 HHCF5272-R1 技术手册 第 75 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
起始地址是由bootloader 决定的。因为bootloader 代码中默认的用read
命令读入RAM 的起始地址就是0x00100000。所以看到:
uClinux/linux/arch/m68knommu/platform/5272/MOTOROLA/ram.ld
文件中指定的RAM 起始地址为:
ram: ORIGIN = 0x100000 LENGTH = 0xe00000
这样就两端一致从而可以保证RAM 版uClinux 在bootloader 下跑起
来。
&<048727; 关于从bootloader 烧写并启动ROM 版LINUX 内核的改动
出厂光盘中的ROM 版是板子加电后可以直接启动的LINUX 版本,
而不是可以通过bootloader 启动的。若要通过bootloader 启动,则必
须使得板子在FLASH 上为bootloader 预留出起始的一段空间。这是
通过修改ld 文件来实现的,即rom.ld 中rom 的起始地址不能为
0xffc00000,而必须后移一段空间留给bootloader。光盘安装目录
linux/arch/m68knommu/platform/5272/MOTOROLA/目录下提供一个为
改用途而改写的rombootldr.ld,该ld 为bootloader 预留了256K FLASH
空间。若要生成在bootloader 下可启动的linux 内核映象时,可直接备
份原来的rom.ld 文件,而将rombootldr.ld 改名为rom.ld 重新编译即可。
编译完成后,在板子bootloader 提示符下执行如下命令:
read 【注意正确设置tftp 服务器IP 为编译内核的宿主机IP】
flash
go ffc40400
这时就会看到uClinux 打印出来的启动信息了。注意,下次重启板子
仍然是先进入bootloader,每次要启动uClinux,都要
go ffc40400
才行。
华恒科技 HHCF5272-R1 技术手册 第 76 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
第三章 硬件系统
3.1 功能模块结构图
核心板:
Coldfire 5272
处理器
2M×16 FLASH
8M×16 SDRAM
核心板接口插座(100 线×2+50 线×1 插座)
USB 收发器
LAN物理层收发器
复位reset 及
WATCHDOG 电路
运行指示
48M USB 时钟
25M LAN时钟
UART USB FEC
USB
FEC
UART0
UART1
AB
DB
GPIO
SPI
PWM
中断
BDM
BDM
华恒科技 HHCF5272-R1 技术手册 第 77 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
底板:
USB 插座
以太网插口
核心板接口插座(100 线×2+50 线×1 插座)
串口1
+9V 外部电源稳压器+3.3V
串口2
BDM插座
3.2 各个部分的构成
&<048698; 内存部分:两片16×2M 位数据宽度的FLASH,共4M 字节 Flash
(MX29LV160BTC,如有不同型号,则是完全兼容的器件),速度
70/90ns; 两片16×8M 位数据宽度的SDRAM(HY57V651620B TC-
10S,如有不同型号,则是完全兼容的器件)构成,共16M SDRAM。
&<048698; 数据通讯口和外部输入输出口:底板提供两个RS232 接口;一个10M
100M 自适应快速以太网接口;
华恒科技 HHCF5272-R1 技术手册 第 78 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
3.3 内存映射
华恒开发板两片8M ×16 位数据宽度的SDRAM 构成,共16M RAM,
从00000000-0x00FFFFFF
2 片2M FLASH,第一片:FFC00000-FFDFFFFF
第二片:FFE00000-FFFFFFFF
地址空间片选介质备
注
0x00000000-0x00FFFFFF CSBR7/ CSOR7 SDRAM 16M
0xFFC00000-0xFFDFFFFF CSBR0/ CSOR0 第一片FLASH 2M
0xFFE00000-0xFFFFFFFF CSBR1/ CSOR1 第二片FLASH 2M
MX29LV160BTC FLASH 扇区(sector)分布:
2M 字节的一片FLASH,工作在16 位双字节模式,共35 个扇区,除
前四个扇区不规则,大小分别为:16K,8K,8K,32K 外,剩余31 个扇
区均为64K 字节大小。
以下给出的为偏移地址,绝对地址要加上0xffc00000。
0x0, 0x4000, 0x6000, 0x8000, 0x10000,
0x20000, 0x30000,0x40000,0x50000,0x60000,
0x70000, 0x80000, 0x90000, 0xa0000,0xb0000,
0xc0000, 0xd0000, 0xe0000, 0xf0000,0x100000,
0x110000, 0x120000, 0x130000, 0x140000, 0x150000,
0x160000, 0x170000, 0x180000, 0x190000, 0x1a0000,
0x1b0000, 0x1c0000, 0x1d0000, 0x1e0000, 0x1f0000
华恒科技 HHCF5272-R1 技术手册 第 79 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
3.4 总线
&<048698; MCF5272 是23 位地址总线和32 位数据总线。66M 的主频和66M 的
总线速度。MCF5272 所用的COLDFIRE V2 的核内部使用的是32 位
的内部地址总线,但其中只有23 位通过CPU 引脚给出来。
&<048698; 若外接8 位或16 位数据宽度的外设芯片,与CPU 相接时,5272 的数
据总线宽度是可配置的,可分别配为32 位、16 位或8 位模式。设置
是在CSBRn 中的BW 位(参见5272 CPU 手册P8-3)实现的。在给
外设分配片选时,设置好它的CSBR 中的这两位,在访问它的地址时
就可以改变数据宽度。16 位数据宽度时,是高16 位数据线有效。8
位模式时,是最高8 位数据线有效。
【注意】
这个对CS0 是无效的,因为CS0 是接存放启动代码的内存的,一般
都是FLASH,在CPU 刚加电时,要读取FLASH 前8 个字节存放的SSP
和PC 指针值,这时的数据宽度就无法用CSBR0 来设置了,就只有硬件实
现了:把QSPI_Dout/WSEL 管脚电平拉高,则设为16 位数据宽度,把
QSPI_Dout/WSEL 管脚电平拉低,则设为16 位数据宽度。
两片SDRAM 为32 位寻址,但两片的数据总线分别接5272 高16 位和低16
位数据总线,这样拼成32 位SDRAM 使用,所以两片SDRAM 共享一个
CS7。而两片FLASH 则固定位16 位数据读写访问模式,它就只接5272 的
高16 位数据总线,但它各用一个片选CS0/CS1。
华恒科技 HHCF5272-R1 技术手册 第 80 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
3.5 端口分配
端口接口备注
Port A[6:0] USB 接口 Bit0 to bit13
Port B[3:0] 串口0 Bit0 to bit15
Port B[15:8] 以太网接口 Bit16to bit15
Port C 只作GPIO,而且只在
总线16 位模式有效
Bit0 to bit31
Port D 串口1,不能被复用为
GPIO
Bit0 to bit9
说明: MCF5272 共提供48 个通用IO 引脚,它们可以分为3 个16 位PORT,
即PORTA、PORTB、PORTC。其中PORTA,PORTB 对应的控制寄存器
来实现与其它信号引脚的复用。Port C 没有PCCNT 寄存器,它只能在工
作为外总线16 位模式时作为16 位的I/O 口线使用,即它与D[0~15]复用,
只有16 位外总线模式时,因为只用高16 位D[16~31],这时D[0~15]就
为PC[0~15]。另外的一个端口Port D 不能被用做I/O 线。
系统剩余资源:
GPIO:
PA7~PA14(8 根引脚);PB4~PB7(4 根引脚);
若去掉USB 接口,则PA[6:0]可用(7 根引脚)。
所以一般的去掉USB,通用IO 引脚可用的有8+4+7=19 根。
串口0 所占用的PB[3:0] ( 4 根引脚), 其中PB0/1 为
URT0_TxD/URT0RxD,PB2/3 为CTS/RTS。
若去掉串口0 的CTS/RTS,又多2 根,即可19+2=21 根。
若整个去掉串口0,又多两根,即最多21+2=23 根。
华恒科技 HHCF5272-R1 技术手册 第 81 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
3.6 片选分配
片选接口备注
CS[0:1] FLASH1/FLASH2 16 位模式
CS7 SDRAM1/SDRAM2 2 片16 位拼做32 位使用,共
用一个片选CS7
3.7 中断分配
在minicom 下到/proc 目录下执行cat interrupts 可以看到板子上的中断
分配情况:显示结果前面的数值为中断向量号,对应的详细情况参见
MCF5272 CPU 手册P7-10 页,Table 7-8。
/proc> cat interrupts
69: 4156188 ColdFire Timer
73: 27879 ColdFire UART
74: 0 ColdFire UART
86: 138562 fec(RX)
87: 107515 fec(TX)
88: 2 fec(OTHER)
外部中断使用情况:
没有使用外部中断。
华恒科技 HHCF5272-R1 技术手册 第 82 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
3.8 外设接口图
核心板正面俯视图:
1
1
2
2
1
SK1 为RESET 键。
华恒科技 HHCF5272-R1 技术手册 第 83 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
LEDK1 为运行指示灯。
LEDK2 为电源指示灯。
LEDL2 为百兆以太网连接LINK 及碰撞指示灯。
LEDL1 暂时没有用到。
外设接口底板正面俯视图:
华恒科技 HHCF5272-R1 技术手册 第 84 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
HHCF5272-R1-Simp 型基本底板的主要接口和器件排布参见上图,各个
端口的名称和用途参见下表:
板上
标号
接插件名称用途
CN1 核心板连接器一用于与核心板各个数据、控制总线连接
CN2 核心板连接器二(同上)
CN3 核心板连接器三(同上)
CN4 BDM 接口用于与华恒HHBDM-5272-R1 型
BDM 调试器进行连接
CN7 串口一通用异步串行接口1
CN8 串口二通用异步串行接口2
CN9 RJ45 接口10M/100M 以太网接口
CN10 USB 接口USB 连接口(Device)
3.9 接口管脚说明
1. LED 指示灯
状态指示部分:由LED 提供一个电源指示;一个运行指示;一个LAN
接口LINK/ACTIVE 指示。
2. BDM 接口
华恒科技 HHCF5272-R1 技术手册 第 85 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
管脚说明:
_BKPT 断点输入线
DSCLK 串行时钟
_RESET 复位线
DSI 串行输入
DSO 串行输出
PST0-PST3 处理器状态
DDAT0-DDAT3 调试数据
CPUCLK CPU 时钟
_DTEA 发送错误相应
VCC 3.3V 电源输出
GND 地线
3. RS232 UART1 接口:【DB9 孔头】
华恒科技 HHCF5272-R1 技术手册 第 86 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
管脚说明:
TX1 串行口1 发送线
RX1 串行口1 接受线
RTS1 串行口1 请求发送线
CTS1 串行口1 清除发送线
4. RS232 UART2 接口【DB9 孔头】
管脚说明同上。
5. LAN 接口【RJ45 孔头】:
华恒科技 HHCF5272-R1 技术手册 第 87 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
管脚说明:
TX_P LAN 口发送线
TX_N LAN 口发送线
RX_P LAN 口接收线
RX_N LAN 口接收线
6. USB
管脚说明:
USB_1 USB 电源
USB_2 USB DUSB_
3 USB D+
7. 两个100 线插座(CN1,CN2)及一个50 线插座(CN3)
三个插座上的大部分信号都从MCF5272 处理器直接引出。
CN1 插座(CON100)
华恒科技 HHCF5272-R1 技术手册 第 88 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
其中:
华恒科技 HHCF5272-R1 技术手册 第 89 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
管脚说明:
A0-A22 地址总线
_WE 写允许信号(负逻辑)
_OE 数据输出允许(负逻辑)
_RST_OUT 系统复位信号(双向)
_CS2-_CS6 系统片选信号(负逻辑)
_INT1, 中断输入(负逻辑)
_INT3-_INT6
PB4-PB7 通用IO 口线
TIN1,TIN2 定时器口线
PWMOUT1,PWMOUT2
SPI_DO,SPI_IN SPI 口线
SPI_CK,SPI_CS0
VCC 3.3V 电源输入
GND 地线
CN2 插座(CON100)
管脚说明:
D0-D31 数据总线
PA7-PA14 通用IO 口线
_BKPT,DSCLK BDM 接口
DSI,DSO,
PST0-PST3
VCC 3.3V 电源输入
GND 地线
华恒科技 HHCF5272-R1 技术手册 第 90 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
华恒科技 HHCF5272-R1 技术手册 第 91 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
CN3 插座(CON50)
管脚说明:
_DTEA BDM 接口
CPUCLK
DDAT0-DDAT3
UA2_RX,UA2_TX 串口2
UA2_RTS,UA2_CTS
UA1_RX,UA1_TX 串口1
UA1_RTS,UA1_CTS
USB_1-USB_3 USB 口
RX_P,RX_C,RX_N 以太网口
TX_P,TX_C,TX_N
GND 地线
华恒科技 HHCF5272-R1 技术手册 第 92 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
电气特性:
电源+6V (0 ~ +10%)
工作环境温度(注1) 0°C ~ 40°C
保藏温度-20°C ~ 70°C
相对湿度25%~95%
注1:可以提供满足-40°C ~ 50°C 工作环境温度的产品;
华恒科技 HHCF5272-R1 技术手册 第 93 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
第四章 机械特性
1) CN3 插座:
2) CN1(2)插座
华恒科技 HHCF5272-R1 技术手册 第 94 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
3) HHCF5272-R1 核心板:
华恒科技 HHCF5272-R1 技术手册 第 95 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
4) HHCF5272-R1 接口底板
华恒科技 HHCF5272-R1 技术手册 第 96 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
第五章 底板的硬件设计
5.1 基本板的设计
基本板包括如下主要部分:
&<048698; 与核心板的连接器(由2 个100PIN 1.27mm 双列插座和1 个50PIN
1.27mm 双列插座构成);
&<048698; 基本端口,包括USB、以太网接口、串口、BDM 口;
&<048698; 电源,将外部输入的未稳压电源稳定为核心板和基本板上芯片所
需的3.3V 电源。
由上面的“核心板连接器一、二”的引出线排布可以看到,在核心
板的PCB 设计中,由于我们使用的是脚间距为1.27mm 的双排插座(针),
从系统走线和核心板电磁兼容性上考虑,我们将“核心板连接器一、二”
的外侧引脚大部分作为电源线和地线的引出脚;另外“核心板连接器一、
二”的内侧连线主要为数据和地址总线,以及内存访问控制线和中断以
及通用IO 口线。在基本板的设计中,由于没有用到为数众多的数据和地
址总线,因此使用两层PCB 板进行布线。
在“核心板连接器二、三”中可以看到,BDM 调试口、串口1,2、
USB 口、以太网接口均采用双排引脚并列引出,这样做的目的是便于上
述端口的直接引出和应用。
在核心板的设计中包含了,USB 收发器芯片、Level 1 和以太网隔
离变压器,因此对于USB 口和以太网口(以及BDM)接口可以直接通过
连接器从核心板上引出使用。
对于串行口1,2,因为在不同的应用中可能会被作为RS232、
RS485/422、红外接口使用,因此对该口必须使用相应的电平转换芯片。
华恒科技 HHCF5272-R1 技术手册 第 97 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
在基本板的设计中我们给出的是作为RS232 端口的方案。
5.2 用户底板原理性设计和硬件方案制定
5.2.1 基本端口的设计
USB、以太网接口、串口、BDM 口的设计可以直接参考基本板的设
计,具体电路请参考基本板的原理图和PCB。另外必须注意的是,在
串行口电平转换芯片的选择和使用中必须注意电平兼容问题,在基本
板中我们使用的是3.3V 工作电压的RS232 电平转换芯片。
5.2.2 电源的设计
核心板工作电源为单一的3.3V/0.5A 直流,在基本板中,由于电
源消耗功率较小,因此我们使用的是较为廉价的LM317 线性稳压芯
片,使用基本板的上下面铜箔作为散热面,并且使用6V/0.8A 直流电
源供电。
在其他的应用设计中根据不同的电源消耗需求,可以选择线性稳
压源方案和开关稳压源方案。对于前一种选择,可以获得低噪声、廉
价等益处,但同时也有效率低,发热较大等缺点;对于开关电源方案
正好与线性电源的优缺点相反。
使用线性电源时,我们给出以下两种参考:
华恒科技 HHCF5272-R1 技术手册 第 98 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
其一参见下图:
这是一个使用低压差线性稳压器获得2.5V 稳压输出的例子,输出
电压的计算可以使用以下的公式:Vo=1.25V * (R69+R70)/R70;
芯片上的耗散功率可以使用以下公式计算:Pc=(Vi-Vo)*Io,
由上可以看到,除了输出电流,输入和输出间的压差正比于芯片上
的耗散功率。
稳压芯片的金属背板表面工作温度必须小于80 摄氏度,设其
金属背板到散热器的热阻为Rt1,散热器到空气的热阻为Rt2,则
稳压芯片金属背板与环境的温升为:ΔT=Pc/(Rt1+Rt2);由此可以
看到减少温升必须减小Pc 或者总热阻,后者可以通过减小Rt1(使
用导热硅脂于散热器于管壳之间),减少Rt2(增大散热器面积);
其二参见下图:
华恒科技 HHCF5272-R1 技术手册 第 99 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
这是一个使用最廉价的普通线性稳压器获得3.3V 稳压输出的例子,
输出电压的计算可以使用以下的公式:Vo=1.25V * (RB8+RB7)/RB8;其他
同上,但要注意的是LM317 必须有大于2.5V 的输入输出压差才能工作在
稳压状态。因此最下输入电压要大于上者。
使用开关电源时,我们给出以下参考:
见下图:
要注意的是电感LC4 的选择,其最小平均直流工作电流必须大于输出
电流(既在规定的输出电流下其不能出现磁芯饱和现象)。另外必须注意PCB
的排版,这将决定电源的噪声幅度,在以上电路中EC4 为钽电解电容,在
一般的应用中必须另外附加并联一个0.1u 的瓷介电容,以滤除高频分量。
电源类型的选择,最终是效率、成本、体积等因素的综合考虑。
华恒科技 HHCF5272-R1 技术手册 第 100 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
5.2.3 其它电路部分的设计
在这里特别指出应当充分重视对核心板各个引出线添加缓冲电路,
以充分保证核心板和处理器的稳定性;对于核心板连接器的地线和电源
线引脚应当全部连接到相应的地和电源上。
5.2.4 PCB 设计和排版时的注意事项
PCB 布局时的考虑
首先由于100PIN 的1.27mm 间距双列插座的脚比较密,无法在焊盘间
穿线,在核心板设计中将上述插座的外围引脚大部分作为电源或地线。其
次由于核心板的读写访问速率较高,因此必须考虑到布线传输延迟对电路
的影响。在底板PCB 走线设计中时应当将涉及到数据总线、地址总线、内
存访问控制信号和中断信号等的电路部分排布在CN1,CN2 连接器之间,以
方便布线和减少信号延迟。
简单应用时可以使用2 层板,并且大面积铺地;复杂的应用使用多层
布线,并且至少有一层为地层(最好将相邻的层作为电源层。当板上有数
个电源品种时,一般来讲如果可以将使用同种电源的电路部分布局在临近
区域内,然后将电源层分割为数个区块。)
另外还应当注意以下事项:
建议保留BDM 端口;
核心板接口插座的整体布局;
板上提供必要的测试焊盘;
华恒科技 HHCF5272-R1 技术手册 第 101 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
5.2.5 PCB 在电路稳定性和抗干扰方面的考虑
应重点考虑以下几点:
1. 合理的地层和电源层分割
建议使用较为完整的一个PLANE 作为地层,如果存在多个“地”(例
如:数字地,模拟地,保护地等)可以在同一个地层上适当分割获得。
对于电源层类似上述,并且应当注意低噪声电路部分电源和高噪声电路
部分电源的隔离或滤波。
2. 合理的去耦电容排布
在电源进线端,在各个数字芯片电源引脚附近等分布适当的去耦电
容。对核心板的隔离,以及在各个端口使用适当的输入输出缓冲;
华恒科技 HHCF5272-R1 技术手册 第 102 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
第六章 售后服务及技术支持
在华恒嵌入式Linux 开发套件上进行开发时所遇到的一切问题,均可
在华恒嵌入式linux 技术论坛: http://www.hhcn.org 站点上得到专家们快
捷、准确的回答。
另外,还可以发mail 到华恒公司工程师组电子信箱
support@hhcn.com,或者直接致电华恒公司,您都会得到及时的答复。
http://www.hhcn.org 上还提供支持华恒嵌入式linux 开发板应用开发的
技术资料、源代码、开发源代码的GNU 项目以及开发套件软件的升级版
本和补丁,使得基于华恒嵌入式linux 开发板进行产品开发更快捷、便利。
华恒嵌入式Linux 开发套件 ,整体保修期为六个月,第一个月可免费
更换,但电源、插座、BDM 卡及电缆等易耗件及人为损坏不在保修范围
之内。
警告:
请务必注意静电的防护。超过任何最大承受值,均会对产品产生永久
损害。同时,不推荐在临界状态使用产品。
华恒科技 HHCF5272-R1 技术手册 第 103 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
附录
附录A 系统初始化
uClinux for COLDFIRE5272 的系统初始化由两部分完成:
&<048633; uClinux/linux/arch/m68knommu/platform/5272/MOTOROLA/crt0_rom.S
&<048633; uClinux/linux/arch/m68knommu/platform/5272/sysinit.c
其中crt0_rom.S 由汇编写成,完成CPU 的初始化设置,这是整个软
件体系的最开始执行的代码入口,CPU 一加电就跳到这里执行;sysinit.c
为C 代码,完成CPU 集成模块SIM(如串口、时钟、通用IO 等)、SDRAM、
FLASH 和其它外设接口、片选等的初始化设置。
【注】
chk 工具代码在启动时也同样做了和这里完全相同的初始化工作,因
此chk 的代码也可以用来分析启动时的初始化过程。
CPU 加电时数据总线宽度:(参见MCF5272 CPU 手册8.1.3 节和19.17
节)
MCF5272 有4 个模式选择信号(只在CPU 复位时,以后就作为QSPI
信号使用了)。
HI-Z
QSPI_Dout/WSEL
QSPI_CLK/BUSW1
QSPI_CS0/BUSW0
除了HI-Z 外,其它三个都与正常状态下的输出信号复用。HI-Z 不能
接下拉电阻,而其它三个都必须接4.7K 的上拉(表示状态为1)或下拉电
阻(表示状态为0)以对CPU 启动时的状态进行硬件配置。其中QSPI_CLK/-
华恒科技 HHCF5272-R1 技术手册 第 104 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
和QSPI_CS0/BUSW0 的状态组合决定CPU 加电时的CS0 数据总线宽度。
华恒板子的BUSW1:BUSW0 组合为[1:0],即16 位模式,因此刚加电时接
CS0 的FLASH0 的数据总线宽度为16 位模式。
下面以代码分析的形式介绍一下crt0_rom.S 中所完成的工作:
#define MEM_BASE 0x00000000 /* Memory base at address 0 */
#define MEM_SIZE 0x01000000 /* Memory size 16Mb */
#define VBR_BASE MEM_BASE /* Vector address */
#define SRAM_SIZE 4096 /* 4K 的片内SRAM */
#define MCF_SRAMADDR 0x20000000
#define ___SP_INIT MEM_BASE+MEM_SIZE
.extern mcf5272_init
.global _start
.global _rambase
.global _ramvec
.global _romvec
.global _eromvec
.global _ramstart
.global _ramend
.global _romtext
.global _eromtext
.data 下面变量放到数据段中(段的定义见当前目录下的rom.ld 文件)
/*(ld 文件介绍参见附录D 部分)
* Set up the usable of RAM stuff. Size of RAM is determined then
* an initial stack set up at the end.
*/
_rambase:
华恒科技 HHCF5272-R1 技术手册 第 105 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
.long 0
_ramvec:
.long 0
_ramstart:
.long 0
_ramend:
.long 0
_romvec:
.long 0
_romtext:
.long 0
/*
* Exception Vector Table
*/
.section .romvec 下面将SP 和PC 指针的初始值放到romvect 段的最开始
(8 个字节)
INITSP: .long ___SP_INIT-4 /* Initial SP */
INITPC: .long _start_rom /* Initial PC */
/****************************************************************
*************/
.section .romtext 下面是代码段的开始
/*
* This is the codes first entry point. This is where it all
* begins...
*/
_start_rom:
华恒科技 HHCF5272-R1 技术手册 第 106 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
nop /* Filler */CPU 加电获取PC 指针后立即跳到这
里执行,因此这是整个软件系统执行的第一句代码,即代码段的第一句。
move.w #0x2700, %sr /* No interrupts */屏蔽所有中断
下面初始化MBAR,它是CPU 内部寄存器偏移地址的基址
move.l #MCF_MBAR+1,%d0 /* Init MBAR 0x10000000 */
movec %d0, %MBAR
设置CSOR0(0x44)给FLASH 访问加时延
CPU 加电后CSBR0 中的默认值就指向接CS0 的FLASH,其基址为0
(在后面sysinit.c 中设置片选CS 时会再变换回0xFFC00000),访问位宽
由硬件自动修正CSBRO[BW]
move.l #MCF_MBAR+44,%a0
move.l #0x20,%d0
move.l %d0,%a0
nop
/*
* Enable CPU internal cache.
*/
打开CPU 内部指令和数据缓存cache
move.l #0x01000000, %d0 /* Invalidate cache cmd */
movec %d0, %CACR /* Invalidate cache */
move.l #0x80000100, %d0 /* Setup cache mask */
movec %d0, %CACR /* Enable cache */
/* Disable ACRs */
moveq.l #0,%d0
movec %d0,%ACR0
movec %d0,%ACR1
华恒科技 HHCF5272-R1 技术手册 第 107 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
/* Initialize SRAMBAR: locate SRAM and validate it */
通过初始化RAMBAR 将片内SRAM 的地址设到:0xE0000000
move.l #0xE0000021,%d0
movec %d0, %RAMBAR0
/*
* Point SP into SRAM (temporarily). SRAM is used as stack space
* while initializing the mcf5272 periphs and memory controller.
*/
临时将堆栈指针SP 设置到片内SRAM 的顶部,这是因为下面有函数
调用需要有压栈操作,而这时外接的SDRAM 还没有初始化,所以不能用。
move.l #0xE0000000+SRAM_SIZE,%sp
move.l #MCF_MBAR,%d6
/* Adjust SP to (soon to be valid) SRAM */
move.l #MCF_SRAMADDR,%d0
move.l %d0,%a0
lea SRAM_SIZE(%a0),%sp
/* Map RAMBAR and MBAR */
ori.l #0x21,%d0 /* Set Valid and C/I bit */
movec %d0,%RAMBAR0
move.l %d6,%d0
addq.l #1,%d0 /* Set Valid bit */
/* Initialize mcf5272 periphs, etc */
move.l %d6,-(%sp) /* pointer to internal resources */
jsr mcf5272_init 跳去执行sysinit.c 中的mcf5272_init
华恒科技 HHCF5272-R1 技术手册 第 108 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
lea 4(%sp),%sp
/* copy data and text segment from ROM to RAM */
将数据段和代码段都复制到SDRAM 中
move.l #_eromtext /*text*/, %a0
move.l #_stext/*data*/, %a1
move.l #_edata, %a2
_copy_data:
move.l (%a0)+,%d0
move.l %d0,(%a1)+
cmp.l %a1,%a2
bhi _copy_data
/*
* Setup VBR here, otherwise buserror remap will not work.
*/
设置中断向量表起始地址0,从而使得CPU 的出错处理和中断响应处
理可用
move.l #VBR_BASE, %a7 /* Note VBR can't be read */
movec %a7, %VBR
move.l %a7, _ramvec /* Set up vector addr */
move.l %a7, _rambase /* Set up base RAM addr */
/*
* Set to 1 meg for the Cadre III board (m5272).
*/
重新设置堆栈指针到外接16M SDRAM 的顶部
move.l #MEM_BASE+MEM_SIZE, %sp /* Set up initial stack ptr
*/
华恒科技 HHCF5272-R1 技术手册 第 109 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
move.l %sp, _ramend /* Set end ram addr */
lea.l _ebss, %a0 /* Set start of ram */
move.l %a0, _ramstart
/*
* Zero out the bss region.
*/
将bss 段全部清0
lea.l _sbss, %a0 /* Get start of bss */
lea.l _ebss, %a1 /* Get end of bss */
clr.l %d0 /* Set value */
_clear_bss:
move.l %d0, (%a0)+ /* Clear each word */
cmp.l %a0, %a1 /* Check if at end */
bne _clear_bss
/*
* Assember start up done, start code proper.
*/
_start:
下面跳到uClinux 启动代码,至此完成底层的初始化工作,开始启动
操作系统,进入硬件体系结构(arch)无关代码。
jsr start_kernel /* Start Linux kernel */
_exit:
jmp _exit /* Should never get here */
以下是C 代码中完成的初始化设置,示例代码:
MBAR_ADDR:0x10000000
华恒科技 HHCF5272-R1 技术手册 第 110 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
1 初始化片内集成模块SIM:
(MBAR_ADDR + 0x04)) = 0x0003 【双字节】
(MBAR_ADDR + 0x06)) = 0xffff 【双字节】
(MBAR_ADDR + 0x20)) = 0x88888888 【四字节】
(MBAR_ADDR + 0x24)) = 0x88888888 【四字节】
(MBAR_ADDR + 0x28)) = 0x88888888 【四字节】
(MBAR_ADDR + 0x2C)) = 0x88880000 【四字节】
(MBAR_ADDR + 0x34)) = 0x00000000 【四字节】
(MBAR_ADDR + 0x3F)) = 0x40 【单字节】
2 片选初始化
SDRAM:从00000000-0x00FFFFFF 2 片共16M 字节
CSBR7 (MBAR_ADDR+0x78): 0x00000701 【四字节】
CSOR7 (MBAR_ADDR+0x7c): 0xff00007c 【四字节】
SDCR (MBAR_ADDR+0x180): 0x4213 【双字节】
SDTR (MBAR_ADDR+0x184): 0xf539 【双字节】
FLASH:0xFFC00000-0xFFFFFFFF 2 片共4M 字节
CSBR0(MBAR_ADDR+0x40):0xffc00201 【四字节】
CSOR0(MBAR_ADDR+0x44):0xffe00014 【四字节】
CSBR1(MBAR_ADDR+0x48):0xffe00201 【四字节】
CSOR1(MBAR_ADDR+0x4c):0xffe00014 【四字节】
未用到的片选全部置0。
3 初始化串口:
MCFUART_BASE1 0x100
MCFUART_BASE2 0x140
华恒科技 HHCF5272-R1 技术手册 第 111 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
(MBAR_ADDR+0x108): 0x30 【UART0_UCR 单字节】
(MBAR_ADDR+0x148): 0x30 【UART1_UCR 单字节】
(MBAR_ADDR+0x108): 0x20 【UART0_UCR 单字节】
(MBAR_ADDR+0x148): 0x20 【UART1_UCR 单字节】
(MBAR_ADDR+0x108): 0x10 【UART0_UCR 单字节】
(MBAR_ADDR+0x148): 0x10 【UART1_UCR 单字节】
(MBAR_ADDR+0x100): 0x13 【UART0_UMR 单字节】
(MBAR_ADDR+0x140): 0x13 【UART1_UMR 单字节】
(MBAR_ADDR+0x100): 0x07 【UART0_UMR 单字节】
(MBAR_ADDR+0x140): 0x07 【UART1_UMR 单字节】
(MBAR_ADDR+0x104): 0xDD 【UART0_UCSR 单字节】
(MBAR_ADDR+0x144): 0xDD 【UART1_UCSR 单字节】
(MBAR_ADDR+0x114): 0x00 【UART0_UISR 单字节】
(MBAR_ADDR+0x154): 0x00 【UART1_UISR 单字节】
(MBAR_ADDR+0x118): 0x79 【UART0_UBG1 单字节】
(MBAR_ADDR+0x11C): 0x6B 【UART0_UBG2 单字节】
(MBAR_ADDR+0x158): 0x79 【UART1_UBG1 单字节】
(MBAR_ADDR+0x15C): 0x6B 【UART1_UBG2 单字节】
(MBAR_ADDR+0x108): 0x05 【UART0_UCR 单字节】
(MBAR_ADDR+0x148): 0x05 【UART1_UCR 单字节】
华恒科技 HHCF5272-R1 技术手册 第 112 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
4 通用IO 初始化
/*Port A */
/* 使能USB引______脚信号 */
MCF5272_WR_GPIO_PACNT(imm,0x00001555);
/* 将所有引脚作为输入 */
MCF5272_WR_GPIO_PADDR(imm,0);
/* Port B */
/* 使能串口1和FEC引脚信号*/
(MCF_MBAR + 0x88)=0x55554155
/* 将所有引脚作为输入 */
MCF5272_WR_GPIO_PADDR(imm,0);
/*32位模式下Port C不可用*/
/*Port D*/
//允许COM2口
(MCF_MBAR + 0x98)= 0x000002aa
华恒科技 HHCF5272-R1 技术手册 第 113 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
附录B LINUX 常见术语
LINUX
Linux 是一种 UNIX 操作系统的克隆,它(的内核)由 Linus Torvalds
以及网络上组织松散的黑客队伍一起从零开始编写而成。 Linux 的目标是
保持和 POSIX 的兼容。
Linux 具备现代一切功能完整的 UNIX 系统所具备的全部特征,其
中包括真正的多任务、虚拟内存、共享库、需求装载、共享的写时复制程
序执行、优秀的内存管理以及 TCP/IP 网络支持等。
Linux 的发行遵守 GNU 的通用公共许可证。
Linux 起初为基于 386/486 的 PC 机开发,但现在,Linux 也可以运
行在 DEC Alpha、SUN Sparc、M68000,以及MIPS 和 PowerPC 等计算
机上。
POSIX
POSIX 表示可移植操作系统接口( Portable Operating System
Interface ,缩写为 POSIX 是为了读音更像 UNIX)。电气和电子工程师
协会(Institute of Electrical and Electronics Engineers,IEEE)最初开发 POSIX
标准,是为了提高 UNIX 环境下应用程序的可移植性。然而,POSIX 并
不局限于 UNIX。许多其它的操作系统,例如 DEC OpenVMS 和 Microsoft
Windows NT,都支持 POSIX 标准,尤其是 IEEE Std. 1003.1-1990(1995 年
修订)或 POSIX.1,POSIX.1 提供了源代码级别的 C 语言应用编程接口
(API)给操作系统的服务程序,例如读写文件。POSIX.1 已经被国际标
准化组织(International Standards Organization,ISO)所接受,被命名为
ISO/IEC 9945-1:1990 标准。
POSIX 现在已经发展成为一个非常庞大的标准族,某些部分正处在
开发过程中。POSIX 与 IEEE 1003 和 2003 家族的标准是可互换的。
GNU
华恒科技 HHCF5272-R1 技术手册 第 114 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
GNU 是 GNU Is Not UNIX 的递归缩写,是自由软件基金会的一个项
目,该项目的目标是开发一个自由的 UNIX 版本,这一 UNIX 版本称为
HURD。尽管 HURD 尚未完成,但 GNU 项目已经开发了许多高质量的
编程工具,包括 emacs 编辑器、著名的 GNU C 和 C++ 编译器(gcc 和
g++),这些编译器可以在任何计算机系统上运行。所有的 GNU 软件和派
生工作均适用 GNU 通用公共许可证,即 GPL。GPL 允许软件作者拥有
软件版权,但授予其他任何人以合法复制、发行和修改软件的权利。
Linux 的开发使用了许多 GNU 工具。Linux 系统上用于实现
POSIX.2 标准的工具几乎都是 GNU 项目开发的,Linux 内核、GNU 工
具以及其他一些自由软件组成了人们常说的 Linux:
&<048633; 符合 POSIX 标准的操作系统 Shell 和外围工具。
&<048633; C 语言编译器和其他开发工具及函数库。
&<048633; X Window 窗口系统。
&<048633; 各种应用软件,包括字处理软件、图象处理软件等。
&<048633; 其他各种 Internet 软件,包括 FTP 服务器、WWW 服务器等。
&<048633; 关系数据库管理系统等。
GPL
GPL (General Public License)
GPL 的文本保存在 Linux 系统的不同目录下的命名为 COPYING 的
文件里。例如,键入 cd /usr/doc/ghostscript* 然后再键入 more COPYING 可
查看 GPL 的内容。
GPL 和软件是否免费无关,它主要目标是保证软件对所有的用户来说
是自由的。GPL 通过如下途径实现这一目标:
&<048633; 它要求软件以源代码的形式发布,并规定任何用户能够以源代码的形
式将软件复制或发布给别的用户。
&<048633; 它提醒每个用户,对于该软件不提供任何形式的担保。
华恒科技 HHCF5272-R1 技术手册 第 115 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
如果用户的软件使用了受 GPL 保护的任何软件的一部分,那么该软
件就继承了 GPL 软件,并因此而成为 GPL 软件,也就是说必须随
应用程序一起发布源代码。
&<048633; GPL 并不排斥对自由软件进行商业性质的包装和发行,也不限制在自
由软件的基础上打包发行其他非自由软件。
&<048633; 遵照 GPL 的软件并不是可以任意传播的,这些软件通常都有正式的
版权,GPL 在发布软件或者复制软件时声明限制条件。但是,从用户
的角度考虑,这些根本不能算是限制条件,相反用户只会从中受益,
因为用户可以确保获得源代码。
尽管 Linux 内核也属于 GPL 范畴,但 GPL 并不适用于通过系统调
用而使用内核服务的应用程序,通常把这种应用程序看作是内核的正常使
用。
Linux 的主要发行版
&<048633; Red Hat Linux
采用 RPM 的软件保管理方式,软件的安装、卸载和升级非常方便,
并提供了大量的图形化管理工具,是初学者的最佳选择。
&<048633; Mandrake
&<048633; Slackware
&<048633; Debian GNU/Linux
是由 GNU 发行的 Linux 版本,最符合 GNU 精神。提供了最大的
灵活性,适合 Linux 的高级用户。
华恒科技 HHCF5272-R1 技术手册 第 116 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
附录C 常用LINUX 命令
以下均以REDHAT LINUX 为例说明。
1) 基本命令:
ls:显示当前目录下的所有文件和目录。
ls –a :可以看到隐藏的文件,如以.开头的文件。
pwd:显示当前目录路径。
ps:列举当前TTY 下所有进程
ps –A:列举所有
cd 目录名:进入目录
mkdir 目录名:创建目录
rmdir 目录名:删除空目录
rm –rf 目录名:强行删除整个目录内容(无法恢复),其中f 表示强制
不进行提示,r 表示目录递归。
mount:查看当前系统加载的文件系统。
2) LINUX 下的文件和目录是区分大小写的。
3) TAB 文件目录匹配搜索的使用
例如华恒软件安装的目录为:/HHCF5272-R1,假设/目录下没有其它
以HH 字符开头的其它目录和文件,则要进入这个目录,只需敲入:
cd /HH
然后按下TAB 键,则SHELL 会自动匹配找到HHCF5272-R1 目录,这样
就不必完全键入剩余的CO5272-R1 字符,这个功能在访问名字很长的
文件和目录时非常有效,可以大大提供键盘输入的速度,极为方便。
4) ncftp 工具的使用:
ncftp 是LINUX 下非常好的FTP 工具软件,它除了支持FTP 命令操作
外,还支持LINUX SHELL 下的命令用法,例如,它也支持TAB 键用法,
支持目录上传和下载(用-r 或-R 参数)。ncftp 的用法,例如要FTP
华恒科技 HHCF5272-R1 技术手册 第 117 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
一台IP 为192.168.2.32 的LINUX PC 机A,命令如下:
ncftp –u hhcn 192.168.2.32
其中hhcn 为A 机器上的合法的用户,连接上之后会提示输入hhcn 用
户的密码,密码验证通过后,就进入ncftp 命令提示符。
5) 编程时获取帮助man(类似于VC 编程中的MSDN)
man,即 manunal,是 UNIX 系统手册的电子版本。根据习惯,UNIX 系
统手册通常分为不同的部分(或小节,即 section),每个小节阐述
不同的系统内容。目前的小节划分如下:
1. 命令:普通用户命令
2. 系统调用:内核接口
3. 函数库调用:普通函数库中的函数
4. 特殊文件:/dev 目录中的特殊文件
5. 文件格式和约定:/etc/passwd 等文件的格式
6. 游戏。
7. 杂项和约定:标准文件系统布局、手册页结构等杂项内容
8. 系统管理命令。
9. 内核例程:非标准的手册小节。
手册页一般保存在 /usr/man 目录下,其中每个子目录(如 man1,
man2, ..., manl, mann)包含不同的手册小节。使用 man 命令查看
手册页。
常用man 命令行:
man strtoul
6) 取消root 密码:
vim /etc/shadow
可以看到第一行内容大致如下:
root:$1$dVVd5YVP$OgZG58TL/NRExTfcr6URH.:11829:0:99999:7:-1:-
1:134539236
华恒科技 HHCF5272-R1 技术手册 第 118 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
要取消root 密码,只需将第一行root 后第一对:之间的字符全部删
除即可,删除后如下:
root::11829:0:99999:7:-1:-1:134539236
然后用:w!强行存盘(因为shadow 文件是只读的)后用:q 退出vi 则
实现取消了root 密码。
7) 修改PC 机IP 地址:
ifconfig eth0 192.168.2.32
查看路由信息:
route
8) 压缩/解压缩:
LINUX 的软件一般是以.gz 或.tar 或者.tar.gz 结尾的。前者是由gzip
压缩的,后者是先用tar 归档,在用gzip 压缩而成的。
1、以.gz 结尾的为压缩文件,用命令:gzip -d filename 来解压,
得到的文件在当前目录中,但已没有了.gz。
2、以.tar 结尾的为归档文件,用命令:tar -xvf filename 来展开,
生成的文件与源文件在同一目录中,只是少了.tar。
3、以.tar.gz 结尾的文件最常见,可直接用命令:gzip -cd filename
| tar xfv 来解开。
tar 的用法:
解压:x 参数表示解压
tar xzf HHCF5272-R1.tgz
把一个目录HHCF5272-R1 压缩成一个文件:HHCF5272-R1.tgz
tar czf HHCF5272-R1.tgz HHCF5272-R1
c 参数表示压缩。
9) 查找文件,如:main.c:
find –name main.c
或者:
locate shadow
华恒科技 HHCF5272-R1 技术手册 第 119 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
注意:locate 为模糊匹配,它会在整个根目录下递归的搜索所有子目
录,并列出所有名字包含shadow 字串的文件。
10) 在一个目录下(含子目录)的所有文件中查找含有某个字符串(如
“Modified by hhcn”)的所有文件:
grep ‘Modified by hhcn’ * -r
11) vi(m)用法
vi 是 Linux/Unix 世界里极为普遍的全屏幕文本编辑器,几乎可以
说任何一台 Linux/Unix 机器都会提供这个软件。
vi 有三种状态,即编辑方式、插入方式和命令方式。
&<048698; 在命令方式下,所有命令都要以:开始,所键入的字符系统均作
命令来处理,如:q 代表退出,:w 表示存盘。
&<048698; 当你进入vi 时,会首先进入命令方式(同时也是编辑方式)。按
下i 就进入插入方式,用户输入的可视字符都添加到文件中,显
示在屏幕上。按下ESC 就可以回到命令状态(同时也是编辑方式)。
&<048698; 编辑方式和命令方式类似,都是要输入命令,但它的命令不要以:
开始,它直接接受键盘输入的单字符或组合字符命令,例如直接
按下u 就表示取消上一次对文件的修改,相当于WINDOWS 下的Undo
操作。编译方式下有一些命令是要以/开始的,例如查找字符串
就是:/string 则在文件中匹配查找string 字符串。在编辑模式
下按下:就进入命令方式。
基本命令解释:
1.光标命令
k、j、h、l——上、下、左、右光标移动命令。虽然您可以在Linux
中使用键盘右边的4 个光标键,但是记住这4 个命令还是非常有用的。
这4 个键正是右手在键盘上放置的基本位置。
nG——跳转命令。n 为行数,该命令立即使光标跳到指定行。
Ctrl+G——光标所在位置的行数和列数报告。
华恒科技 HHCF5272-R1 技术手册 第 120 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
w、b——使光标向前或向后跳过一个单词。
2.编辑命令
i、a、r——在光标的前、后以及所在处插入字符命令(i=insert、
a=append、r=replace)。
cw、dw——改变(置换)/删除光标所在处的单词的命令 (c=change、
d=delete)。
x、d$、dd——删除一个字符、删除光标所在处到行尾的所有字符以
及删除整行的命令。
3.查找命令
---- /string、?string——从光标所在处向后或向前查找相应的字
符串的命令。
4.拷贝复制命令
---- yy、p——拷贝一行到剪贴板或取出剪贴板中内容的命令。
常用操作:
无论是开启新档或修改旧文件,都可以使用vi,所需指令为:
$ vi filemane
如果文件是新的,就会在荧幕底部看到一个信息,告诉用户正
在创建新文件。如果文件早已存在,vi 则会显示文件的首廿四行,
用户可再用光标(cursor)上下移动。
~
~
上面是一个经vi 开启的模拟文件,一行开始处的波折号(~)
表示文件的结尾。
—指令i 在光标处插入正文
华恒科技 HHCF5272-R1 技术手册 第 121 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
—指令I 在一行开始处插入正文
—指令a 在光标後追加正文
—指令A 在行尾追加正文
—指令o 在光标下面新开一行
—指令O 在光标上面新开一行
在插入方式下,不能打入指令,必需先按〈Esc〉键,返回命
令方式。假若户不知身处何态,也可以按〈Esc〉键,不管处於何态,
都会返回命令方式。
在修改文件时,如何存档及退出指定文件都非常重要。在vi
内,行使存档或退出的指令时,要先按冒号(:),改变为命令方式,
用户就可以看见在荧幕左下方,出现冒号(:),显示vi 已经改为指
令态,可以进行存档或退出等工作。
:q!放弃任何改动而退出vi,也就是强行退出
:w 存档
:w! 对于只读文件强行存档
:wq 存档并退出vi
:x 与wq 的工作一样
:zz 与wq 的工作一样删除正文
删除或修改正文都是利用编辑方式,故此,下面所提及的指令
只需在编辑方式下,直接键入指令即行。
—x 删除光标处字符(Character)
—nx 删除光标处後n 个字符
—nX 删除光标处前n 个字符
—ndw 删除光标处下n 个单词(word)
—dd 删除整行
—d$或D 删除由光标至该行最末
—u 恢复前一次所做的删除
华恒科技 HHCF5272-R1 技术手册 第 122 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
当使用vi 修改正文,加减字符时,就会采用另一组在编辑方式
下操作的指令。
— r char 由char 代替光标处的字符
—Rtext〈Esc〉由text 代替光标处的字符
—cwtext〈Esc〉由text 取代光标处的单词
—Ctext〈Esc〉由text 取代光标处至该行结尾处
—cc 使整行空白,但保留光标位置,让你开始打入
—如删除指令一样,在指令前打入的数,表示执行该指令多少
次。
要检索文件,必需在编辑方式下进行。
—/str〈Return〉向前搜寻str 直至文件结尾处
—?str〈Return〉往後搜寻str 直至文件开首处
—n 同一方向上重复检索
—N 相反方向上重复检索
—vi 缠绕整个文件,不断检索,直至找到与模式相匹配的下一
个出现。
全程替换命令:
:%s/string1/string2/g 在整个文件中替换“string1”成“string2”。
如果要替换文件中的路径:
使用命令“:%s#/usr/bin#/bin#g”可以把文件中所有路径/usr/bin 换
成/bin。也可以使用命令“:%s/\/usr\/bin/\/bin/g”实现,其中“\”是转
义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。
同时编辑2 个文件,拷贝一个文件中的文本并粘贴到另一个文件中:
命令如下:
---- vi file1 file2
华恒科技 HHCF5272-R1 技术手册 第 123 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
---- yy 在文件1 的光标处拷贝所在行
---- :n 切换到文件2 (n=next) 或者按ctrl+ww,就在两个文件间
切换。
---- p 在文件2 的光标所在处粘贴所拷贝的行
---- :n 切换回文件1
将文件中的某一部分修改保存到临时文件,例如仅仅把第20~59 行
之间的内容存盘成文件/tmp/1,我们可以键入如下命令。
---- vi file
---- :20,59w /tmp/1
如果要在 vi 执行期间,转到shell 执行,使用惊叹号(!)执
行系统指令,例如在vi 期间,列出当前目录内容,可以键入 :
:!ls
另一方面,用户可以在主目录中创建.exrc 环境文件,用set
打入选项,每次调用vi 时,就会读入.exrc 中的指令与设置。下面
是.exrc 环境文件的实例:
set wrapmarging=8
set showmode
set autoindent
12) minicom 用法
minicom 是安装REDHAT 时安装的软件, 它使用配置文件
/etc/minirc.dfl,华恒光盘安装时会提供这个文件。
【注意】
minicom 占用串口,能且仅能启动一个minicom,启动第二个时
就会报错:Device /dev/modem is locked。其中/dev/modem 就是
/dev/ttyS0,即PC 机串口1,它是在光盘安装时执行./ucinst 时创
建的链接。查看ucinst 文件,可以看到如下一行:
华恒科技 HHCF5272-R1 技术手册 第 124 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
ln -sf /dev/ttyS0 /dev/modem
minicom 所有的操作都以ctrl+A 开始,例如:退出为ctrl+A,松手
后再按下Q,则弹出如下一个小框:选Yes 即可退出minicom。
minicom 中最重要的操作就是对其进行配置的修改。这个操作要先
ctrl+A,松手后按下O,则弹出如下框:
选择第三项“Serial port setup”,则弹出下面框:
键入E 则弹出如下框,可改变波特率:
华恒科技 HHCF5272-R1 技术手册 第 125 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
若要使用PC 机的串口2 来接板子的串口1 做监控,则要在串口配置框中
选择A,即“Serial Device”,则原来的配置框第一行进入编辑模式,将
原来的/dev/modem 改为如下的:/dev/ttyS1,即串口2。
华恒科技 HHCF5272-R1 技术手册 第 126 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
退出配置框只需连续按ESC 键即可返回。
13) 软、硬盘及光驱的使用
在Linux 中对其他硬盘逻辑分区、软盘,光盘的使用与我们通常在DOS
与Windows 中的使用方法是不一样的,不能直接访问,因为在Linux
中它们都被视为文件,因此在访问使用前必须使用装载命令mount 将
它们装载到系统的/mnt 目录中来,使用结束,必须进行卸载。命令格
式如下:
mount –t 文件系统类型 设备名 装载目录
文件类型常用的有:
msdos dos 分区文件
ext2 Linux 的文件系统
swap Linux swap 分区或swap 文件
iso9660 安装CD-ROM 的文件系统
vfat 支持长文件名的dos 分区
hpfs OS/2 分区文件系统
设备名是指要装载的设备的名称,如软盘、硬盘、光盘等,软盘
一般为/dev/fd0 fd1,硬盘一般为/dev/hda hdb ,硬盘逻辑分区一
般为期hda1 hda2…等等,光盘一般为/dev/hdc。在装载前一般要在
华恒科技 HHCF5272-R1 技术手册 第 127 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
/dev/mnt 目录下建立一个空的目录,如软盘为floppy,硬盘分区为
其盘符如c、d 等等,光盘为cd-rom,使用命令:
mount –t msdos /dev/fd0 /mnt/floppy
装载一个mddos 格式的软盘
mount –t ext2 /dev/fd0 /mnt/floppy
装载一个Linux 格式的软盘
mount –t vfat /dev/hda1 /mnt/c
装载Windows98 格式的硬盘分区
mount –t iso9660 /dev/hdc /mnt/cd-rom
装载一个光盘
装载完成之后便可对该目录进行操作,在使用新的软盘及光盘前
必须退出该目录,使用卸载命令进行卸载,方可使用新的软盘及光盘,
否则系统不会承认该软盘的,光盘在卸载前是不能用光驱面板前的弹
出键退出的。
14) LILO 与GRUB
LINUX 安装时一般都安装bootloader,可以支持多操作系统并存。常
见的bootloader 有LILO 和GRUB,REDHAT6.x 使用LILO,REDHAT7.2
同时支持LILO 和GRUB,但默认使用的是GRUB。
15) diff 创建软件补丁,用patch 打补丁
diff 是生成源码补丁的必备工具。其命令格式为:
diff [命令行选项] 原始文件 新文件
常用命令行选项如下:
-r 递归处理目录 -u 输出统一格式(unified format)
-N patch 里包含新文件 -a patch 里可以包含二进制文件
它的输出在stdout 上,所以你可能需要把它重定向到一个文件。
输出格式保存了上下文(缺省是上下各三行,最少需要两行),
这样,patch 的时候可以允许行号不精确匹配的情况出现。另外,在
patch 文件的开头明确地用---和+++标示出原始文件和当前文件,也
华恒科技 HHCF5272-R1 技术手册 第 128 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
方便阅读。
通常,我们需要对整个软件包做修改,并生成一个patch 文件,
下面是典型的操作过程。
tar xzvf software.tar.gz # 展开原始软件包,其目录为software
cp _a software software-orig # 做个修改前的备份
cd software
[修改,测试……]
cd ..
diff -ruNa software-orig software > software-my.patch
现在我们就可以保存software-my.patch 做为这次修改的结果,
至于原始软件包,可以不必保存。等到下次需要再修改的时候,可以
用patch 命令把这个补丁打进原始包,再继续工作。比如是在linux
kernel 上做的工作,就不必每次保存几十兆修改后的源码了。这是
好处之一,好处之二是维护方便,由于unified patch 格式有一定的
模糊匹配能力,能减少原软件包升级带来的维护工作量。
patch
patch 程序根据补丁(patch)文件修改一个文件。补丁文件通常
是使用diff 程序建立的一个列表,这个列表包含如何修改原始文件
的一些指令。由于节省时间和空间,Patch 经常用于源代码的修补。
可以想象一个有1MB 的程序包,这个程序包的下一个版本仅仅改变了
前面一个版本的两个文件的内容,这个新版本可以完全以一个1MB 的
新版本进行发布或者以一个仅仅有1KB 的补丁文件进行发布。这个补
丁文件可以对第一个版本的进行更新,更新后的版本就和第二个版本
完全一致了。因此,如果已经下载了第一个版本,那么为了下一个版
本而进行的大数据量下载工作就可以有效地避免。
常用命令行选项:
patch [命令行选项] [待patch 的文件[patch]]
-pn patch level(n 是数字) -b[后缀] 生成备份,缺省是.orig
华恒科技 HHCF5272-R1 技术手册 第 129 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
为了说明什么是patch level,这里看一个patch 文件的头标记。
diff -ruNa xc.orig/config/cf/Imake.cf
xc.bsd/config/cf/Imake.cf
--- xc.orig/config/cf/Imake.cf Fri Jul 30 12:45:47 1999
+++ xc.new/config/cf/Imake.cf Fri Jan 21 13:48:44 2000
这个patch 如果直接应用,它会去找xc.orig/config/cf 目录下
的Imake.cf 文件,假如你的源码树的根目录是缺省的xc 而不是
xc.orig,除了mv xc xc.orig 之外,有无简单的方法应用此patch
呢?patch level 就是为此而设:patch 会把目标路径名砍去开头patch
level 个节(由/分开的部分)。在本例中,可以用下述命令:
cd xc; patch -p1 < /pathname/xxx.patch
完成操作。注意,由于没有指定patch 文件,patch 程序默认从
stdin 读入,所以用了输入重定向。
又例如:
diff -r dir1 dir2 >patch20020523.patch
递归的比较目录 dir1 与 dir2 内,所有各文件之不同处,并将不同
处记录到patch20020523.patch 文件中。
patch -p1 < [patchfile]
-p1 选项代表patchfile 中文件名左边目录的层数,顶层目录在
不同的机器上有所不同。要使用这个选项,就要把你的patch 放在要
被打补丁的目录下,然后在这个目录中运行path -p1 < [patchfile]。
16) LINUX 下的硬盘分区
对习惯于使用Dos 或Windows 的用户来说,有几个分区就有几个驱动
器,并且每个分区都会获得一个字母标识符,然后就可以选用这个字母来
指定在这个分区上的文件和目录,它们的文件结构都是独立的,非常好理
解。但对Red Hat Linux 用户来说无论有几个分区,分给哪一目录使用,
华恒科技 HHCF5272-R1 技术手册 第 130 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
它归根结底就只有一个根目录,一个独立且唯一的文件结构。Red Hat Linux
中每个分区都是用来组成整个文件系统的一部分,因为它采用了一种叫“载
入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将
一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间
在一个目录下获得。
对于IDE 硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在设
备的类型,这里是指IDE 硬盘了。“x”为盘号(a 为基本盘,b 为基本从属
盘,c 为辅助主盘,d 为辅助从属盘),“~”代表分区,前四个分区用数字1
到4 表示,它们是主分区或扩展分区,从5 开始就是逻辑分区。例,hda3
表示为第一个IDE 硬盘上的第三个主分区或扩展分区,hdb2 表示为第二个
IDE 硬盘上的第二个主分区或扩展分区。对于SCSI 硬盘则标识为“sdx~”,
SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和IDE 硬盘的
表示方法一样。
从上面可以看到,Red Hat Linux 的分区是不同于其它操作系统分区
的,它的分区格式只有Ext2(3)和Swap 两种,Ext2(3)用于存放系统
文件,Swap 则作为Red Hat Linux 的交换分区。Red Hat Linux 至少需要
两个专门的分区(Linux Native 和Linux Swap)况且不能将Red Hat Linux
安装在Dos/Windows 分区。一般来说将Red Hat Linux 安装一个或多个类
型为“Linux Native”的硬盘分区,但是在Red Hat Linux 的每一个分区
都必须要指定一个“Mount Point”(载入点),告诉Red Hat Linux 在启
动时,这个目录要给哪个目录使用。对“Swap”分区来说,一般定义一个且
它不必要定义载入点。
SWAP 分区是LINUX 暂时存储数据的交换分区,它主要是把主内存上暂
时不用的数据存起来,在需要的时候再调进内存内,且作为SWAP 使用的
分区不用指定“Mout Point”(载入点),既然它作为交换分区,我们理所
当然应给它指定大小,它至少要等于系统上实际内存的量,一般来说它的
大小是内存的两倍,如果你是16MB 的内存,那么SWAP 分区的大小是32MB
左右,以此类推。但必须还要注意一点,SWAP 分区不要大于128MB,如果
华恒科技 HHCF5272-R1 技术手册 第 131 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
你是64MB 的内存,那么SWAP 分区最大也只能被定为127MB,再大就是浪
费空间了,因为系统不需要太大的交换分区。以此类推,如果你是128MB
或更大的内存,SWAP 分区也只能最大被定为127MB。可以创建和使用一个
以上的交换分区,最多16 个。
Linux Native 是存放系统文件的地方,它只能用EXT2(3)的分区类
型。对Windows 用户来说,操作系统必须装在同一分区里,它是商业软件
吗!所以你没有选择的余地!对Red Hat Linux 来说,你有了较大的选择
余地,你可以把系统文件分几个区来装(必须要说明载入点),也可以就
装在同一个分区中(载入点是“/”)。
/boot 分区,它包含了操作系统的内核和在启动系统过程中所要用到
的文件,建这个分区是有必要的,因为目前大多数的PC 机要受到BIOS 的
限制,况且如果有了一个单独的/boot 启动分区,即使主要的根分区出现了
问题,计算机依然能够启动。这个分区的大小约在50MB―100MB 之间。但
是如果想用LILO 启动Red Hat Linux 系统的话,含有/boot 的分区必须完
全在柱面1023 以下。又由于8GB 后的数据LILO 不能读取,所以Red Hat Linux
要安装在8GB 的区域以内。
/usr 分区,是Red Hat Linux 系统存放软件的地方,如有可能应将最
大空间分给它。
/home 分区,是用户的home 目录所在地,这个分区的大小取决于有多
少用户。如果是多用户共同使用一台电脑的话,这个分区是完全有必要的,
况且根用户也可以很好地控制普通用户使用计算机,如对用户或者用户组
实行硬盘限量使用,限制普通用户访问哪些文件等。其实单用户也有建立
这个分区的必要,因为没这个分区的话,那么你只能以root 用户的身份
登陆系统,这样做是危险的,因为root 用户对系统有绝对的使用权,一
旦对系统进行了误操作,就会导致系统崩溃。
/var/log 分区,是系统日志记录分区,如果设立了这一单独的分区,
这样即使系统的日志文件出现了问题,它们也不会影响到操作系统的主分
区。
华恒科技 HHCF5272-R1 技术手册 第 132 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
/tmp 分区,用来存放临时文件。这对于多用户系统或者网络服务器来
说是有必要的。这样即使程序运行时生成大量的临时文件,或者用户对系
统进行了错误的操作,文件系统的其它部分仍然是安全的。因为文件系统
的这一部分仍然还承受着读写操作,所以它通常会比其它的部分更快地发
生问题。
/bin 分区,存放标准系统实用程序。
/dev 分区,存放设备文件。
/opt 分区,存放可选的安装的软件。
/sbin 分区,存放标准系统管理可执行文件,如insmod,ifconfig 等。
上面介绍了几个常用的分区,一般来说需要一个SWAP 分区,一个/boot
分区,一个/usr 分区,一个/home 分区,一个/var/log 分区。当然这没
有什么规定,完全是依照个人来定的。但记住至少要有两个分区,一个SWAP
分区,一个/分区。
用户可以使用两种分区工具:
1.Disk Druid:它是Red Hat Linux 提供的硬盘管理工具,它最初
是随Red HatLinux5 一起发售的,它可以根据用户的要求创建和删除硬盘
分区,另外还可以为每个分区管理载入点,这是一个不错的分区软件,建
议使用。
2.Fdisk:它是传统的Linux 硬盘分区工具,比Disk Druid 更强大,
使用更加灵活。但是Fdisk 要求用户对硬盘分区有一定经验,并能够适应
且读懂简单的文本界面。如果你是第一次对一个硬盘驱动器进行分区操作
的话,最好还是避免Fdisk 这样的程序,它虽然强大但用起来的感觉不是
太好的。
华恒科技 HHCF5272-R1 技术手册 第 133 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
附录D gcc 与gdb
gcc 是 GNU 的 C 和 C++ 编译器,它是Linux 中最重要的软件开发
工具。实际上,gcc 能够编译三种语言:C、C++ 和 Object C(C 语言的
一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。
汇编语言的编译器为as。
编译器被成功的移植到不同的处理器平台上。标准PC LINUX 上的gcc
是FOR INTEL CPU 的,而华恒COLDFIRE 系列开发套件使用的是FOR m68k
系列处理器的gcc 编译器m68k-elf-gcc 和m68k-elf-as 及其相应的GNU
Binutils 工具集(如ld 链接工具,objcopy、objdump 等工具)。
gcc 命令的常用选项有:
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU
C 的某些特色,
例如 asm 或 typeof 关键词。
-c 只编译并生成目标文件。
-DMACRO 以字符串“1”定义 MACRO 宏。
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。
-E 只运行 C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
-m486 针对 486 进行代码优化。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-O0 不进行优化处理。
-O 或 -O1 优化生成代码。
华恒科技 HHCF5272-R1 技术手册 第 134 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数。
-shared 生成共享目标文件。通常用在建立共享库时。
-static 禁止使用共享连接。
-UMACRO 取消对 MACRO 宏的定义。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
ld 文件
编译完成之后,就要执行ld 进行链接。ld 工具处理ld 文件。
ld 文件采用AT&T 链接命令语言写成,用于控制整个链接过程。
GDB
Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和
C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内
存的使用情况. Gdb 功能非常强大:
&<048633; 可监视程序中变量的值.
&<048633; 可设置断点以使程序在指定的代码行上停止执行.
&<048633; 支持单步执行等
在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常
的话, gdb 将被启动并且你将在屏幕上看到类似的内容:
GNU gdb Red Hat Linux 7.x (5.0rh-15) (MI_OUT)
Copyright 2001 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
华恒科技 HHCF5272-R1 技术手册 第 135 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i386-redhat-linux".
(gdb)
当你启动 gdb 后, 你能在命令行上指定很多的选项. 你也可以以下
面的方式来运行 gdb :
gdb
当你用这种方式运行 gdb , 你能直接指定想要调试的程序. 这将告
诉gdb 装入名为 fname 的可执行文件. 你也可以用 gdb 去检查一个因程
序异常终止而产生的 core 文件, 或者与一个正在运行的程序相连. 你可
以参考 gdb 指南页或在命令行上键入 gdb -h 得到一个有关这些选项的
说明的简单列表.
为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调
试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及
源代码的行号. gdb 利用这些信息使源代码和机器码相关联.
在编译时用 -g 选项打开调试选项.
gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件
装入到允许你检查所调用的堆栈内容的复杂命令, 表27.1 列出了你在用
gdb 调试时会用到的一些命令. 想了解 gdb 的详细使用请参考 gdb 的指
南页.
gdb 的常用命令
break NUM 在指定的行上设置断点。
bt 显示所有的调用栈帧。该命令可用来显示函数
的调用顺序。
clear 删除设置在特定源文件、特定行上的断点。其
用法为:clear FILENAME:NUM。
continue 继续执行正在调试的程序。该命令用在程序由
华恒科技 HHCF5272-R1 技术手册 第 136 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
于处理信号或断点而
导致停止运行时。
display EXPR 每次程序停止后显示表达式的值。表达式由程
序定义的变量组成。
file FILE 装载指定的可执行文件进行调试。
help NAME 显示指定命令的帮助信息。
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
info local 显示当函数中的局部变量信息。
info prog 显示被调试程序的执行状态。
info var 显示所有的全局和静态变量名称。
kill 终止正被调试的程序。
list 显示源代码段。
make 在不退出 gdb 的情况下运行 make 工具。
next 在不单步执行进入其他函数的情况下,向前执
行一行源代码。
print EXPR 显示表达式 EXPR 的值。
gdb 支持很多与 UNIX shell 程序一样的命令编辑特征. 你能象在
bash 或 tcsh 里那样按 Tab 键让 gdb 帮你补齐一个唯一的命令, 如果不
唯一的话 gdb 会列出所有匹配的命令. 你也能用光标键上下翻动历史命
令.
gdb 应用举例
下面用一个实例教你一步步的用 gdb 调试程序. 被调试的程序相当
的简单, 但它展示了 gdb 的典型应用.
下面列出了将被调试的程序. 这个程序被称为 greeting , 它显示
一个简单的问候, 再用反序将它列出.
#include
华恒科技 HHCF5272-R1 技术手册 第 137 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
main (){
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
void my_print (char *string){
printf ("The string is %s\n", string);
}
void my_print2 (char *string){
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
string2[size+1] = `\0';
printf ("The string printed backward is %s\n", string2);
}
用下面的命令编译它:
gcc -o test test.c
这个程序执行时显示如下结果:
The string is hello there
The string printed backward is
输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的.
我们所设想的输出应该是:
The string printed backward is ereht olleh
由于某些原因, my_print2 函数没有正常工作. 让我们用 gdb 看看
问题究竟出在哪儿, 先键入如下命令:
华恒科技 HHCF5272-R1 技术手册 第 138 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
gdb greeting
【注意】
记得在编译 greeting 程序时把调试选项打开.
如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可
以在 gdb 提示符下用 file 命令来载入它:
(gdb) file greeting
这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入
它一样. 这时你能用 gdb 的 run 命令来运行 greeting 了. 当它在 gdb 里
被运行后结果大约会象这样:
(gdb) run
Starting program: /root/greeting
The string is hello there
The string printed backward is
Program exited with code 041
这个输出和在 gdb 外面运行的结果一样. 问题是, 为什么反序打印
没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句
后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列
出源代码:
(gdb) list
(gdb) 回车
(gdb) 回车
(在 gdb 提示符下按回车健将重复上一个命令。)
要list 三次是因为一次无法显示全部文件内容,而必须多次才能翻
到想要设置断点的文件行处。根据列出的源程序, 能看到要设断点的地方
在第24 行, 在 gdb 命令行提示符下键入如下命令设置断点:
(gdb) break 24
gdb 将作出如下的响应:
Breakpoint 1 at 0x139: file greeting.c, line 24
华恒科技 HHCF5272-R1 技术手册 第 139 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
(gdb)
现在再键入 run 命令, 将产生如下的输出:
Starting program: /root/greeting
The string is hello there
Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at
greeting.c :24
24 string2[size-i]=string[i]
通过设置一个观察 string2[size - i] 变量的值的观察点来看出错
误是怎样产生的, 做法是键入:
(gdb) watch string2[size - i]
gdb 将作出如下回应:
Watchpoint 2: string2[size - i]
现在可以用 next 命令来一步步的执行 for 循环了:
(gdb) next
经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`.
gdb 用如下的显示来告诉你这个信息:
Watchpoint 2, string2[size - i]
Old value = 0 `\000'
New value = 104 `h'
my_print2(string = 0xbfffdc4 "hello there") at greeting.c:23
23 for (i=0; i
这个值正是期望的. 后来的数次循环的结果都是正确的. 当 i=10 时,
表达式 string2[size - i] 的值等于 `e`, size - i 的值等于 1, 最
后一个字符已经拷到新串里了.
如果你再把循环执行下去, 你会看到已经没有值分配给 string2[0]
了, 而它是新串的第一个字符, 因为 malloc 函数在分配内存时把它们
初始化为空(null)字符. 所以 string2 的第一个字符是空字符. 这解释
了为什么在打印 string2 时没有任何输出了.
华恒科技 HHCF5272-R1 技术手册 第 140 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
现在找出了问题出在哪里, 修正这个错误是很容易的. 你得把代码里
写入 string2 的第一个字符的的偏移量改为 size - 1 而不是 size. 这
是因为 string2 的大小为 12, 但起始偏移量是 0, 串内的字符从偏移量 0
到 偏移量 10, 偏移量 11 为空字符保留.
华恒科技 HHCF5272-R1 技术手册 第 141 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
附录E Makefile
GNU make
在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手
工键入 gcc 命令进行编译的话,则会非常不方便。因此,人们通常利用 make
工具来自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,
则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有
包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不
必要的重新编译。
实际上,make 工具通过一个称为 makefile 的文件来完成并自动维
护编译工作。makefile 需要按照某种语法进行编写,其中说明了如何编
译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。
当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新
编译所有依赖该文件的源文件。
makefile 文件是许多编译器,包括 Windows NT 下的编译器维护编
译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改
makefile 文件而已。默认情况下,GNU make 工具在当前工作目录中按如
下顺序搜索 makefile:
* GNUmakefile
* makefile
* Makefile
在 UNIX 系统中,习惯使用 Makefile 作为 makfile 文件。如果要使用
其他文件作为 makefile,则可利用类似下面的 make 命令选项指定
makefile 文件:
$ make -f Makefile.debug
makefile 基本结构
华恒科技 HHCF5272-R1 技术手册 第 142 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
makefile 中一般包含如下内容:
* 需要由 make 工具创建的项目,通常是目标文件和可执行文件。通常使
用“目标(target)”一词来表示要创建的项目。
* 要创建的项目依赖于哪些文件。
* 创建每个项目时需要运行的命令。
例如,假设你现在有一个 C++ 源文件 test.C,该源文件包含有自定义的
头文件 test.h,则目标文件 test.o 明确依赖于两个源文件:test.c 和
test.h。另外,你可能只希望利用 g++ 命令来生成 test.o 目标文件。
这时,就可以利用如下的 makefile 来定义 test.o 的创建规则:
# This makefile just is a example.
# The following lines indicate how test.o depends
# test.C and test.h, and how to create test.o
test.o: test.c test.h
g++ -c -g test.C
从上面的例子注意到,第一个字符为 # 的行为注释行。第一个非注
释行指定 test.o 为目标,并且依赖于 test.c 和 test.h 文件。随后的
行指定了如何从目标所依赖的文件建立目标。当 test.c 或 test.h 文件
在编译之后又被修改,则 make 工具可自动重新编译 test.o,如果在前
后两次编译之间,test.C 和 test.h 均没有被修改,而且 test.o 还存
在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤
其重要。通过这种依赖关系的定义,make 工具可避免许多不必要的编译
工作。当然,利用 Shell 脚本也可以达到自动编译的效果,但是,Shell 脚
本将全部编译任何源文件,包括哪些不必要重新编译的源文件,而 make 工
具则可根据目标上一次编译的时间和目标所依赖的源文件的更新时间而自
动判断应当编译哪个源文件。
一个 makefile 文件中可定义多个目标,利用 make target 命令可
华恒科技 HHCF5272-R1 技术手册 第 143 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
指定要编译的目标,如果不指定目标,
则使用第一个目标。通常,makefile 中定义有 clean 目标,可用来清除
编译过程中的中间文件,例如:
clean:
rm -f *.o
运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程
中产生的所有中间文件。
makefile 变量
GNU 的 make 工具除提供有建立目标的基本功能之外,还有许多便于
表达依赖性关系以及建立目标的命令的特色。其中之一就是变量或宏的定
义能力。如果你要以相同的编译选项同时编译十几个 C 源文件,而为每
个目标的编译指定冗长的编译选项的话,将是非常乏味的。但利用简单的
变量定义,可避免这种乏味的工作:
# Define macros for name of compiler
CC = gcc
# Define a macr o for the CC flags
CCFLAGS = -D_DEBUG -g -m486
# A rule for building a object file
test.o: test.c test.h
$(CC) -c $(CCFLAGS) test.c
在上面的例子中,CC 和 CCFLAGS 就是 make 的变量。GNU make 通常称
之为变量,而其他 UNIX 的 make 工具称之为宏,实际是同一个东西。在
makefile 中引用变量的值时,只需变量名之前添加 $ 符号,如上面的 $(CC)
和 $(CCFLAGS)。
华恒科技 HHCF5272-R1 技术手册 第 144 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
GNU make 的主要预定义变量i
GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中
使用。表 1-5 给出了一些主要的
预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的
预定义变量。
$* 不包含扩展名的目标文件名称。
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,
可能包含重复的依赖文件。
$< 第一个依赖文件的名称。
$? 所有的依赖文件,以空格分开,这些依赖文件的修改日
期比目标的创建日期晚。
$@ 目标的完整名称。
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。
$% 如果目标是归档成员,则该变量表示目标的归档成员名
称。例如,如果目标名称为 mytarget.so(image.o) , 则 $@ 为
mytarget.so,而 $% 为 image.o。
AR 归档维护程序的名称,默认值为 ar。
ARFLAGS 归档维护程序的选项。
AS 汇编程序的名称,默认值为 as。
ASFLAGS 汇编程序的选项。
CC C 编译器的名称,默认值为 cc。
CCFLAGS C 编译器的选项。
CPP C 预编译器的名称,默认值为 $(CC) -E。
CPPFLAGS C 预编译的选项。
CXX C++ 编译器的名称,默认值为 g++。
CXXFLAGS C++ 编译器的选项。
FC FORTRAN 编译器的名称,默认值为 f77。
华恒科技 HHCF5272-R1 技术手册 第 145 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
FFLAGS FORTRAN 编译器的选项。
隐含规则
GNU make 包含有一些内置的或隐含的规则,这些规则定义了如何从
不同的依赖文件建立特定类型的目标。
GNU make 支持两种类型的隐含规则:
* 后缀规则(Suffix Rule)。后缀规则是定义隐含规则的老风格方法。后
缀规则定义了将一个具有某个后缀的文件(例如,.c 文件)转换为具有
另外一种后缀的文件(例如,.o 文件)的方法。每个后缀规则以两个成
对出现的后缀名定义,例如,将 .c 文件转换为 .o 文件的后缀规则可定
义为:
.c.o:
$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $@ $<
* 模式规则(pattern rules)。这种规则更加通用,因为可以利用模式规
则定义更加复杂的依赖性规则。模式规则看起来非常类似于正则规则,但
在目标名称的前面多了一个 % 号,同时可用来定义目标和依赖文件之间
的关系,例如下面的模式规则定义了如何将任意一个 X.c 文件转换为 X.o
文件:
%.c:%.o
$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $@ $<
makefile 范例
运行 make
我们知道,直接在 make 命令的后面键入目标名可建立指定的目标,
如果直接运行 make,则建立第一个目标。我们还知道可以用 make -f
华恒科技 HHCF5272-R1 技术手册 第 146 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
mymakefile 这样的命令指定 make 使用特定的 makefile,而不是默认的
GNUmakefile、makefile 或 Makefile。但 GNU make 命令还有一些其他
选项,下面给出了这些选项。
-C DIR 在读取 makefile 之前改变到指定的目录 DIR。
-f FILE 以指定的 FILE 文件作为 makefile。
-h 显示所有的 make 选项。
-i 忽略所有的命令执行错误。
-I DIR 当包含其他 makefile 文件时,可利用该选项指定
搜索目录。
-n 只打印要执行的命令,但不执行这些命令。
-p 显示 make 变量数据库和隐含规则。
-s 在执行命令时不显示命令。
-w 在处理 makefile 之前和之后,显示工作目录。
-W FILE 假定文件 FILE 已经被修改。
华恒科技 HHCF5272-R1 技术手册 第 147 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
附录F uClinux 系统分析
uClinux 简介
Linux 是一种很受欢迎的操作系统,它与UNIX 系统兼容,开放源代
码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影
响在于它正逐渐的应用于嵌入式系统领域。uClinux 正是在这种氛围下产
生的。在uClinux 这个英文单词中u 表示Micro,小的意思,C 表示Control,
控制的意思,所以uClinux 就是Micro-Control-Linux,字面上的理解就是
“针对微控制领域而设计的Linux 系统”。
网络资源:
www.uclinux.org
uClinux 小型化的做法
标准Linux 可能采用的小型化方法
重新编译内核
Linux 内核采用模块化的设计,即很多功能块可以独立的加上或卸下,
开发人员在设计内核时把这些内核模块作为可选的选项,可以在编译系统
内核时指定。因此一种较通用的做法是对Linux 内核重新编译,make
munuconfig 在编译时仔细的选择嵌入式设备所需要的功能支持模块,同时
华恒科技 HHCF5272-R1 技术手册 第 148 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
删除不需要的功能。通过对内核的重新配置,可以使系统运行所需要的内
核显著减小,从而缩减资源使用量。
制作root 文件系统映象
Linux 系统在启动时必须加载根(root)文件系统,因此剪裁系统同时
包括root file system的剪裁。在x86 系统下,Linux 可以在Dos 下,使用Loadlin
文件加载启动,
uClinux 采用的小型化方法
1.uClinux 的内核加载方式
uClinux 的内核有两种可选的运行方式:可以在flash 上直接运行,也
可以加载到内存中运行。
Flash 运行方式:把内核的可执行映象烧写到flash 上,系统启动时从
flash 的某个地址开始逐句执行。这种方法实际上是很多嵌入式系统采用的
方法。这种做法可以减少内存需要。
内核加载方式:把内核的压缩文件存放在flash 上,系统启动时读取
压缩文件在内存里解压,然后开始执行,这种方式相对复杂一些,但是运
行速度可能更快(RAM 的存取速率要比flash 高)。同时这也是标准Linux
系统采用的启动方式。
2.uClinux 的根(root)文件系统
uClinux 系统采用romfs 文件系统,这种文件系统相对于一般的ext2
文件系统要求更少的空间。空间的节约来自于两个方面,首先内核支持
romfs 文件系统比支持ext2 文件系统需要更少的代码,其次romfs 文件系
统相对简单,在建立文件系统超级块(superblock)需要更少的存储空间。
Romfs 文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用
虚拟ram 盘的方法进行处理(ram 盘将采用ext2 文件系统)。
3.uClinux 的应用程序库
华恒科技 HHCF5272-R1 技术手册 第 149 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
uClinux 小型化的另一个做法是重写了应用程序库,相对于越来越大
且越来越全的glibc 库,uClibc 对libc 做了精简。
uClinux 对用户程序采用静态连接的形式,这种做法会使应用程序变
大,但是基于内存管理的问题,不得不这样做(这将在下文对uClinux 内
存管理展开分析时进行说明),同时这种做法也更接近于通常嵌入式系统
的做法。
uClinux 的开发环境
环境建立
华恒公司COLDFIRE 开发套件附送光盘中安装完成后即建立了完备的
uClinux 开发环境。
GNU 开发套件
Gnu 开发套件作为通用的Linux 开放套件,包括一系列的开发调试工
具。主要组件:
Gcc: 编译器,可以做成交叉编译的形式,即在宿主机上开发编译
目标上可运行的二进制文件。
Binutils:一些辅助工具,包括objdump(可以反编译二进制文件),
as(汇编编译器),ld(连接器),objcopy 等等。
gdb:调试器,可使用多种交叉调试方式,gdb-bdm(背景调试工具),
华恒科技 HHCF5272-R1 技术手册 第 150 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
gdbserver(使用以太网进行远程调试)。
uClinux 的打印终端
通常情况下,uClinux 的默认的标准输入输出被重定向到串口1
(/dev/ttyS0),内核在启动时所有的信息都打印到串口终端,同时也可以
通过串口终端与系统交互。uClinux 在启动时启动了telnetd(远程登录服
务),操作者可以远程登录上系统,从而控制系统的运行。至于是否允许
远程登录可以通过烧写romfs 文件系统时有用户决定是否启动远程登录服
务。
交叉编译调试工具
支持一种新的处理器,必须具备一些编译,汇编工具,使用这些工具
可以形成可运行于这种处理器的二进制文件。对于内核使用的编译工具同
应用程序使用的有所不同。在解释不同点之前,需要对gcc 连接做一些说
明:
.ld(link description)文件:ld 文件是指出连接时内存映象格式的文件。
crt0.S:应用程序编译连接时需要的启动文件,主要是初始化应用程序栈。
pic:position independence code ,与位置无关的二进制格式文件,在程序
段中必须包括reloc 段,从而使的代码加载时可以进行重新定位。
内核编译连接时,使用.ld 文件,形成可执行文件映象,所形成的代码
段既可以使用间接寻址方式(即使用reloc 段进行寻址),也可以使用绝对
寻址方式。这样可以给编译器更多的优化空间。因为内核可能使用绝对寻
址,所以内核加载到的内存地址空间必须与ld 文件中给定的内存空间完全
相同。
华恒科技 HHCF5272-R1 技术手册 第 151 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
应用程序的连接与内核连接方式不同。应用程序由内核加载(可执行文件
加载器将在后面讨论),由于应用程序的ld 文件给出的内存空间与应用程
序实际被加载的内存位置可能不同,这样在应用程序加载的过程中需要一
个重新地位的过程,即对reloc 段进行修正,使得程序进行间接寻址时不
至于出错。(这个问题在i386 等高级处理器上方法有所不同,本文将在后
面进一步分析)。
由上述讨论,至少需要两套编译连接工具。在讨论过uClinux 的内存管理
后本文将给出整个系统的工作流程以及系统在flash 和ram 中的空间分布。
可执行文件格式
先对一些名词作一些说明:
coff(common object file format):一种通用的对象文件格式
elf(excutive linked file):一种为Linux 系统所采用的通用文件格式,支持
动态连接
flat:elf 格式有很大的文件头,flat 文件对文件头和一些段信息做了简化
uClinux 系统只支持flat 可执行文件格式,gcc 的编译器不能直接形成这种
文件格式,但是可以形成coff 或elf 格式的可执行文件,这两种文件需要
coff2flt 或elf2flt 工具进行格式转化,形成flat 文件。
当用户执行一个应用时,内核的执行文件加载器将对flat 文件进行进一步
处理,主要是对reloc 段进行修正( 可执行文件加载器的详见
fs/binfmt_flat.c)。以下对reloc 段进一步讨论。
需要reloc 段的根本原因是,程序在连接时连接器所假定的程序运行空间
与实际程序加载到的内存空间不同。假如有这样一条指令:
jsr app_start;
这一条指令采用直接寻址,跳转到app_start 地址处执行,连接程序将在编
译完成是计算出app_start 的实际地址(设若实际地址为0x10000),这个
华恒科技 HHCF5272-R1 技术手册 第 152 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
实际地址是根据ld 文件计算出来(因为连接器假定该程序将被加载到由ld
文件指明的内存空间)。但实际上由于内存分配的关系,操作系统在加载
时无法保证程序将按ld 文件加载。这时如果程序仍然跳转到绝对地址
0x10000 处执行,通常情况这是不正确的。一个解决办法是增加一个存储
空间,用于存储app_start 的实际地址,设若使用变量addr 表示这个存储
空间。则以上这句程序将改为:
movl addr, a0;
jsr(a0);
增加的变量addr 将在数据段中占用一个4 字节的空间,连接器将app_start
的绝对地址存储到该变量。在可执行文件加载时,可执行文件加载器根据
程序将要加载的内存空间计算出app_start 在内存中的实际位置,写入addr
变量。系统在实际处理时是不需要知道这个变量的确切存储位置(也不可
能知道),系统只要对整个reloc 段进行处理就可以了(reloc 段有标识,系
统可以读出来)。处理很简单只需要对reloc 段中存储的值统一加上一个偏
置(如果加载的空间比预想的要靠前,实际上是减去一个偏移量)。偏置
由实际的物理地址起始值同ld 文件指定的地址起始值相减计算出。
这种reloc 的方式部分是由uClinux 的内存分配问题引起的,这一点将在
uClinux 内存管理分析时说明。
针对实时性的解决方案
uClinux 本身并没有关注实时问题,它并不是为了Linux 的实时性而提
出的。另外有一种Linux——Rt-linux 关注实时问题。Rt-linux 执行管理器
把普通Linux 的内核当成一个任务运行,同时还管理了实时进程。而非实
时进程则交给普通Linux 内核处理。这种方法已经应用于很多的操作系统
用于增强操作系统的实时性,包括一些商用版UNIX 系统,Windows NT
等等。这种方法优点之一是实现简单,且实时性能容易检验。优点之二是
华恒科技 HHCF5272-R1 技术手册 第 153 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
由于非实时进程运行于标准Linux 系统,同其它Linux 商用版本之间保持
了很大的兼容性。优点之三是可以支持硬实时时钟的应用。
中断控制硬件
Linux 内核
Linux 进程
中断控制硬件
Linux 内核
实时内核
实时任务
Linux 进程
演变
uClinux 可以使用Rt-linux 的patch,从而增强uClinux 的实时性,使得uClinux
可以应用于工业控制、进程控制等一些实时要求较高的应用。
uClinux 的内存管理
uClinux 同标准Linux 的最大区别就在于内存管理,同时也由于uClinux
的内存管理引发了一些标准Linux 所不会出现的问题。本文将把uClinux
内存管理同标准Linux 的那内存管理部分进行比较分析。
华恒科技 HHCF5272-R1 技术手册 第 154 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
标准Linux 使用的虚拟存储器技术
标准Linux 使用虚拟存储器技术,这种技术用于提供比计算机系统中
实际使用的物理内存大得多的内存空间。使用者将感觉到好像程序可以使
用非常大的内存空间,从而使得编程人员在写程序时不用考虑计算机中的
物理内存的实际容量。
为了支持虚拟存储管理器的管理,Linux 系统采用分页(paging)的方式来
载入进程。所谓分页既是把实际的存储器分割为相同大小的段,例如每个
段1024 个字节,这样1024 个字节大小的段便称为一个页面(page)。
虚拟存储器由存储器管理机制及一个大容量的快速硬盘存储器支持。它的
实现基于局部性原理,当一个程序在运行之前,没有必要全部装入内存,
而是仅将那些当前要运行的那些部分页面或段装入内存运行(copy-onwrite),
其余暂时留在硬盘上程序运行时如果它所要访问的页(段)已存
在,则程序继续运行,如果发现不存在的页(段),操作系统将产生一个
页错误(page fault),这个错误导致操作系统把需要运行的部分加载到内
存中。必要时操作系统还可以把不需要的内存页(段)交换到磁盘上。利
用这样的方式管理存储器,便可把一个进程所需要用到的存储器以化整为
零的方式,视需求分批载入,而核心程序则凭借属于每个页面的页码来完
成寻址各个存储器区段的工作。
标准Linux 是针对有内存管理单元的处理器设计的。在这种处理器上,虚
拟地址被送到内存管理单元(MMU),把虚拟地址映射为物理地址。
通过赋予每个任务不同的虚拟——物理地址转换映射,支持不同任务之间
的保护。地址转换函数在每一个任务中定义,在一个任务中的虚拟地址空
间映射到物理内存的一个部分,而另一个任务的虚拟地址空间映射到物理
存储器中的另外区域。计算机的存储管理单元(MMU)一般有一组寄存
器来标识当前运行的进程的转换表。在当前进程将CPU 放弃给另一个进
程时(一次上下文切换),内核通过指向新进程地址转换表的指针加载这
华恒科技 HHCF5272-R1 技术手册 第 155 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
些寄存器。MMU 寄存器是有特权的,只能在内核态才能访问。这就保证
了一个进程只能访问自己用户空间内的地址,而不会访问和修改其它进程
的空间。当可执行文件被加载时,加载器根据缺省的ld 文件,把程序加载
到虚拟内存的一个空间,因为这个原因实际上很多程序的虚拟地址空间是
相同的,但是由于转换函数不同,所以实际所处的内存区域也不同。而对
于多进程管理当处理器进行进程切换并执行一个新任务时,一个重要部分
就是为新任务切换任务转换表。我们可以看到Linux 系统的内存管理至少
实现了以下功能:
运行比内存还要大的程序。理想情况下应该可以运行任意大小的程序
可以运行只加载了部分的程序,缩短了程序启动的时间
可以使多个程序同时驻留在内存中提高CPU 的利用率
可以运行重定位程序。即程序可以方于内存中的任何一处,而且可以在执
行过程中移动。
写机器无关的代码。程序不必事先约定机器的配置情况。
减轻程序员分配和管理内存资源的负担。
可以进行共享——例如,如果两个进程运行同一个程序,它们应该可以共
享程序代码的同一个副本。
提供内存保护,进程不能以非授权方式访问或修改页面,内核保护单个进
程的数据和代码以防止其它进程修改它们。否则,用户程序可能会偶
然(或恶意)的破坏内核或其它用户程序。
虚存系统并不是没有代价的。内存管理需要地址转换表和其他一些数据结
构,留给程序的内存减少了。地址转换增加了每一条指令的执行时间,而
对于有额外内存操作的指令会更严重。当进程访问不在内存的页面时,系
统发生失效。系统处理该失效,并将页面加载到内存中,这需要极耗时间
的磁盘I/O 操作。总之内存管理活动占用了相当一部分cpu 时间(在较忙
的系统中大约占10%)。
华恒科技 HHCF5272-R1 技术手册 第 156 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
uClinux 针对NOMMU 的特殊处理
对于uClinux 来说,其设计针对没有MMU 的处理器,即uClinux 不
能使用处理器的虚拟内存管理技术(应该说这种不带有MMU 的处理器在
嵌入式设备中相当普偏)。uClinux 仍然采用存储器的分页管理,系统在启
动时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于
没有MMU 管理,所以实际上uClinux 采用实存储器管理策略(real memeory
management)。这一点影响了系统工作的很多方面。
uClinux 系统对于内存的访问是直接的,(它对地址的访问不需要经过
MMU,而是直接送到地址线上输出),所有程序中访问的地址都是实际的
物理地址。操作系统对内存空间没有保护(这实际上是很多嵌入式系统的
特点),各个进程实际上共享一个运行空间(没有独立的地址转换表)。
一个进程在执行前,系统必须为进程分配足够的连续地址空间,然后全部
载入主存储器的连续空间中。与之相对应的是标准Linux 系统在分配内存
时没有必要保证实际物理存储空间是连续的,而只要保证虚存地址空间连
续就可以了。另外一个方面程序加载地址与预期(ld 文件中指出的)通常
都不相同,这样relocation 过程就是必须的。此外磁盘交换空间也是无法
使用的,系统执行时如果缺少内存将无法通过磁盘交换来得到改善。
uClinux 对内存的管理减少同时就给开发人员提出了更高的要求。如果从
易用性这一点来说,uClinux 的内存管理是一种倒退,退回了到了UNIX
早期或是Dos 系统时代。开发人员不得不参与系统的内存管理。从编译内
核开始,开发人员必须告诉系统这块开发板到底拥有多少的内存(假如你
欺骗了系统,那将在后面运行程序时受到惩罚),从而系统将在启动的初
始化阶段对内存进行分页,并且标记已使用的和未使用的内存。系统将在
运行应用时使用这些分页内存。
从内存的访问角度来看,开发人员的权利增大了(开发人员在编程时
可以访问任意的地址空间),但与此同时系统的安全性也大为下降。此外,
华恒科技 HHCF5272-R1 技术手册 第 157 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
系统对多进程的管理将有很大的变化,这一点将在uClinux 的多进程管理
中说明。
虽然uClinux 的内存管理与标准Linx 系统相比功能相差很多,但应该
说这是嵌入式设备的选择。在嵌入式设备中,由于成本等敏感因素的影响,
普偏的采用不带有MMU 的处理器,这决定了系统没有足够的硬件支持实
现虚拟存储管理技术。从嵌入式设备实现的功能来看,嵌入式设备通常在
某一特定的环境下运行,只要实现特定的功能,其功能相对简单,内存管
理的要求完全可以由开发人员考虑。
内存分布图:
下图为标准Linux 系统和uClinux 系统的进程内存布局图,在标准Linux
系统中(如左图),系统数据段,代码段,堆和栈在虚存层面是连续的。
堆向上增长,栈向下增长,在堆底和栈顶之间有256MB 的内存可供分配。
uClinux 采用了实内存模式,各个内存段在物理内存(没有虚存)层面都
是连续的,栈段在同数据段在一起,堆有系统内存管理,所有进程共享,
由于内存连续和保护的要求(详见正文),栈段,数据段,代码段都是在
程序加载是分配,栈段的大小固定(在生成应用时可以指定栈段大小),
开发人员在开发时不得不使用一些方法估计判断栈段的大小,使其即能满
足程序的需要,又不浪费内存。
华恒科技 HHCF5272-R1 技术手册 第 158 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
应用在华恒开发板上跑起来后,CPU 中的内存映象:
华恒科技 HHCF5272-R1 技术手册 第 159 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
uCLinux
堆(HEAP)
栈 (STACK)
应用静态数据段
(.data)
应用代码段
(.text)
加载基址00e8-0000
栈向上增长,却与应用
的数据段之间没有预留
空间,因此必须用户自
己估算充分,否则程序
运行起来,栈增长会冲
掉其数据段甚至代码段
3FFFFF
00ea-6000
这种内存空间布局还阻碍了动态连接库的运用,一个很简单的方面,
应用程序将不知道到哪儿去寻找已被加载的动态库的位置(使用虚拟内存
的方式可以利用虚拟内存的重映射表)。这个问题的一个解决办法事先给
华恒科技 HHCF5272-R1 技术手册 第 160 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
定动态库被加载物理内存的某个位置,并且确定要使用的内存空间,在系
统启动是首先加载动态库(加载到事先假定的位置)。另一个问题是这个
动态库必须是绝对可重入的,由于没有了内存保护的机制(通常由MMU
单元提供),所有动态库内的数据需要使用局部变量,以使得这些数据分
配于各个进程的栈段,如果考虑使用锁的机制实现这种共享访问可能更加
复杂。
标准Linux 系统的进程、线程
进程:进程是一个运行程序并为其提供执行环境的实体,它包括一个
地址空间和至少一个控制点,进程在这个地址空间上执行单一指令序列。
进程地址空间包括可以访问或引用的内存单元的集合,进程控制点通过一
个一般称为程序计数器(program counter,PC)的硬件寄存器控制和跟踪进
程指令序列。
fork:由于进程为执行程序的环境,因此在执行程序前必须先建立这个能
“跑”程序的环境。Linux 系统提供系统调用拷贝现行进程的内容,以产
生新的进程,调用fork 的进程称为父进程;而所产生的新进程则称为子进
程。子进程会承袭父进程的一切特性,但是它有自己的数据段,也就是说,
尽管子进程改变了所属的变量,却不会影响到父进程的变量值。
Linux 系统中亲子进程之间的关系可用下图表示:
华恒科技 HHCF5272-R1 技术手册 第 161 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
父进程
子进程
父进程控制块
数据段
堆栈和用户区
子进程控制块
数据块
堆栈和用户区
程序码
共享段
父进程和子进程共享一个程序段,但是各自拥有自己的堆栈、数据段、用
户空间以及进程控制块。换言之,两个进程执行的程序代码是一样的,但
是各有各的程序计数器与自己的私人数据。
当内核收到fork 请求时,它会先查核三件事:首先检查存储器是不是足够;
其次是进程表是否仍有空缺;最后则是看看用户是否建立了太多的子进
程。如果上述说三个条件满足,那么操作系统会给子进程一个进程识别码,
并且设定cpu 时间,接着设定与父进程共享的段,同时将父进程的inode
拷贝一份给子进程运用,最终子进程会返回数值0 以表示它是子进程,至
于父进程,它可能等待子进程的执行结束,或与子进程各做个的。
exec 系统调用:该系统调用提供一个进程去执行另一个进程的能力,exec
系统调用是采用覆盖旧有进程存储器内容的方式,所以原来程序的堆栈、
数据段与程序段都会被修改,只有用户区维持不变。
华恒科技 HHCF5272-R1 技术手册 第 162 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
vfork 系统调用:由于在使用fork 时,内核会将父进程拷贝一份给子进程,
但是这样的做法相当浪费时间,因为大多数的情形都是程序在调用fork 后
就立即调用exec,这样刚拷贝来的进程区域又立即被新的数据覆盖掉。因
此Linux 系统提供一个系统调用vfork,vfork 假定系统在调用完成vfork 后
会马上执行exec,因此vfork 不拷贝父进程的页面,只是初始化私有的数
据结构与准备足够的分页表。这样实际在vfork 调用完成后父子进程事实
上共享同一块存储器(在子进程调用exec 或是exit 之前),因此子进程可
以更改父进程的数据及堆栈信息,因此vfork 系统调用完成后,父进程进
入睡眠,直到子进程执行exec。当子进程执行exec 时,由于exec 要使用
被执行程序的数据,代码覆盖子进程的存储区域,这样将产生写保护错误
(do_wp_page)(这个时候子进程写的实际上是父进程的存储区域),
这个错误导致内核为子进程重新分配存储空间。当子进程正确开始执行
后,将唤醒父进程,使得父进程继续往后执行。
uClinux 的多进程处理
uClinux 没有mmu 管理存储器,在实现多个进程时(fork 调用生成子
进程)需要实现数据保护。
uClinux 的fork 和vfork:uClinux 的fork 等于vfork。实际上uClinux
的多进程管理通过vfork 来实现。这意味着uClinux 系统fork 调用完程后,
要么子进程代替父进程执行(此时父进程已经sleep)直到子进程调用exit
退出,要么调用exec 执行一个新的进程,这个时候将产生可执行文件的加
载,即使这个进程只是父进程的拷贝,这个过程也不能避免。当子进程执
行exit 或exec 后,子进程使用wakeup 把父进程唤醒,父进程继续往下执
行。
uClinux 的这种多进程实现机制同它的内存管理紧密相关。uClinux 针
对nommu 处理器开发,所以被迫使用一种flat 方式的内存管理模式,启动
华恒科技 HHCF5272-R1 技术手册 第 163 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
新的应用程序时系统必须为应用程序分配存储空间,并立即把应用程序加
载到内存。缺少了MMU 的内存重映射机制,uClinux 必须在可执行文件
加载阶段对可执行文件reloc 处理,使得程序执行时能够直接使用物理内
存。
Nommu 处理
器
应用程序必须
具有relocation
处理
必须使用
vfork 实现
多进程
工具及内核
这是一个Platform port 的过程。主要是针对自己设计的开发板,建
立开发环境,运行操作系统,移植应用函数库,设计某些特定设备的驱动
程序等等。
建立开发环境
如前文所述,uClinux 的开发环境全面的采用了GNU 开发套件的解决
方案。针对开发板实际上需要做的工作是在开发宿主机上建立交叉编译环
境。对GNU 一系列工具进行配置编译形成工具集如下:
genromfs m68k-elf-g++ m68k-elf-objdump
m68k-elf-addr2line m68k-elf-gasp m68k-elf-ranlib
华恒科技 HHCF5272-R1 技术手册 第 164 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
m68k-elf-ar m68k-elf-gcc m68k-elf-size
m68k-elf-as m68k-elf-gdb m68k-elf-strings
m68k-elf-cc1 m68k-elf-ld m68k-elf-strip
m68k-elf-cc1plus m68k-elf-nm elf2flt
m68k-elf-cpp m68k-elf-objcopy
内核和应用程序都是采用ELF 可执行文件格式,都使用m68k-elf-gcc
编译器。
进程切换优化
前文已经提及Linux 系统的进程,并且说明了系统生成进程的过程以
及复杂进程之间使用的copy-on-write 技术。这里需要更进一步提及Linux
系统的线程。
在一个应用程序中使用多个进程有一个明显的缺点。创建这些进程增
加了一些基本开销,因为fork 是一种很大的系统调用,因为每个进程都
有它自己的地址空间,它必须使用进程间通信的手段如消息传递或者共享
内存。要把这些进程分配到不同的机器或处理器上去运行,及在进程之间
传递消息,等待进程完成,收集结果等都需要额外的开销。由于这些原因,
线程机制出现了。这时允许一个应用含有多个线程,所有这些线程共享一
个运行空间,但是每个线程有各自的私有栈。当系统在管理这些多线程时
(不论是用户态的线程,还是内核支持的线程),线程之间的切换将要比
进程之间的切换减少很多的工作量,从而节约系统的开销。
所谓的多进程实际上共享一个运行空间,每一个进程拥有自己独立的
用户栈。这种情形非常类似多线程的工作方式。
但是在uClinux 处理多进程的时候仍然作了大量的工作,而这些工作
很多是那种真正支持多进程处理时所需要做的(这些工作包括切换内存转
华恒科技 HHCF5272-R1 技术手册 第 165 页 共163 页
--------------------------------------------------------------------------------------------
HHtech : An Embedded Linux Tech. Provider in Mainland China
换表等)。于是我们可以考虑优化uClinux 的多进程处理机制,把多个进
程切换的方法简化为多个线程的切换方法,使得其更加简洁高效。
附录G 参考资料
A) MCF5272 ColdFire ® Integrated Microprocessor User’s Manual,
http://www.motorola.com/coldfire
B) 《UNIX 环境高级编程》,W.Richard Stevens 著,机械工业出版社
C) 《LINUX 设备驱动程序》,ALESSANDRO RUBINI 著,LISOLEG 译,
中国电力出版社
D) 《嵌入式LINUX 设计与应用》(清华大学出版社2002 年出版)