嵌入式软件中延迟回调的设计和应用
引言
嵌入式系统通常由处理器外挂多种周边芯片构成,工程师需要花较多的时间来设计和调试这些外围芯片的驱动程序,驱动程序的性能将直接决定嵌入式系统能否稳定运行和达成设计目标。一般地,处理器厂家会将目标应用中用到的外设驱动打包成板级支持包BSP(board support package),该BSP提供标准的API给用户,开发人员只需按指定方式调用相应的函数获取服务,从而简化系统设计,而厂家在发布BSP包前会做一些测试来确保功能和性能。也有例外,工程师有时不得不定制或重新开发驱动程序,例如: 1)厂家提供的驱动程序是针对某一操作系统的,而用户的系统则是经过充分裁剪甚至无操作系统;2)用户程序框架很成熟,新的驱动程序需要修改以匹配该软件框架,并只使用现有的系统服务。
一个架构良好的嵌入式软件,能提供的系统服务将涵盖现时用到的全部功能,并支持有序扩充,为嵌入式系统设计系统服务最重要的是框架简洁高效。驱动程序则是构筑在系统服务之上,为应用程序提供简单易用的与外设通讯的接口,如图1所示。
![](../img/eep/emb/emb-36445mlakn1zgqju.jpg)
在事件驱动的应用中,需要用到的系统服务就包括回调函数(callback functions),它被广泛使用来简化驱动程序的设计。以UART驱动程序为例: 应用程序首先向系统申请DMA服务, 由DMA控制器从内存中将一个100字节的包顺序从UART控制器发出,发送过程可能会持续1000ms, 发送完成才可以执行后续相关任务。如果内核此时通过查询方式获取发送状态,无疑将大大地降低系统运行效率。更简便高效的方式是引入回调函数机制,在初始化时提供回调函数,请求的任务完成时该回调函数将被自动调用。
事件的处理过程一般和硬件中断关联在一起。高优先级的处理任务需要直接放在中断服务程序中执行,对于实时性要求很高的应用,中断服务程序中应尽可能短小。而大量的、长时间的处理则可以放入回调函数中,以较低优先级(通常是软件中断级)运行,并随时可以被高优先级的其它硬件中断抢占。这样的机制要求对所有的回调函数统一管理和分派,有些可能还要求能设置回调函数的优先级。此时,回调函数并不是在请求的事件发生时马上被执行,而是延迟至合理的被调度时刻运行。这称为延迟回调(DCB, deferred callback)。
以高性能Blackfin和SHARC处理器平台为例,ADI公司提供了完备的系统服务和驱动包(System Service & Device Driver),它能够独立运行,也可与操作系统协同工作,其中就包括高效率的延迟回调服务,用户编写驱动程序的工作被大大简化。不过,一些高实时系统比如电机驱动器无需操作系统,类似的框架在实际应用中仍显复杂。这里介绍的方法以最简洁的方式实现延迟回调服务,可单独封装成模块,应用于任何处理器。
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于Winodws CE的嵌入式网络监控系统的设计与实现(03-05)
- 嵌入式系统实时性的问题(06-21)
- 嵌入式实时系统中的优先级反转问题(06-10)
- 嵌入式Linux系统中MMC卡驱动管理技术研究(06-10)
- FPGA的DSP性能揭秘(06-16)