2 sayato sayato 于 2017.01.16 22:35 提问

ucos系统堆栈与任务堆栈是怎么建立联系的

我的Q405234961
关于UCOS中cpu当前运行的各寄存器R0....的值,在切换任务或者中断的时候,是如何被保存到对应的任务堆栈中的,又是如何将 即将运行的任务堆栈的内容拷贝到CPU运行的寄存器中?
我看了ucos上相关的两段汇编,完全看不懂,不知道前辈能否指教一下,不胜感激。
; OS_CTX_SAVE
;
; Description : This MACRO saves the CPU registers (i.e. CPU context) onto the current task's stack using
; the same order as they were saved in OSTaskStkInit().
;********************************************************************************************************

OS_CTX_SAVE .macro
; Save remaining registers.
PUSH AR1H:AR0H ; AR1H:AR0H
PUSH XAR2 ; XAR2
PUSH XAR3 ; XAR3
PUSH XAR4 ; XAR4
PUSH XAR5 ; XAR5
PUSH XAR6 ; XAR6
PUSH XAR7 ; XAR7
PUSH XT ; XT
PUSH RPC ; RPC

.endm

OS_STK *OSTaskStkInit (void (*task)(void *p_arg),
void *p_arg,
OS_STK *ptos,
INT16U opt)

假设:有任务A,B,对应的任务堆栈是A_Stack[512],B_Stack[512],
当前运行任务A,如果此时发生任务切换(切换到B),cpu是如何保存当前各寄存器的值到A的任务堆栈中的,
当保存好A的任务堆栈后,又是如何将B的任务堆栈推向CPU各寄存器中运行的

1个回答

caozhy
caozhy   Ds   Rxr 2017.01.16 23:37
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!