4
设备驱动程序
嵌入式系统通常有许多设备用于与用户交互,象触摸屏、小键盘、滚动轮、传感器、RS232接口、LCD等等。除了这些设备外,还有许多其它专用设备,包括闪存、USB、GSM等。内核通过所有这些设备各自的设备驱动程序来控制它们,包括GUI用户应用程序也通过访问这些驱动程序来访问设备。
开发者编写驱动程序是应该特别注意下面所提到的概念:编写访问硬件的内核代码是不要给用户强加任何策略。因为不同的用户有不同的需求,驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用。因此,当驱动程序只提供了访问硬件的功能而没有附加任何限制时,这个驱动程序就比较灵活。然而,有时候我们也需要在驱动程序中实现一些策略。例如,某个数字I/O驱动程序只提供了以字节为单位访问硬件的方法,这样就省去了编写额外代码以处理单个数据位的麻烦。
如果从另一个角度来看驱动程序,那么它可以被看作是应用和实际设备之间的一个软件层。这种定位使开发者可以选择如何展现设备特性:即使对于相同的设备,不同的驱动程序也可以提供不同的功能。实际的驱动程序设计应该在许多考虑因素之间取得平衡。例如,某个驱动程序可能同时被多个进程使用,我们就应该考虑如何处理并发的问题:可以在设备上实现独立于硬件功能的内存映射;也可以提供一个函数库,以帮助应用程序开发者在已有原语的基础上实现新的策略。总之,驱动程序的设计主要还是综合考虑下面三方面的因素:提供给用户尽量多的选项、编写驱动程序占用较少的时间以及尽量保持程序简单而不至于错误丛生。
本节着重讨论通常几乎在每个嵌入式环境中都会使用的一些重要设备的设备驱动程序。