我的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各寄存器中运行的