SWI是在单个的堆栈上运行。但也不允许被挂起,只能运行到结束。对于一些实时性要求不是很高的任务就可以放在软件中断中去执行。当HWI发布了swi_post()后,SWI会立刻准备好去运行。HWI中处理的事务是以微秒来计时的,SWI中处理的事务是以毫秒来计时的。
以下图为例,HWI用来采集外设的数据,当外设数据采集到第9次的时候,HWI将会发布一个SWI来执行,当SWI还没执行完,但又有外设数据到来时,HWI会抢断SWI去执行。 当SWI执行完毕,HWI还没被触发时,将会去执行最低优先级的空闲线程。
同样优先级的SWI将会根据FIFO机制来调度。
在下图所示的例子中,SWI将会被视为是优先级比ISR优先级更低的线程,但ISR在发布了一个SWI_B之后,立刻被SWI_b抢断,此时的ISR并没有执行完成,堆栈也不会得到保护,会发生很严重的后果。
为了解决上图所示的问题,我们将使用HWI线程,在执行HWI时,现在SWI给禁用,等到HWI执行完毕再重新使能SWI。
sysbios---软件中断
最新推荐文章于 2021-11-17 14:29:57 发布