我将任务库移植到 MSP430、并围绕如何执行任务切换的想法进行阐述。 任务在此上下文中是一个简化的线程。 通常、这些仅在中断上下文中发生:
1:中断发生
2.中断处理程序启动一个上下文切换(例如唤醒一个任务)、这会导致一个软件中断。
3.处理程序完成,并可能在其它任务到达之前唤醒它们。 最后、软件中断仍处于挂起状态、挂起的任务是激活的最高优先级任务。
处理程序 RETI。 现在、当中断被重新启用时、挂起的软件中断被立即进入。
5. SWI 处理程序加载挂起的上下文和 RETI。
这里的关键部分是、在发布 SWI 的中断上下文中、SWI 会使其处于待处理状态、而不会立即执行。 如果没有上下文切换、则不会在保存和加载状态方面产生额外的开销。 (在 ARM Cortex-M 上、这很重要、甚至有一个中断尾链优化。)
从一个非中断运行环境:
1.运行环境通过调整后的存储 PC 保存其状态(指向下面的步骤4)
2.它设置待处理的任务并发布 SWI
3. SWI 处理程序加载并通过 RETI 返回到另一个上下文
4.当此任务再次激活时,它将继续在此处执行
例如、使用 DMA 通道7、这是否可行、然后:
设置 DMA7CTL = DMAIFG | DMAIE 以发布挂起的软件中断(包括 DMAEN 在内的所有其他位都设置为零)。
在 DMA 中断处理程序中:
识别 DMAIV = 0x10表示 SWI 并执行上下文切换。
这是最简单的。 但文档不清楚设置 IFG 是否会实际发布中断...
或者是否有更简单的方法来实现相同的目标? 我缺少什么吗?