标题: UCOSII中任务堆栈如何具体的实现保存CPU寄存器的值? [打印本页]

作者: sayato    时间: 2017-1-11 21:32
标题: UCOSII中任务堆栈如何具体的实现保存CPU寄存器的值?
小弟刚刚学习UCOS-II,问题可能比较low,请各位大神不吝赐教,感激不尽。


如题所说,UCOS中穿件任务时都会调用到一个函数OSTaskStkInit(),该函数位于os_cpu_c.c
该函数将任务创建时 开辟的任务堆栈的栈顶指针传递进来,以后任务堆栈就会保存在这块内存对吧,
问1,我想,说的是任务切换时 都是使用一个“陷阱“或者软件中断触发的,这样CPU就会进行一次入栈,保存当前任务堆栈,然后将上次被中断的任务堆栈拷贝到CPU寄存器,然后执行上次被中断的任务,这个理解对吗?
问2,每次产生软件中断或者陷阱的时候,CPU执行入栈操作,保存当前寄存器的状态,它是如何将这些值保存到任务堆栈中的?当cpu切换任务时是怎么将任务堆栈保存的寄存器值拷贝到cpu寄存器中的?总之,就是任务堆栈是怎么和CPU寄存器之间建立数据交互的,麻烦详细一点。
问3,
#define  CPU_CRITICAL_ENTER()  do { CPU_INT_DIS(); } while (0)     
#define  CPU_CRITICAL_EXIT()   do { CPU_INT_EN();  } while (0)


#define  CPU_INT_DIS()         do { cpu_sr = CPU_SR_Save(); } while (0)
#define  CPU_INT_EN()          do { CPU_SR_Restore(cpu_sr); } while (0)
//以下内容来源ucosII-F28335的OS_CPU_A.ASM
    .asmfunc
_OS_CPU_SR_Save:
    PUSH    ST1 //什么意思?
    DINT           //关中断?
    POP    @AL//什么意思?
    AND     AL, #1//什么意思?
    LRETR            //什么意思?
    .endasmfunc


    .asmfunc
_OS_CPU_SR_Restore:
    PUSH    ST1     //什么意思?
    POP     AR0    //什么意思?
    AND     AR0, #0xFFFE  //什么意思?
    OR      AL, AR0   //什么意思?
    PUSH    AL   //什么意思?
    POP     ST1   //什么意思?
    LRETR      //什么意思?
    .endasmfunc
               
                能否帮忙纤细解释一下上述汇编语言,最好结合上面问题1,2回答。
               
                小弟对于上述问题非常的不解,希望得到各位大神的指点感激不尽。


作者: utzuzu    时间: 2017-2-15 17:17
思路是这样的: 每个任务都有各自独立的堆栈区,系统中断后,任务切换过程是这样,首先将当前cpu主要寄存器内容全部入栈(当前任务栈),然后将堆栈指针重新赋值,指向新的任务的堆栈区,再执行出栈操作。入栈和出栈操作一般cpu有现成的指令支持的,ucos2将这些封装成函数。每一个任务自己的堆栈指针存放在任务的控制块数据结构中(或理解为任务名片)。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1