UCOSIII(3) 實現任務切換的多種方式

2021-10-24 22:17:43 字數 2739 閱讀 8602

在執行中實現任務切換的函式有兩個: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 在中斷活躍時嘗試切入執行緒模式 即使在...