sayato 2017-01-11 13:28 采纳率: 0%
浏览 1392

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回答。

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

1条回答

  • dabocaiqq 2017-01-14 14:47
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试