资讯详情

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

关于为何中断入栈时使用正在使用的指针,入栈后强制使用M:这是一个很方便的设计,由于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,而是简单的近中断,然后中断返回。此后循环上述过程。可用下图抽象。
  • -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
    锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

    锐单商城 - 一站式电子元器件采购平台