[应用相关] 用C语言写驱动程序

[复制链接]
5104|3
 楼主| 拿起书本 发表于 2013-9-3 17:11 | 显示全部楼层 |阅读模式
      发现身边好多朋友的一个误解:驱动程序通常都要用汇编语言编写,这也是让一般工程师对驱动智育开发怀有恐惧的原因之一。但实际状况是无论Windows,Linux或嵌入系统的驱动程序开发,几乎都以C语言为主,除非必要我们昼不会去写汇编程序,而且现在的C编译器通常都支持inline assembly的语法,所以原则上我们不会去写一个全部都是汇编语言的程序文件夹(.s或.asm),需要汇编语言的时候在.c文件中插入inline assembly即可。以下谈谈在C语言中可以使用以下的技巧来开发驱动程序。
   1:volatile变量:操作CPU内memory mapping register的方法就是C语言的指针,为避免相关程序被最佳化,必须将指针形态设为“volatile”。
   2:inline  assembly:在现代的嵌入式系统开发,为了可移植性,可维护性等原因,除了要操作CPU内部缓存器以及对某个模块做效能调整外,用汇编语言写程序的机会不多,通常我们也会用inline  assembly,免去汇编语言函数间互相调用时的麻烦。

   3:中断处理智育(ISR)的写法:虽说ISR其实就是一个C的函数,但ISR的起始和结尾与一般的函数还是有点不同的。简单地说,在ISR开始时要将所有缓存器都存储在stack memory中,结束前要恢复这些缓存器的值,而且一般函数是用"return"的指本这些细节都要写ISR的工程师自己写,有的编译器会提供额外的语法,例如在函数宣告时多加一个描述字符串,则编译器碰到这样的函数时,就会自动加上存储/回复缓存器的指令,并且用“interrupt return”来返回中断发生点。
   4:编译器定义的缓存器变量:有的编译器会提供非标准C语言的语法,让程序设计师可以操作CPU的内部缓存器,并不是所的C编译器都会提供这种额外的语法,而且我们也不知道使用这种语法时,C编译器到底会产生什么样的code,所以建议还是用inline assembly来操作CPU内部缓存器比较好。


  
   用C
outstanding 发表于 2013-9-3 17:14 | 显示全部楼层
  受教
 楼主| 拿起书本 发表于 2013-9-3 17:15 | 显示全部楼层
用C语言开发驱动程序除了程序好写易读,容易除错与维护之外,工程师不用每换一个CPU就要学习另一种汇编语言指令与语法,例如同样是对缓存器设值的语言指令,X86家族CPU汇编语言的写法就与大部分其他CPU的写法不同。此外驱动程序需要做很严谨的单元测试与压力测试,用C语言还是比汇编语言方便些。
zeluo 发表于 2013-9-3 19:43 | 显示全部楼层
C语言   是王道   我是这么理解的   这玩意   越往后   越简单   越好   哪有现在这么复杂的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4194

帖子

31

粉丝
快速回复 在线客服 返回列表 返回顶部