专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

OS001_基本构想与Cortex-M所提供的方便

作者:佚名   来源:互联网   点击数:  更新时间:2014年08月10日   【字体:

关于为何中断入栈时使用正在使用的指针,入栈后强制使用MSP:这是一个很方便的设计,由于TaskSwitch在中断中进行,中断时使用原指针入栈,即使用某个进程的堆栈,在TaskSwitch中,将会把堆栈指针换成另一个进程的堆栈,下一次切换回当前进程时,就似乎只是从前一次的ISR中返回一样,在进程眼中并没有什么区别。

  • 线程中应使用PSP:由于ISR中可能会有堆栈操作以保存R4--R11的值,如果进程与ISR使用同一个指针,那么意味着必须在进入ISR以后马上切换SP到应有的位置,而不是使用原来的进程SP,这样使得C语言写的终端服务可能出现问题。为了使得TaskSwitch与中断相对独立,即只要在中断中调用就行,与调用的位置以及在那个ISR调用中无关,那么就应该使用两个SP,这样使得ISR仍然可以使用C来写,只把TaskSwitch部分用汇编写,TaskSwitch部分负责修改PSP 的值,其实只有一句话需要使用汇编写,只需提供一个C的接口即可。
  • TaskSwitch在cortex中的实现:
    1. 其基本思想在于利用中断的自动入栈与出栈,由于出栈入栈时存入了PC,使得切换任务是可以简单的切换堆栈指针,使其自动出栈,回复PC的值,跳转到响应的task。
    2. 堆栈内容:{R0,R1,R2,R3,R12,LR,PC,PSR}
    3. 假设两个task: task1,task2,初始时:task1Stack:{0,0,0,0,0,0,task1,0},task1Stack:{0,0,0,0,0,0,task2,0}
    4. 系统初始化,模拟一次中断返回自动出栈,假设在task1上执行:task1Stack:{},task1Stack:{0,0,0,0,0,0,task2,0}
    5. 此后PSP为task1栈基址,使用PSP,直接修改PC到task1,此后开始运行task1
    6. 中断发生,自动入栈到task1堆栈中,此时为handler,修改psp到task2栈,中断返回,返回时自动出栈,将使用task2的栈,恢复了task2在前一次中断的状态,在task2看来并没有进入task1,而是简单的近中断,然后中断返回。此后循环上述过程。可用下图抽象。
  • 关闭窗口

    相关文章