嵌入式软件异步编程:单线程编程模型(前后台系统编程模型)

嵌入式软件按照其所使用的操作系统可以分为三类:Rich OS、RTOS、Bare-metal。应用最广泛的应该是Bare-metal了,Bare-metal即裸机,也就是不采用任何操作系统的嵌入式系统,其程序内仅有主循环和中断服务例程,通常也称作前后台系统。如果套用线程的概念,那么前后台系统可以认为是单线程的。在单线程模式下,无外乎轮询驱动、事件驱动以及轮询和事件组合的混合驱动这三种编程模型。这三种编程模型适合前后台系统,也适合有操作系统但希望将部分程序限制在单线程环境内的情况。

mingdu.zheng at gmail dot com
https://blog.csdn.net/zoomdy/article/details/79662512

1 轮询驱动

轮询是上层询问下层有没有完成操作,是上层调用下层(),最下层就是硬件了。轮询的优点是简单明了,缺点是需要多次检查下层状态,造成时钟和电量的浪费。

1.1 繁忙等待轮询

最基本的轮询驱动就是繁忙等待轮询,这种轮询发起操作请求,然后不断检查状态,直到操作完成。繁忙等待轮询是最简单最容易实现的编程模式。

1.2 休眠轮询

休眠轮询是对繁忙等待轮询的改进,在轮询期间做适当的休眠,使用休眠轮询可以保持程序简单性的同时降低功耗。

1.3 并发轮询

并发轮询可以对若干个外设(也可以是其他软件组件提供的功能)同时进行操作,比起前两种轮询方式显得略微复杂,但是提供了更好的并发性能,几个相对独立的任务可以在同一时间段内完成,并发操作可以降低功耗以及缩短处理时间。并发轮询通常需要状态机来保存当前的运行状态,确保下次来轮询时能够按照当前的状态做对应的检查。

1.4 休眠并发轮询

休眠并发轮询是对并发轮询的改进,在适当的时候进行休眠可以进一步降低功耗。

2 事件驱动

事件驱动是下层向上层汇报操作完成或发生错误,是下层回调上层()。事件驱动包含两步,第一步发起操作请求并注册回调函数;第二部分当操作完成后执行第一步注册的回调函数。相比轮询驱动,事件驱动是下层在完成操作后调用先前注册的回调函数,没有不断轮询的过程,这节约了时钟和电量。事件驱动是一种异步的编程模型,实现以及理解起来会略微难一些。

2.1 基于事件调度器的回调

引入事件调度器的情况下,回调函数可以通过事件调度器执行。中断(硬件产生的事件)发生后,中断服务例程将回调函数压入事件队列,事件调度器不断地从事件队列取得并执行回调函数。回调函数不仅可以通过中断服务例程压入事件队列,也可以由任何其它代码压入事件队列,通常是下层组件在完成操作后将上层组件注册的回调函数压入事件队列。

2.2 各管各的回调

在没有事件调度器的情况下,组件在操作完成后可以直接调用回调函数,而不再是将回调函数压入事件队列。lwIP就是只管自己的回调的。这样不用依赖于任何的事件调度器。

2.3 混合回调

系统中的部分组件通过事件调度器来调用回调函数,部分组件直接调用回调函数,这也是可行的。

3 轮询和事件混合驱动

很难找到纯粹的轮询驱动的软件,也很难找到纯粹的事件驱动的软件,多数是二者的组合体。轮询驱动和事件驱动有各自的优缺点,通常会组合起来使用以达到最好的效果。不同的组件可以使用不同的模型,同一组件的不同层次也可以采用不同的编程模型。例如lwIP,它最底层接收数据的那一层可以是轮询驱动的,数据包往上层传递的过程是事件驱动的。事件可以是硬件中断触发,也可以是轮询到某种条件后触发的。

来源:半斗米

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年2月20日
下一篇 2018年2月20日

相关推荐