打印
[应用相关]

用C语言写驱动程序

[复制链接]
4670|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

主题

4195

帖子

31

粉丝