新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > μC/OS-II在ARM平臺上移植的深入探討

μC/OS-II在ARM平臺上移植的深入探討

作者: 時間:2010-07-26 來源:網(wǎng)絡 收藏

(1)數(shù)據(jù)類型定義:在調(diào)試時發(fā)現(xiàn),雖然定義8 bit或16 bit數(shù)據(jù)類型時,在編譯過程中不會報錯,但這些變量并不會按要求被正確初始化或賦值,運行過程常常出錯。所以,在改寫OS_CPU.H代碼時,將所有變量都定義成32 bit或64 bit;
(2)堆棧生長方向定義:的堆棧是從上往下生長的,OS_STK_GROWTH定義為1;
(3)開關中斷的宏定義:用開關中斷的匯編函數(shù)實現(xiàn),放在OS_CPU_A.ASM文件中。
(4)宏定義OS_TASK_SW():這個宏定義是在中斷處理之外時,μ從低優(yōu)先級切換到高優(yōu)先級任務時所調(diào)用的代碼,它總是在任務級代碼中被調(diào)用。在有些資料中[1],將OS_TASK_SW()和OSIntCtxSw()等同起來,這在內(nèi)核中是不行的,因為后者是ARM內(nèi)核在中斷模式下的任務切換函數(shù),而不同模式下處理器的寄存器組是不同的,所要保護的寄存器內(nèi)容也不相同,經(jīng)過調(diào)試,發(fā)現(xiàn)以下代碼可達到目的。
OS_TASK_SW
stmfd sp!, {lr} ; PC入棧,lr其實是任務的返回地址,
stmfd sp!, {r0-r12, lr}
mrs r4, cpsr
stmfd sp!, {r4} ;最后保存CPSR ldr r4, =OSTCBCur
ldr r5, [r4]
str sp, [r5] ;將SP保存在當前任務的控制塊中 ldr r5, =OSTCBHighRdy
ldr r5, [r5]
str r5, [r4] ;OSTCBCur = OSTCBHighRdy ldr r6, =OSPrioHighRdy
ldr r6, [r6]
ldr r4, =OSPrioCur
str r6, [r4] ;OSPrioCur = OSPrioHighRdy
ldr sp, [r5] ;得到新任務的堆棧指針
ldr r4, [sp], #4
msr cpsr_cxsf, r4 ;先恢復CPSR
ldmfd sp!, {r0-r12, lr, pc}
3.2 OS_CPU_C.C.H的
在OS_CPU_C.C中,最主要的函數(shù)是OSTaskStkInit(),它在任務建立時,用來初始化任務堆棧結(jié)構(gòu),其余鉤子函數(shù)可以不用動,這個函數(shù)的代碼比較簡單[2]。需要說明的是,由于本文所述系統(tǒng),用戶任務運行在SVC模式下,沒有保存SPSR寄存器。
3.3 OS_CPU_A.ASM的
OS_CPU_A.ASM文件的匯編程序是μ工程的重點和難點。它通常包括OSStartHighRdy()、OSIntCtxSw()、OSTickISR()和開關中斷代碼等。其中,OSStartHighRdy()的主要工作是將優(yōu)先級最高任務對應的所有寄存器按順序從任務堆棧中恢復出來,其代碼簡單[2]。對于開關中斷函數(shù),在調(diào)試時所用代碼如下:
EnterCritical
mrs r1, cpsr
str r1, [r0]
orr r1, r1, #NOINT
msr cpsr_cxsf, r1
mov pc, lr
ExitCritical
ldr r1, [r0]
msr cpsr_cxsf, r1
mov pc, lr
需要指出的是,在每次成對調(diào)用這兩個函數(shù)時,需要提前聲明變量r,代碼如下所示:
INT32U r;
EnterCritical(r);
ExitCritical(r);
需要慎重對待的是OSIntCtxSw()、OSTickISR()函數(shù)。在調(diào)試時發(fā)現(xiàn),用一般參考資料所介紹的代碼都無法實現(xiàn)多任務的正常運行,其主要原因是,對ARM9內(nèi)核而言,其每種特定的中斷返回,都有特定的返回指令,在中斷處理過程中,強制使用模式切換指令,使處理器的中斷處理機制發(fā)生混亂,程序無法正常執(zhí)行。例如在ISR模式中使用指令:
 MSR CPSR_c, #(NO_INT | SVC32_MODE)
其目的是返回ISR發(fā)生之前的模式,然后保存一些寄存器。但調(diào)試時發(fā)現(xiàn),在上述指令執(zhí)行之后,處理器重新響應ISR中斷,并沒有順序執(zhí)行,而是立即回到ISR模式下。
 還有,對于S3C2410的ARM920T內(nèi)核而言,其ISR模式的返回指令是:
ldmfd sp!, {r0-r12, lr}
  subs pc, lr, #04
其他任何形式的指令都無法使處理器正確返回。有些資料用下述指令:
Ldmfd sp!, {r0-r12, lr,pc}; 執(zhí)行之前堆棧中相應存儲單元的內(nèi)容為(lr-4)。
 看起來與前面的兩行代碼意義相同,但后面的代碼僅僅讓處理器實現(xiàn)PC指針的跳轉(zhuǎn),而無法實現(xiàn)處理器的模式轉(zhuǎn)換,即從ISR模式回到中斷發(fā)生之前的模式。
 但在中斷發(fā)生時,無法在中斷處理過程中保存所有的處理器寄存器。例如,在ISR模式下,無法保存SVC模式的LR寄存器等。為了解決這個問題,本文采取了如圖1所示的框圖結(jié)構(gòu)來編寫中斷處理代碼和OSIntCtxSw()函數(shù)。

本文引用地址:http://2s4d.com/article/151716.htm


 

tcp/ip相關文章:tcp/ip是什么




評論


相關推薦

技術專區(qū)

關閉