在執行中實現任務切換的函式有兩個:1、任務級任務切換 2、中斷級任務切換
任務級任務切換:
osctxsw
ldr r0,
=nvic_int_ctrl ;把 nvic_int_ctrl暫存器值載入到r0 ; trigger the pendsv exception (causes context switch
) ldr r1,
=nvic_pendsvset ;觸發pendsv訊號nvic_pendsvset載入到r1
str r1,
[r0]
;觸發pendsv中斷
bx lr
中斷級任務切換:
osintctxsw
ldr r0,
=nvic_int_ctrl ;把 nvic_int_ctrl暫存器值載入到r0 ; trigger the pendsv exception (causes context switch
) ldr r1,
=nvic_pendsvset ;觸發pendsv訊號nvic_pendsvset載入到r1
str r1,
[r0]
;觸發pendsv中斷
bx lr
osctxsw 和 osintctxsw 這兩個是用來做任務切換的,這兩個**是一樣的,它們都只是觸發乙個 pendsv 異常,然後在 pendsv異常服務函式裡面進行任務切換。
這兩個函式雖然看起來是一樣的,但是他們的意義是不同的,
比如,在ossched (void)函式裡面呼叫的是osctxsw 進行任務級的任務切換;
在osintexit (void)中斷退出函式呼叫的是osintctxsw 進行了中斷級任務切換。
在這裡先了解一下ucos處理中斷的兩種方式:
uc/os-iii 有兩種方法處理來自於中斷的事件,直接發布(或者稱為釋放)和延遲發布。
通過 os_cfg.h 中的os_cfg_isr_post_deferred_en來選擇。
當設定為 0 時,ucos 使用中斷直接發布;
當設定為 1 時,使用中斷延遲發布。
關於osctxsw的巨集定義:
#define os_task_sw() osctxsw()
在void ossched (void)函式裡面呼叫了os_task_sw()函式來觸發pendsv異常。
經常用於任務級任務切換的5個函式:
ostimedly()函式
ostimedlyhmsm()函式
osschedroundrobinyield()函式
該函式只用於在系統使用時間片輪轉排程的時候,當乙個任務想放棄本次時間片而把 cpu 的使用權讓給同優先順序下的另外乙個任務的任務切換。
os_intqtask()函式
os_intqtask()函式是ucos自己建立的,優先順序為0的中斷服務管理任務;該任務函式用於中斷延遲發布的方式,可以將中斷級發布轉換成任務級發布。如果要使用中斷延遲發布記得把 os_cfg_isr_post_deferred_en 定義為 1。
osstarthighrdy()函式
osstarthighrdy()函式(彙編函式,沒有呼叫osctxsw函式)觸發了pendsv異常(osstart函式呼叫),發生了任務切換。(osstart函式用於開啟ucos,在定義第乙個任務的結尾用到了)
void osintexit (void)函式裡面呼叫了osintctxsw()函式來觸發中斷級pendsv異常。
所以在我們所有的中斷服務函式的後面我們都會呼叫osintexit()函式來進行任務切換。
在ucos中斷服務函式的寫法:
//**********ucos中中斷服務函式的寫法**************//
void
***_handler
(void
)}
ucos裡的中斷服務函式只要在裸機程式的基礎上再在開頭和結尾加上這3條語句即可。
時間片輪轉排程通過呼叫 os_schedroundrobin()函式來完成,這個函式由ostimetick()或者 os_intqtask()呼叫。時間片輪轉排程的排程方式取決於ucos處理中斷的方式。
1、在使用中斷延時發布時,最終是在os_intqtask()中斷服務管理函式裡面發生任務級排程;
2、在使用中斷直接發布時,採用中斷級任務排程,在systick中斷服務函式裡面呼叫ostimetick函式(在ostimetick函式裡面呼叫 os_schedroundrobin函式裡面對引數timequantactr的修改)。
UCOSIII 3 任務的創刪掛解
1.1 任務的建立 ucosiii 中要想使用任務,第一件事就是建立乙個任務,建立任務使用函式 ostaskcreate void ostaskcreate os tcb p tcb,cpu char p name,os task ptr p task,void p arg,os prio prio...
用quartz實現任務的動態配置(一)
此文是研究生時做專案時搞的乙個小模組,隨便拿來練練手的。其實quartz的表示式是最強大的,沒必要搞什麼介面。當時咋實現的已經想不起來了,見諒。讓此文沉了吧。b 關鍵字定義 b 任務 需要由quartz的排程器自動排程執行的程式,實現job介面。b 框架 b struts spring hibern...
uC OS ii在M3中的任務切換與任務堆疊
1.1 m3入賬序列 1.2 加上手工入棧序列 systick為嵌入到核心中,優先順序比一般中斷優先順序高。若在一般中斷的isr執行過程中,發生了systick異常,則systick會搶占該isr。若此時systick做上下文切換,在m3中將觸發用法fault 在中斷活躍時嘗試切入執行緒模式 即使在...