如何学好嵌入式系统中的C语言编程

第一、真正深刻地认识存储器

    冯诺伊曼说过 程序等于算法加数据结构 ,算法是什么?算法是通过存储在存储器中的程序代码实现的;数据结构又是什么?数据结构是存放在存储器中的各种类 型的数据;程序本质上就是处理器通过执行存放在存储器中的程序代码对存放在存储器中的数据进行操作和变换的过程。在这个过程中除了处理器本身外,最核心的 环节就是存储器。因为不管是程序的可执行代码还是数据都是存放在存储器中的。撇开代码、变量、数组、指针、结构、堆栈等等这些软件中的各个元素的表象,剩 下的本质就是存储器!因此理解 C 语言的关键是真正理解存储器。

    每一个存储单元都有两个属性,一是存储器里面存放的内容;二是存储器的地址。这个内容可以是代码,也可以是数据,甚至是另一个存储单元的地址(这个时候往往我们称这个存储单元里存放的是一个指针)。对于 C 程序员而言需要时时刻刻的将存储器的这两个属性牢记于心。


第二、认识和理解嵌入式 C 编程环境

    嵌入式软件开发的一个非常重要的特点就是所谓交叉编译,也就是开发工具运行的环境和被调试的程序不是运行在同一个硬件平台(处理器)上。一般而言编译器、 汇编器、链接器等工具链软件以及调试工具都运行在通用的 PC 机平台上;调试工具通过一定的通信手段将链接器输出的可执行文件下载到嵌入式系统开发板(一般 成为目标系统)的存储器中,并通过一定的机制控制和观测目标系统的寄存器、存储器等。这个开发过程往往需要使用多种不同的工具,这些对于初学者而言很容易 造成困惑。只有真正理解开发过程中各个环节的作用,才能对嵌入式系统 C 编程有深入的认识。

    另一个问题是虽然 C 语言是一门高级语言,但是如果想真正用好 C 语言,程序员必须对编程过程中所使用的工具非常了解,清楚地知道每个工具的作用以及这些工具 与硬件平台的相互关系。比如编译器如何处理全局变量和全局数组的,对于全局变量的处理与局部变量有什么不同?编译器是如何利用堆栈进行传递参数的?又比如 C 语言的编译器、链接器是如何处理一个项目中多个 C 文件之间的相互依赖关系的,链接器最终是如何生成可执行文件的?可执行文件的内存映象又是如何安排的? 这些问题初看起来似乎与 C 编程本身没有什么关系,但是一个嵌入式软件的程序员应该对这些问题了如指掌,因为在嵌入式软件的开发过程中程序员要经常直接和底 层的设备与工具打交道。


第三、认识和掌握 C 语言中的常见的陷阱

       C 语言不是一门面向初学者的编程语言, C 语言发明者的初衷是希望设计一种面向编译器和操作系统设计的高级语言,因此 C 语言中充满了各种各样对于初学者而言 的陷阱。这些陷阱一方面来自于 C 语法本身的灵活性;第二来自于 C 对存储器边界的不检查,因此非常容易在代码中造成存储器越界访问的问题。在 C 语言中,最容 易出错的地方是与存储器相关的内存访问越界以及内存泄漏的问题, C 语言的使用者必须非常小心地规避这些陷阱。

 

第四、掌握 C 语言程序设计过程中的调试方法

    任何程序在编写的过程中都需要调试,尤其是对于比较复杂的系统而言更是如此。面对程序编写过程中出现的问题,比较现实的观点应该是如何在最短的时间内发现 程序错误的根源,修改这个错误,并且吸取教训争取在以后的程序中不再犯同样的错误。在这个环节中最重要也是最需要技巧的工作就是找到问题的根源。事实上, 程序的调试是有一定的方法和技巧的 ―― 虽然很少有相关的参考书介绍这方面的内容。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值