Cortex-M3PendSV 中断系统调用说明( 二 )


2. OS 接收到请求,做好上下文切换的准备,并且pend 一个 异常 。
3. 当 CPU 退出SVC 后,它立即进入,从而执行上下文切换 。

Cortex-M3PendSV 中断系统调用说明

文章插图
4. 当执行完毕后,将返回到任务B,同时进入线程模式 。
5. 发生了一个中断,并且中断服务程序开始执行
6. 在 ISR 执行过程中,发生 异常,并且抢占了该ISR 。
7. OS 执行必要的操作,然后pend 起 异常以作好上下文切换的准备 。
8. 当退出后,回到先前被抢占的ISR 中,ISR 继续执行
9. ISR 执行完毕并退出后,服务例程开始执行,并且在里面执行上下文切换
10. 当执行完毕后,回到任务A,同时系统再次进入线程模式 。
详见-M3权威指南124页 。
注,这里我想说明的是根据图7.16我的个人推论,可能是错误的,在linux中 每一个用户空间的进程都有自己的用户栈,和核心栈,如果-m3结合rt-也是用这个模式,可以印证图7.16,当IRQ执行的过程中,异常发生,IRQ的执行上下文现场被保存在任务A的核心栈中,然后执行上下文切换,上下文切换完成后,寄存器MSP和PSP分别指向了任务B的核心栈指针和用户栈指针,然后IRQ随着任务A被封存而封存,任务B压根不知道任务A的 栈中还封存着一个IRQ,因为任务B及时有权限不应该去破话另一个任务的栈空间 。直到任务A重新得到CPU,IRQ接着在任务A的栈空间继续执行,可惜从中断产生到中断服务程序结束,已经隔了十万八千年 。
【Cortex-M3PendSV 中断系统调用说明】经过实际验证,m3结合rt- 应该没有使用和linux一样的模型,而是所有的线程共享内核栈,即MSP 执行的栈空间所有线程共享,这里和linux-arm有个小区别,linux-arm 中断来临的时候,保存现场都是保存在内核栈中,这个内核栈是每一个内核线程独有的,而 -m3-- 是中断来临之前使用用户栈(PSP寄存器所指的栈空间),保护现场就在用户栈,中断来临之前使用核心栈(MSP寄存器所指),保护现场就用核心栈,但由于悬起中断的引入,所以线程切换的都借助来完成,这就保证线程切换的来临之前保护现场,一定在用户栈,用户栈是每个线程所独有的,所以,综上所述,针对线程切换所对应的中断,linux-arm保存现场都是在核心栈,而-都是在用户栈,但是他们都能保证,保存现场所用 的空间是每一个内核线程独有的 。