必修:VSF的事件驱动

设计上,VSF的底层核心是一个参照UML设计的状态机构架。不过,我这里先不准备讲状态机,因为VSF里的状态机构架从来都没有被用到过,哪怕一次。实质上,VSF底层的核心是事件驱动。

事件驱动应该有不少人了解,说白了,就是由事件来驱动程序的运行。在VSF里,可以总结为:有事件处理,没事件休眠。系统的关键在于处理好3种实时性任务--硬实时、软实时、非实时。事件驱动系统也同样需要处理好这3种任务。下面就以VSF的抢占式构架来说明一下。

VSF系统的抢占式构架的流程图如下(支持硬实时、软实时和非实时):


必修:VSF的事件驱动_第1张图片
vsfpre.png

针对3种实时性任务:
main里的运行的是非实时队列。main函数里会初始化所有任务,然后进入while循环。while循环里,判断main队列中是否有事件等待,有的话就一一取出并分发给对应任务处理,没有的话就休眠。
PendSV里运行的是软实时队列(可以抢占main中的非实时队列),只是读出PendSV队列中的事件,并一一分发给对应任务处理。
然后就是系统各种中断,直接处理实时性代码,并且发送事件到对应的队列。根据应用需求,这里可以发给软实时队列(PendSV队列,发送事件后,还会自动使能PendSV),也可以发给非实时队列(main队列)。

所以,VSF中的任务优先级实质是事件队列的优先级,VSF中的抢占只是MCU本身中断的抢占。典型构架中使用了非实时队列(main队列)和软实时队列(PendSV队列),而实际应用中,还可以用其他一个或者多个中断实现出额外优先级的事件队列。

为了节省资源,VSF还可以被配置为协作式构架,流程图如下:


必修:VSF的事件驱动_第2张图片
vsfco.png

协作式构架中,没有非实时队列和软实时队列,中断产生的事件是直接调用任务的evt_handler(事件处理函数)处理了,并且所有中断不互相抢占。协作式构架是目前VSF最常用的构架,因为是资源占用最小的方式。

那么关于VSF中的任务的话,底层都只是一个evt_handler(事件处理函数),用于处理各个事件。当然,VSF的任务高层有更加简单的实现方式,这些以后会一一说明。

你可能感兴趣的:(必修:VSF的事件驱动)