stm32F103中任務切換定義
1 //任務切換宏,由匯編實現. 2 #define OS_TASK_SW() OSCtxSw()
os_cpu_a.asm中任務切換函數的定義
1 NVIC_INT_CTRL EQU 0xE000ED04 ; 中斷控制寄存器 2 NVIC_SYSPRI2 EQU 0xE000ED20 ; 系統優先級寄存器(2) 3 NVIC_PENDSV_PRI EQU 0xFFFF0000 ; PendSV中斷和系統節拍中斷 4 ; (都為最低,0xff). 5 NVIC_PENDSVSET EQU 0x10000000 ; 觸發軟件中斷的值.
1 ;/************************************************************************************** 2 ;* 函數名稱: OSCtxSw 3 ;* 4 ;* 功能描述: 任務級上下文切換 5 ;* 6 ;* 參 數: None 7 ;* 8 ;* 返 回 值: None 9 ;***************************************************************************************/ 10 11 OSCtxSw 12 PUSH {R4, R5} 13 LDR R4, =NVIC_INT_CTRL ;觸發PendSV異常 (causes context switch) 14 LDR R5, =NVIC_PENDSVSET 15 STR R5, [R4] 16 POP {R4, R5} 17 BX LR
1)任務切換很簡單, 由以下兩步完成, 將被掛起任務的微處理器寄存器推入堆棧, 然后將較高優先級的任務的寄存器值從棧中恢復到寄存器中。
在uC/OS-II中, 就緒任務的棧結構總是看起來跟剛剛發生過中斷一樣, 所有微處理器的寄存器都保存在棧中。 換句話說, uC/OS-II運行就緒態的任務所要做的一切, 只是恢復所有的CPU寄存器並運行中斷返回指令。
為了做任務切換, 運行OS_TASK_SW(),人為模仿了一次中斷。 多數微處理器有軟中斷指令或者陷阱指令TRAP來實現上述操作。 中斷服務子程序或陷阱處理(Trap hardler), 也稱作事故處理(exception handler), 必須提供中斷向量給匯編語言函數OSCtxSw()。 OSCtxSw()除了需要OS_TCBHighRdy指向即將被掛起的任務,還需要讓當前任務控制塊OSTCBCur指向即將被掛起的任務, 參見第8章, 移植uC/OS-II, 有關於OSCtxSw()的更詳盡的解釋。
人為模仿中斷分析http://www.cnblogs.com/WeyneChen/p/4891885.html
通過向中斷控制及狀態寄存器ICSR的第28位寫1來人為懸起中斷,若是當前沒有高優先級中斷產生,那么程序將會進入PendSV handler
1 ;/************************************************************************************** 2 ;* 函數名稱: OSPendSV 3 ;* 4 ;* 功能描述: OSPendSV is used to cause a context switch. 5 ;* 6 ;* 參 數: None 7 ;* 8 ;* 返 回 值: None 9 ;***************************************************************************************/ 10 11 PendSV_Handler 12 CPSID I ; Prevent interruption during context switch 13 MRS R0, PSP ; PSP is process stack pointer 如果在用PSP堆棧,則可以忽略保存寄存器,參考CM3權威中的雙堆棧-白菜注 14 CBZ R0, PendSV_Handler_Nosave ; Skip register save the first time 15 16 SUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stack 17 STM R0, {R4-R11} 18 19 LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP; 20 LDR R1, [R1] 21 STR R0, [R1] ; R0 is SP of process being switched out
下面是cortex-M3的通用寄存器,助於理解上面匯編指令。