通常所说的硬件抽象是位于操作系统内核与硬件电路之间的接口,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植,并简化应用程序的开发过程。举个简单的例子,假设我们希望控制节点上的LED亮起,对于顶层应用开发的程序员来说,可能只是简单的调用一个命令LightUp()(该命令是假设的),但是想要通过微控制器控制LED就需要了解微控制器的管脚特性,这对于不同的微控制器是不同的,同时还需要知道LED与微控制器的哪个管脚相连接等,才能通过编写指令完成LED的控制。具体的完成对LED控制的代码集一般称之为硬件抽象(驱动程序),这种抽象向上层应用提供一种屏蔽了内部操作细节的可操作指令(在不同的编程语言中有不同的名字,如命令、函数等),这种分层开发的方式使得程序员可以专注于本层功能的实现,减少开发工作量,同时在复杂的系统中也为系统安全性提供了一定的保障。
以上提到的硬件抽象可以封装底层的操作细节,并向上提供可供操作硬件的精简的指令,但是,对于应用开发者而言,依然有一个令人头疼的问题,那就是不同的硬件其抽象出的指令完全不同,编程时需要时常查阅帮助文档。面对这样的问题时,用户希望底层的抽象可以提供一种可读性、通用性非常强的操作指令,甚至是“一键式”的操作。但是,有编程经验的程序员可能都会意识到这会带来另一方面的问题,那就是效率的下降。正所谓鱼和熊掌不能兼得,高集成度的封装会使上层开发变得简单,但同时由于隐藏了过多的细节,使得本来可以很简单解决的问题,由于对底层操作性的降低,执行起来反而很复杂。另一方面,要对种类繁多的不同硬件提供高集成度的统一的硬件驱动,其工作量也是十分巨大的,这同样会延长开发的周期。
从以上的讨论我们可以看出,硬件抽象应该存在着这样一条线——线以下关注的是硬件操作细节,线以上关注的是应用开发,而这条线究竟应该画在哪里是一个需要认真考虑的问题。这条所谓的线就是本节要讲述的硬件抽象结构。
对于传感器网络的应用而言,硬件抽象结构还需要面对另一个问题,那就是性能和能耗的冲突。因此,如何隐藏硬件复杂的特性,增加代码的移植性,简化应用程序开发的同时在性能和能耗中找到平衡点是作为专为传感器网络设计的嵌入式操作系统TinyOS需要解决的问题。
事实上,之前我们提到的那条线在TinyOS 2.0中不是一条,而是3条。TinyOS 2.0使用了具有3层结构的硬件抽象架构。顶层抽象提供与平台无关的硬件接口,便于代码移植;中间抽象带有相对完善的与硬件相关的接口,有助于提高效率;而底层抽象则与硬件的寄存器和中断紧密相关。(www.xing528.com)
在图5-1所示的组件框架里,硬件抽象架构可以分为3个不同的组件层。每一层都清楚地定义了各自的功能范围,并依赖于其下层提供的接口。底层硬件的功能自下而上逐渐扩展为操作系统和应用程序之间具有平台无关性的接口。从底层硬件到顶层接口,组件的依赖性越来越弱,从而在设计和实现代码可重用的应用程序时,开发者拥有更多的自由。
图5-1 硬件抽象架构
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。