第一、真正深刻地认识存储器
冯诺伊曼说过“程序等于算法加数据结构”,算法是什么?算法是通过存储在存储器中的程序代码实现的;数据结构又是什么?数据结构是存放在存储器中的各种类型的数据;程序本质上就是处理器通过执行存放在存储器中的程序代码对存放在存储器中的数据进行操作和变换的过程。在这个过程中除了处理器本身外,最核心的环节就是存储器。因为不管是程序的可执行代码还是数据都是存放在存储器中的。撇开代码、变量、数组、指针、结构、堆栈等等这些软件中的各个元素的表象,剩下的本质就是存储器!因此理解C语言的关键是真正理解存储器。每一个存储单元都有两个属性,一是存储器里面存放的内容;二是存储器的地址。这个内容可以是代码,也可以是数据,甚至是另一个存储单元的地址(这个时候往往我们称这个存储单元里存放的是一个指针)。对于C程序员而言需要时时刻刻的将存储器的这两个属性牢记于心。
第二、认识和理解嵌入式C编程环境
嵌入式软件开发的一个非常重要的特点就是所谓交叉编译,也就是开发工具运行的环境和被调试的程序不是运行在同一个硬件平台(处理器)上。一般而言编译器、汇编器、链接器等工具链软件以及调试工具都运行在通用的PC机平台上;调试工具通过一定的通信手段将链接器输出的可执行文件下载到嵌入式系统开发板(一般成为目标系统)的存储器中,并通过一定的机制控制和观测目标系统的寄存器、存储器等。这个开发过程往往需要使用多种不同的工具,这些对于初学者而言很容易造成困惑。只有真正理解开发过程中各个环节的作用,才能对嵌入式系统C编程有深入的认识。另一个问题是虽然C语言是一门高级语言,但是如果想真正用好C语言,程序员必须对编程过程中所使用的工具非常了解,清楚地知道每个工具的作用以及这些工具与硬件平台的相互关系。比如编译器如何处理全局变量和全局数组的,对于全局变量的处理与局部变量有什么不同?编译器是如何利用堆栈进行传递参数的?又比如C语言的编译器、链接器是如何处理一个项目中多个C文件之间的相互依赖关系的,链接器最终是如何生成可执行文件的?可执行文件的内存映象又是如何安排的?这些问题初看起来似乎与C编程本身没有什么关系,但是一个嵌入式软件的程序员应该对这些问题了如指掌,因为在嵌入式软件的开发过程中程序员要经常直接和底层的设备与工具打交道。
第三、认识和掌握C语言中的常见的陷阱
C语言不是一门面向初学者的编程语言,C语言发明者的初衷是希望设计一种面向编译器和操作系统设计的高级语言,因此C语言中充满了各种各样对于初学者而言的陷阱。这些陷阱一方面来自于C语法本身的灵活性;第二来自于C对存储器边界的不检查,因此非常容易在代码中造成存储器越界访问的问题。在C语言中,最容易出错的地方是与存储器相关的内存访问越界以及内存泄漏的问题,C语言的使用者必须非常小心地规避这些陷阱。
第四、掌握C语言程序设计过程中的调试方法
任何程序在编写的过程中都需要调试,尤其是对于比较复杂的系统而言更是如此。面对程序编写过程中出现的问题,比较现实的观点应该是如何在最短的时间内发现程序错误的根源,修改这个错误,并且吸取教训争取在以后的程序中不再犯同样的错误。在这个环节中最重要也是最需要技巧的工作就是找到问题的根源。事实上,程序的调试是有一定的方法和技巧的――虽然很少有相关的参考书介绍这方面的内容。
阅读(734) | 评论(0) | 转发(0) |