发现身边好多朋友的一个误解:驱动程序通常都要用汇编语言编写,这也是让一般工程师对驱动智育开发怀有恐惧的原因之一。但实际状况是无论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 |