C语言嵌入式系统编程修炼之道——背景篇
作者:
宋宝华 e-mail:
[email]21cnbao@21cn.com[/email]
不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发的一般选择。而与之相比,
C
语言——一种“高级的低级”语言,则成为嵌入式系统开发的最佳选择。笔者在嵌入式系统项目的开发过程中,一次又一次感受到
C
语言的精妙,沉醉于
C
语言给嵌入式开发带来的便利。本文的目的在于进行“
C
语言嵌入式系统开发的内功心法”秀,一共包括
25
招。
图
1
给出了本文的讨论所基于的硬件平台,实际上,这也是大多数嵌入式系统的硬件平台。它包括两部分:
(1)
以通用处理器为中心的协议处理模块,用于网络控制协议的处理;
(2)
以数字信号处理器(
DSP
)为中心的信号处理模块,用于调制、解调和数
/
模信号转换。
本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的
C
语言编程技巧。而
DSP
编程则重点关注具体的数字信号处理算法,主要涉及通信领域的知识,不是本文的讨论重点。
着眼于讨论普遍的嵌入式系统
C
编程技巧,系统的协议处理模块没有选择特别的
CPU
,而是选择了众所周知的
CPU
芯片——
80186
,每一位学习过《微机原理》的读者都应该对此芯片有一个基本的认识,且对其指令集比较熟悉。
80186
的字长是
16
位,可以寻址到的内存空间为
1MB
,只有实地址模式。
C
语言编译生成的指针为
32
位(双字),高
16
位为段地址,低
16
位为段内编译,一段最多
64KB
。


图1 系统硬件架构
协议处理模块中的
FLASH
和
RAM
几乎是每个嵌入式系统的必备设备,前者用于存储程序,后者则是程序运行时指令及数据的存放位置。系统所选择的
FLASH
和
RAM
的位宽都为
16
位,与
CPU
一致。
实时钟芯片可以为系统定时,给出当前的年、月、日及具体时间(小时、分、秒及毫秒),可以设定其经过一段时间即向
CPU
提出中断或设定报警时间到来时向
CPU
提出中断(类似闹钟功能)。
NVRAM
(非易失去性
RAM
)具有掉电不丢失数据的特性,可以用于保存系统的设置信息,譬如网络协议参数等。在系统掉电或重新启动后,仍然可以读取先前的设置信息。其位宽为
8
位,比
CPU
字长小。文章特意选择一个与
CPU
字长不一致的存储芯片,为后文中一节的讨论创造条件。
UART
则完成
CPU
并行数据传输与
RS-232
串行数据传输的转换,它可以在接收到
[1~MAX_BUFFER]
字节后向
CPU
提出中断,
MAX_BUFFER
为
UART
芯片存储接收到字节的最大缓冲区。
键盘控制器和显示控制器则完成系统人机界面的控制。
以上提供的是一个较完备的嵌入式系统硬件架构,实际的系统可能包含更少的外设。之所以选择一个完备的系统,是为了后文更全面的讨论嵌入式系统
C
语言编程技巧的方方面面,所有设备都会成为后文的分析目标。
嵌入式系统需要良好的软件开发环境的支持,由于嵌入式系统的目标机资源受限,不可能在其上建立庞大、复杂的开发环境,因而其开发环境和目标运行环境相互分离。因此,嵌入式应用软件的开发方式一般是,在宿主机
(Host)
上建立开发环境,进行应用程序编码和交叉编译,然后宿主机同目标机
(Target)
建立连接,将应用程序下载到目标机上进行交叉调试,经过调试和优化,最后将应用程序固化到目标机中实际运行。
CAD-UL
是适用于
x86
处理器的嵌入式应用软件开发环境,它运行在
Windows
操作系统之上,可生成
x86
处理器的目标代码并通过
PC
机的
COM
口(
RS-232
串口)
或以太网口下载到目标机上运行,如图
2
。其驻留于目标机
FLASH
存储器中的
monitor
程序可以监控宿主机
Windows
调试平台上的用户调试指令,获取
CPU
寄存器的值及目标机存储空间、
I/O
空间的内容。


图2 交叉开发环境
后续章节将从软件架构、内存操作、屏幕操作、键盘操作、性能优化等多方面阐述
C
语言嵌入式系统的编程技巧。软件架构是一个宏观概念,与具体硬件的联系不大;内存操作主要涉及系统中的
FLASH
、
RAM
和
NVRAM
芯片;屏幕操作则涉及显示控制器和实时钟;键盘操作主要涉及键盘控制器;性能优化则给出一些具体的减小程序时间、空间消耗的技巧。
本文即将讲述的
25
个主题可分为两类,一类是编程技巧,有很强的适用性;一类则介绍嵌入式系统编程的一般常识,具有一定的理论意义。
So, let’s go.
本文转自 21cnbao 51CTO博客,原文链接:http://blog.51cto.com/21cnbao/120802,如需转载请自行联系原作者