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 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料