《C语言嵌入式系统编程修炼之道.doc》由会员分享,可在线阅读,更多相关《C语言嵌入式系统编程修炼之道.doc(4页珍藏版)》请在金锄头文库上搜索。
1、C语言嵌入式系统编程修炼之道本文由优秀小朋友贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 C 语言嵌入式系统编程修炼之道 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具 备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,由于汇编语言开发的复杂性, 它并不是嵌入式系统开发的一般选择。而与之相比,C 语言-一种高级的低级语言,则成为嵌入式 系统开发的最佳选择。 背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行, 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体
2、的 C 语言编程 技巧。 个主题可分为两类,一类是编程技巧,有很强的适用性; 技巧。本文讲述的 28 个主题可分为两类,一类是编程技巧,有很强的适用性;一类则介绍嵌入式系统编 程的一般常识,具有一定的理论意义。 程的一般常识,具有一定的理论意义。 So, lets go. C 语言嵌入式系统编程修炼之背景篇 2005-06-14 14:45 作者:宋宝华出处:天极网责任编辑:方舟 作者:宋宝华出处:天极网责任编辑: 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较 强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,归因于汇编语言开发过程的复杂性,
3、它 并不是嵌入式系统开发的一般选择。而与之相比,C 语言-一种高级的低级语言,则成为嵌入式系统开 发的最佳选择。笔者在嵌入式系统项目的开发过程中,一次又一次感受到 C 语言的精妙,沉醉于 C 语言 给嵌入式开发带来的便利。 图 1 给出了本文的讨论所基于的硬件平台,实际上,这也是大多数嵌入式系统的硬件平台。它包括两 部分: (1) 以通用处理器为中心的协议处理模块,用于网络控制协议的处理; (2) 以数字信号处理器(DSP)为中心的信号处理模块,用于调制、解调和数/模信号转换。 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的 C 语言 编程技巧。而 DSP 编
4、程则重点关注具体的数字信号处理算法,主要涉及通信领域的知识,不是本文的讨 论重点。 着眼于讨论普遍的嵌入式系统 C 编程技巧,系统的协议处理模块没有选择特别的 CPU,而是选择了 众所周知的 CPU 芯片-80186,每一位学习过微机原理的读者都应该对此芯片有一个基本的认识,且 对其指令集比较熟悉。80186 的字长是 16 位,可以寻址到的内存空间为 1MB,只有实地址模式。C 语言 编译生成的指针为 32 位(双字),高 16 位为段地址,低 16 位为段内编译,一段最多 64KB。 图 1 系统硬件架构 协议处理模块中的 FLASH 和 RAM 几乎是每个嵌入式系统的必备设备,前者用于存
5、储程序,后者则 是程序运行时指令及数据的存放位置。系统所选择的 FLASH 和 RAM 的位宽都为 16 位,与 CPU 一致。 实时钟芯片可以为系统定时,给出当前的年、月、日及具体时间(小时、分、秒及毫秒),可以设定 其经过一段时间即向 CPU 提出中断或设定报警时间到来时向 CPU 提出中断(类似闹钟功能)。 NVRAM(非易失去性 RAM)具有掉电不丢失数据的特性,可以用于保存系统的设置信息,譬如网络 协议参数等。在系统掉电或重新启动后,仍然可以读取先前的设置信息。其位宽为 8 位,比 CPU 字长小。 文章特意选择一个与 CPU 字长不一致的存储芯片,为后文中一节的讨论创造条件。 UA
6、RT 则完成 CPU 并行数据传输与 RS-232 串行数据传输的转换,它可以在接收到 1MAX_BUFFER字节后向 CPU 提出中断,MAX_BUFFER 为 UART 芯片存储接收到字节的最大缓冲 区。 键盘控制器和显示控制器则完成系统人机界面的控制。 以上提供的是一个较完备的嵌入式系统硬件架构,实际的系统可能包含更少的外设。之所以选择一个 完备的系统,是为了后文更全面的讨论嵌入式系统 C 语言编程技巧的方方面面,所有设备都会成为后文 的分析目标。 嵌入式系统需要良好的软件开发环境的支持,由于嵌入式系统的目标机资源受限,不可能在其上建立 庞大、复杂的开发环境,因而其开发环境和目标运行环境
7、相互分离。因此,嵌入式应用软件的开发方式一 般是,在宿主机(Host)上建立开发环境,进行应用程序编码和交叉编译,然后宿主机同目标机(Target)建 立连接,将应用程序下载到目标机上进行交叉调试,经过调试和优化,最后将应用程序固化到目标机中实 际运行。 CAD-UL 是适用于 x86 处理器的嵌入式应用软件开发环境,它运行在 Windows 操作系统之上,可生 成 x86 处理器的目标代码并通过 PC 机的 COM 口(RS-232 串口)或以太网口下载到目标机上运行,如 图 2。 其驻留于目标机 FLASH 存储器中的 monitor 程序可以监控宿主机 Windows 调试平台上的用户调
8、试 指令,获取 CPU 寄存器的值及目标机存储空间、I/O 空间的内容。 图 2 交叉开发环境 后续章节将从软件架构、内存操作、屏幕操作、键盘操作、性能优化等多方面阐述 C 语言嵌入式系 统的编程技巧。软件架构是一个宏观概念,与具体硬件的联系不大;内存操作主要涉及系统中的 FLASH、 RAM 和 NVRAM 芯片;屏幕操作则涉及显示控制器和实时钟;键盘操作主要涉及键盘控制器;性能优化 则给出一些具体的减小程序时间、空间消耗的技巧。 在我们的修炼旅途中将经过 25 个关口,这些关口主分为两类,一类是技巧型,有很强的适用性;一 类则是常识型,在理论上有些意义。 软件架构篇 软件结构是软件的灵魂!
9、 结构混乱的程序面目可憎, 调试、测试、维护、升级都极度困难。 内容要点: 内容要点 模块划分 一个高尚的程序员应该是写出如艺术作品般程序的 程序员。 多任务还是单任务 单任务程序典型架构 中断服务程序 硬件驱动模块 C 的面向对象化 内存操作篇 C 语言最精华的内涵皆在内存操作中体现。我们之 所以在嵌入式系统中使用 C 语言进行程序设计,99%是 因为其强大的内存操作能力! 如果你爱编程,请你爱 C 语言; 如果你爱 C 语言,请你爱指针; 如果你爱指针,请你爱指针的指针! 内容要点: 内容要点 数据指针 函数指针 数组 vs.动态申请 关键字 const 关键字 volatile CPU
10、字长与存储器位宽不一致处理 屏幕操作篇 内容要点: 内容要点 屏幕乃嵌入式系统生存之重要辅助, 面目可憎之显示 将另用户逃之夭夭。 屏幕编程若处理不好, 将是软件中最 不系统、最混乱的部分,笔者曾深受其害。 汉字处理 系统时间显示 动画显示 菜单操作 模拟 MessageBox 函数 键盘操作篇 计算机学的许多知识都具有相通性, 因而, 不断追赶 时髦技术而忽略基本功的做法是徒劳无意的。 我们最多需 要精通三种语言, 最佳拍档是汇编、 C+ C、 (或 JAVA) , 很显然,如果你精通了这三种语言,其它语言你应该是 可以很快熟悉的,否则你就没有精通它们。 内容要点: 内容要点 处理功能键 处理数字键 整理用户输入 性能优化篇 在性能优化方面永远注意 80-20 准备,不要优化程 序中开销不大的那 80%,这是劳而无功的。除了编程上 的技巧外, 为提高系统的运行效率, 我们通常也需要最大 可能地利用各种硬件设备自身的特点来减小其运转开销。 内容要点: 内容要点 使用宏定义 使用寄存器变量 内嵌汇编 利用硬件特性1