|
小弟剛剛學習UCOS-II,問題可能比較low,請各位大神不吝賜教,感激不盡。
如題所說,UCOS中穿件任務時都會調用到一個函數OSTaskStkInit(),該函數位于os_cpu_c.c
該函數將任務創建時 開辟的任務堆棧的棧頂指針傳遞進來,以后任務堆棧就會保存在這塊內存對吧,
問1,我想,說的是任務切換時 都是使用一個“陷阱“或者軟件中斷觸發的,這樣CPU就會進行一次入棧,保存當前任務堆棧,然后將上次被中斷的任務堆?截惖紺PU寄存器,然后執行上次被中斷的任務,這個理解對嗎?
問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回答。
小弟對于上述問題非常的不解,希望得到各位大神的指點感激不盡。
|
|