FreeRTOS 排程鎖,任務鎖和中斷鎖

2022-05-14 12:43:32 字數 3022 閱讀 1267

以下**自安富萊電子: 

排程鎖排程鎖就是 rtos 提供的排程器開關函式,如果某個任務呼叫了排程鎖開關函式,處於排程鎖開和調

度鎖關之間的**在執行期間是不會被高優先順序的任務搶占的,即任務排程被禁止。這一點要跟臨界段的

作用區分開,排程鎖只是禁止了任務排程,並沒有關閉任何中斷,中斷還是正常執行的。而臨界段進行了

開關中斷操作。

中斷鎖中斷鎖就是 rtos 提供的開關中斷函式,freertos 沒有專門的中斷鎖函式,使用 前一節裡面介

紹的中斷服務程式臨界段處理函式就可以實現同樣效果。

任務鎖簡單的說,為了防止當前任務的執行被其它高優先順序的任務打斷而提供的鎖機制就是任務鎖。

freertos 也沒有專門的任務鎖函式,但是使用 freertos 現有的功能有兩種實現方法:

 通過給排程器加鎖實現

利用 freertos 的排程鎖功能給排程器加鎖的話,將關閉任務切換功能,從而高優先順序任務也就無法

搶占低優先順序任務的執行,同時高優先順序任務也是無法向低優先順序任務切換的。 另外特別注意,排程

鎖只是禁止了排程器工作,並沒有關閉任何中斷。

 通過關閉任務切換中斷 pendsv 和系統時鐘節拍中斷 systick

利用 freertos 的任務**臨界段處理函式就可以關閉 pendsv 中斷和 systick 中斷。因為進入臨界

段前,操作暫存器 basepri 關閉了所有小於等於巨集定義

configlibrary_max_syscall_interrupt_priority 所定義的中斷優先順序(

實現任務切換功能

的 pendsv 中斷和滴答定時器中斷是最低優先順序中斷,所以也是被關閉的

),這樣低優先順序任務在執

行臨界段**期間是不會被高優先順序任務打斷的,從而就實現了任務鎖的效果。

freertos 排程鎖開啟

使用如下函式可以實現 freertos 的排程鎖開啟:

 vtasksuspendall()

函式原型:

void vtasksuspendall( void );

函式描述:

函式 vtasksuspendall 用於實現 freertos 排程鎖開啟。

使用這個函式要注意以下問題:

1. 排程鎖函式只是禁止了任務排程,並沒有關閉任何中斷。

2. 排程鎖開啟函式 vtasksuspendall 和排程鎖關閉函式 xtaskresumeall 一定要成對使用。

3. 切不可在排程鎖開啟函式 vtasksuspendall 和排程鎖關閉函式 xtaskresumeall 之間呼叫任何會引起任務切換的 api,比如 vtaskdelayuntil、 vtaskdelay、 xqueuesend 等。 

freertos 排程鎖關閉

使用如下函式可以實現 freertos 的排程鎖關閉:

 xtaskresumeall ()

函式原型:

basetype_t xtaskresumeall(void)

函式描述:

函式 xtaskresumeall 用於實現 freertos 排程鎖關閉

 排程鎖關閉後,如果需要任務切換,此函式返回 pdtrue,否則返回

pdfalse

。使用這個函式要注意以下問題:

1. 排程鎖函式只是禁止了任務排程,並沒有關閉任何中斷。

2. 排程鎖開啟函式 vtasksuspendall 和排程鎖關閉函式 xtaskresumeall 一定要成對使用。

3. 切不可在排程鎖開啟函式 vtasksuspendall 和排程鎖關閉函式 xtaskresumeall 之間呼叫任何會引起任務切換的 api,比如 vtaskdelayuntil、 vtaskdelay、 xqueuesend 等。

eg:

void vtaskled1(void *pvparameters)

led3_on;

/*阻塞延時,單位ms

*/vtaskdelay(

500);

led3_off;

vtaskdelay(

500);

}

}

這裡需要注意紅色部分,就是關閉排程鎖的時候,加上了乙個if判斷,這個判斷的目的是什麼呢?是不是多餘的呢?開啟和關閉排程鎖不是像下面這樣就可的嗎:

那為什麼官方的demo中有這樣乙個判斷?

先看關閉排程鎖返回值的解釋:

如果恢復排程造成了上下文切換,返回pdtrue,否則返回pdflase。這裡

要滿足if,證明沒有上下文切換,然後呼叫taskyield(),這個函式是強制上下文轉換:

這也就證明了,如果呼叫xtaskresumeall()沒有進行上下文切換,我們將強制進行上下文切換,如果進行了上下文切換,這個if判斷是多餘的。官方解釋:

另外需要注意,強制進行上下文切換,不代表本任務中xtaskresumeall()後面的語句就不執行了,這裡led燈的亮滅依舊會執行,(除非有高優先順序任務打斷此刻的任務了)只是排程器重新獲得了排程許可權,可以在多個任務間進行排程和切換。還有注意排程鎖,不能鎖中斷。

我之前還想,要是在乙個低優先順序的任務中執行一段不想被高優級打斷的程式時freertos怎麼做,現在知道了,

排程鎖和臨界段。

實驗效果:

FreeRTOS 任務排程 List 組織

嵌入式 freertos 前面了解了 freertos 的記憶體管理,接下來看看任務排程,這也是乙個作業系統中最重要的一部分,而其任務排程大量使用了鍊錶 list.c 實現 排程器使用鍊錶跟蹤不同狀態下的任務 就緒 掛起 延時的任務,都會被掛接到各自的鍊錶中 所以這裡用一定篇幅介紹下主要供排程使用的...

freertos作業系統 任務排程

一 任務建立 目的 應用程式中如何給各任務分配處理時間 任意時刻,os如何使任務投入執行 優先順序如何影響系統行為 任務狀態 如何實現任務 建立乙個或多個任務的例項 任務引數的使用 right 改變任務優先順序 刪除任務 週期性處理 空閒任務何時執行,可以用來幹什麼 解決 任務實現 任務函式 voi...

FreeRTOS簡單任務排程實現

ifndef rtos h define rtos h include freertos.h include task.h define pex rtos start rtos start void rtos start void void freertos task1 void pvparamet...