打印

事件驱动构架的改进--利用Cortex的PendSV来实现抢占式事件处理

[复制链接]
1400|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Simon21ic|  楼主 | 2015-10-28 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前发过一篇关于事件驱动构架的帖子,这个其实就是我们自己使用的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里的任务抢占的。

相关帖子

沙发
Simon21ic|  楼主 | 2015-10-29 20:12 | 只看该作者
yyy71cj 发表于 2015-10-29 19:55
这流程,看来得弄个流程图比较好懂些

懒得话流程图了,我之后就会安排人去测试这种方式
其实就是事件驱动构架中,实现2个事件队列,一个事件队列在main里处理,一个在PendSV中断里处理。
那么PendSV中断里处理的事件队列,相对main里的,就具备抢占能力了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

266

主题

2597

帖子

104

粉丝