嵌入式系统驱动程序的开发有别于WIndows或Linux。后者除了必须了解新设备的硬件特性,把控制硬件的程序尽快完成之外,还需要设法让驱动程序符合Windows或Linux的规定(大且复杂的架构)。但在嵌入式系统中,往往是先设计驱动程序再有系统,所以只需要致力于驱动各个外围设备,而且嵌入式产品一般没有后期新增硬件的需求,所以不要求驱动程序编写的有扩展性,只需要逻辑清晰,简单明了就可以。往往驱动程序分为两层:Driver层和API层。前者是真正驱动硬件设备的程序,后者是负责与系统或应用程序交互的接口,对外隐藏硬件的特性和细节。以后若要更换硬件,只需要修改驱动程序的Driver层,API层不用动,进而整个应用程序和系统程序也不必修改。
以下是一个简单的驱动程序示例,用于为上层应用提供关中断的功能。
// 驱动程序内部函数(Driver层) voidhw_clear_interrupt_flag(void){//设定CPU状态寄存器内的某位 // asm("pushn %r0");asm("ld.w %r0, %psr");asm("xand %r0, 0xffffffef");asm("ld.w %psr, %r0");asm("popn %r0");}// 驱动程序对外接口(API层) voiddrv_clear_interrupt_flag(void){hw_clear_interrupt_flag();}
驱动程序的API是由固件组根据硬件特性与最终产品的需求,先行定义驱动程序的API的初稿,然后交由系统组参考,再根据系统组的反馈修改增删API。
一、开发驱动程序前的准备工作
驱动程序再整个系统开发中是属于没机会发挥个人创意的工作,必须按照CPU或外围IC的规定步骤进行开发编写。
(1)收集可有资源
以下是嵌入式驱动开发应该设法取得的资源:
IC厂商的技术支持人员(FAE);IC评估版;范例程序(Sample Code);产品规格书(Data Sheet);产品的硬件板子设计规格书;原理图与Layout
(2)用C语言写驱动程序
驱动程序的开发一般会采用C语言书写,在需要的地方内联汇编即可:
volatile 变量:使用C语言的指针,并设定为volatile类型。
内联汇编:对CPU内部寄存器