UCOSII中任务堆栈如何具体的实现保存CPU寄存器的值?

UCOSII中任务堆栈如何具体的实现保存CPU寄存器的值?

此问题尚无答案
All Replies
  • 秀才240分

    小弟刚刚学习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回答。

    小弟对于上述问题非常的不解,希望得到各位大神的指点感激不尽。

  • 探花11005分

    关于汇编语句,请参看C2000汇编指令集。

    http://www.ti.com/lit/ug/spruhs1a/spruhs1a.pdf

    如果此回复解答了您的问题,请在“ 这问题是否已被解答?” 点击 ” 是 “,谢谢!