如題所說(shuō),UCOS中穿件任務(wù)時(shí)都會(huì)調(diào)用到一個(gè)函數(shù)OSTaskStkInit(),該函數(shù)位于os_cpu_c.c
該函數(shù)將任務(wù)創(chuàng)建時(shí) 開(kāi)辟的任務(wù)堆棧的棧頂指針傳遞進(jìn)來(lái),以后任務(wù)堆棧就會(huì)保存在這塊內(nèi)存對(duì)吧,
問(wèn)1,我想,說(shuō)的是任務(wù)切換時(shí) 都是使用一個(gè)“陷阱“或者軟件中斷觸發(fā)的,這樣CPU就會(huì)進(jìn)行一次入棧,保存當(dāng)前任務(wù)堆棧,然后將上次被中斷的任務(wù)堆棧拷貝到CPU寄存器,然后執(zhí)行上次被中斷的任務(wù),這個(gè)理解對(duì)嗎?
問(wèn)2,每次產(chǎn)生軟件中斷或者陷阱的時(shí)候,CPU執(zhí)行入棧操作,保存當(dāng)前寄存器的狀態(tài),它是如何將這些值保存到任務(wù)堆棧中的?當(dāng)cpu切換任務(wù)時(shí)是怎么將任務(wù)堆棧保存的寄存器值拷貝到cpu寄存器中的?總之,就是任務(wù)堆棧是怎么和CPU寄存器之間建立數(shù)據(jù)交互的,麻煩詳細(xì)一點(diǎn)。
問(wèn)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)
//以下內(nèi)容來(lái)源ucosII-F28335的OS_CPU_A.ASM
.asmfunc
_OS_CPU_SR_Save:
PUSH ST1 //什么意思?
DINT //關(guān)中斷?
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