之前发过一篇关于事件驱动构架的帖子,这个其实就是我们自己使用的VSF构架的核心。
最近正好别人的建议,我准备优化一下这套系统设计,引入抢占式的调度方式。
当然,之前说过,VSF构架是协作式多任务,这里既是是抢占式,也是有一定限制的。
按照之前的帖子,VSF的事件驱动构架的main函数里,只是轮训vsfsm_poll去处理事件,如果没有事件则系统休眠。那这个轮训,如果放在PendSV中断里处理的话,那也是一样效果,main的while (1)里,就只需要休眠就行。记得之前在21ic看到过一个帖子,讲关于只是用中断的系统,其实就和这个有一些类似了。
实现起来也很简单,vsfsm构架中,支持多个事件队列,一个是在PendSV里处理,称为PendSV事件队列,一个是在main里处理,称为main事件队列。
系统按照实时性来说,具备这几种(以电机应用举例):
电机的电流采样中断里,判断电流是否过流,是的话,马上先关闭电机 ---- 硬实时
之后,发送事件到PendSV事件队列里去,然后中断退出,执行PendSV中断(如果之前没有在运行的话)
在PendSV中断里,会处理中断产生的事件 ---- 软实时
当然,这里PendSV中断还可能处理其他中断产生的事件,比如SDIO驱动的wifi模块的中断事件,SDIODMA完成事件,LCD接口的DMA完成事件等等。这些中断在处理完硬实时的代码后,都可以向PendSV任务队列里发送事件,然后在PendSV中断里处理。
在main事件队列里,一般只处理占用CPU事件较长的任务,比如AES、RSA、虚拟机任务等 ---- 非实时
main里的任务,是可以被PendSV里的任务抢占的。 |