ucosii任務切換OS_TASK_SW()


  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的通用寄存器,助於理解上面匯編指令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM