事件驱动编程与UML状态机技术解析
1. 不同内核的任务级响应与特性
在事件驱动编程中,不同的内核有着不同的任务级响应特性。中断服务程序(ISRs)可以在任何时候抢占活动对象的执行,但对于“普通”内核而言,每个ISR都会返回到精确的抢占点。如果ISR向任何活动对象发布事件,该事件的处理要等到当前实时循环控制(RTC)步骤完成后才会开始。对于最高优先级活动对象的事件,这种方式导致的最大延迟时间被称为任务级响应。在非抢占式的“普通”内核中,任务级响应等于系统中所有活动对象最长的RTC步骤。不过,“普通”内核的任务级响应仍比传统的“超级循环”(即main + ISRs)架构要好很多。
很多应用中,简单的“普通”内核的任务级响应是足够的。因为状态机本质上能快速处理事件,无需忙等待事件。状态机执行到完成后会进入休眠状态,直到下一个事件到来。而且,通常可以通过将较长的RTC步骤拆分为较短的步骤来加快任务级响应,例如使用“提醒器”状态模式。
然而,在某些情况下,将长的RTC步骤拆分成足够短的片段可能非常困难,导致非抢占式“普通”内核的任务级响应过长。比如GPS接收器,它需要在定点CPU上进行大量浮点运算来计算GPS位置,同时还要以亚毫秒级的间隔跟踪GPS卫星信号,很难将位置计算拆分成足够短的RTC步骤以实现可靠的信号跟踪。
这时,抢占式内核就发挥作用了。它可以在长RTC步骤中间进行上下文切换,让更高优先级的活动对象运行。只要活动对象不共享资源,它们就可以并发运行并独立完成RTC步骤。QP事件驱动平台包含一个名为QK的微小、全抢占式、基于优先级的实时内核组件,专门用于以RTC方式处理事件。配置QP使用QK抢占式内核很容易,但要注意活动对象间共享资源的问题。“Fly ‘n’ S