|
關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過精彩內(nèi)容
fnkx1cehb0v64013295601.jpg (92.58 KB, 下載次數(shù): 6)
下載附件
保存到相冊(cè)
fnkx1cehb0v64013295601.jpg
2024-9-17 19:21 上傳
作者 | strongerHuang
微信公眾號(hào) | 嵌入式專欄
FreeRTOS 因?yàn)樵缙诘拈_源免費(fèi)商用(遵循MIT開源許可協(xié)議),占據(jù)了 RTOS 絕大部分市場(chǎng)。
隨著多核MCU的普及,F(xiàn)reeRTOS也緊跟潮流,支持多核調(diào)度。今天就來分享一下 FreeRTOS 單核、多核的調(diào)度策略。
單核調(diào)度策略
單核調(diào)度是所有RTOS都具有的功能,也是必備的最基礎(chǔ)的功能。
FreeRTOS的單核調(diào)度策略和市面上很多RTOS相同或類似,也就是:默認(rèn)使用固定優(yōu)先級(jí)的搶占式調(diào)度策略,對(duì)同等優(yōu)先級(jí)的任務(wù)執(zhí)行時(shí)間切片輪詢調(diào)度。
固定優(yōu)先級(jí):指調(diào)度器不會(huì)永久更改任務(wù)的優(yōu)先級(jí), 但可能會(huì)因優(yōu)先級(jí)繼承而暫時(shí)提高任務(wù)的優(yōu)先級(jí)。
搶占式:指調(diào)度器始終運(yùn)行優(yōu)先級(jí)最高且可運(yùn)行的 RTOS 任務(wù), 無論任務(wù)何時(shí)能夠運(yùn)行。例如, 如果中斷服務(wù)程序 (ISR) 更改了優(yōu)先級(jí)最高且可運(yùn)行的任務(wù), 調(diào)度器會(huì)停止當(dāng)前正在運(yùn)行的低優(yōu)先級(jí)任務(wù) 并啟動(dòng)高優(yōu)先級(jí)任務(wù)——即使這發(fā)生在同一個(gè)時(shí)間片內(nèi) 。這種情況下可以說高優(yōu)先級(jí)任務(wù) “搶占”了低優(yōu)先級(jí)任務(wù)。
輪詢調(diào)度:指具有相同優(yōu)先級(jí)的任務(wù)輪流進(jìn)入運(yùn)行狀態(tài)。
時(shí)間切片:指調(diào)度器會(huì)在每個(gè) tick 中斷上在同等優(yōu)先級(jí)任務(wù)之間進(jìn)行切換, tick 中斷之間的時(shí)間構(gòu)成一個(gè)時(shí)間切片。(tick 中斷是 RTOS 用來衡量時(shí)間的周期性中斷。)
這里可以參看我前面分享的文章:關(guān)于RTOS設(shè)置滴答Tick設(shè)置的問題
配置調(diào)度策略FreeRTOSConfig.h是整個(gè)系統(tǒng)的配置文件,這里有兩個(gè)調(diào)度相關(guān)的配置。
1、configUSE_PREEMPTION默認(rèn)配置為 1#define configUSE_PREEMPTION 1如果 configUSE_PREEMPTION 為 0,則表示搶占已關(guān)閉, 而且只有當(dāng)運(yùn)行狀態(tài)的任務(wù)進(jìn)入“阻塞”或“掛起”狀態(tài), 或運(yùn)行狀態(tài)任務(wù)調(diào)用 taskYIELD(), 或中斷服務(wù)程序 (ISR) 手動(dòng)請(qǐng)求上下文切換時(shí),才會(huì)發(fā)生上下文切換。
2、configUSE_TIME_SLICING這個(gè)配置在早期版本是沒有的,后面新增的功能。同樣,默認(rèn)配置 1#define configUSE_TIME_SLICING 1如果 configUSE_TIME_SLICING 為 0,則表示時(shí)間切片已關(guān)閉, 因此調(diào)度器不會(huì)在每個(gè) tick 中斷上在同等優(yōu)先級(jí)的任務(wù)之間切換。
多核調(diào)度策略
MCU多核調(diào)度分為:對(duì)稱多處理 (SMP) 和 非對(duì)稱多處理 (AMP)。
1、對(duì)稱多處理 (SMP)
使用 FreeRTOS 的對(duì)稱多處理 (SMP) 指的是一個(gè) FreeRTOS 實(shí)例可以跨多個(gè)處理器核心調(diào)度 RTOS 任務(wù)。
由于只有一個(gè) FreeRTOS 實(shí)例在運(yùn)行,一次只能使用 FreeRTOS 的一個(gè)“移植”, 因此每個(gè)核心必須具有相同的處理器架構(gòu)并共用相同的內(nèi)存空間。
針對(duì)(SMP)對(duì)稱多處理,同樣在FreeRTOSConfig.h配置文件中有相關(guān)的配置。
a、configRUN_MULTIPLE_PRIORITIES如果 configRUN_MULTIPLE_PRIORITIES 設(shè)置為 0,則只有在多個(gè)任務(wù)具有相同優(yōu)先級(jí)的情況下, 調(diào)度器才會(huì)同時(shí)運(yùn)行多個(gè)任務(wù)。這可以修復(fù)基于下列假設(shè)編寫的代碼:一次將只運(yùn)行一個(gè)任務(wù),但同時(shí)必須犧牲 SMP 配置帶來的一些好處。
b、configUSE_CORE_AFFINITY如果 configUSE_CORE_AFFINITY 設(shè)置為 1, 則 vTaskCoreAffinitySet() API 函數(shù)可用于定義某個(gè)任務(wù)可以在哪些核心上運(yùn)行以及不可以在哪些核心上運(yùn)行。使用該方法,應(yīng)用程序編寫者可以防止同時(shí)執(zhí)行假設(shè)了自身執(zhí)行順序的兩個(gè)任務(wù) 。
2、非對(duì)稱多處理 (AMP)
使用 FreeRTOS 的非對(duì)稱多處理 (AMP) 是指多核設(shè)備的每個(gè)核心都單獨(dú)運(yùn)行自己的 FreeRTOS 實(shí)例。這些核心并不都需要具有相同架構(gòu), 但如果 FreeRTOS 實(shí)例之間需要進(jìn)行通信,則需要共享一些內(nèi)存。
每個(gè)核心都會(huì)運(yùn)行自己的 FreeRTOS 實(shí)例, 因此任何給定核心上的調(diào)度算法與上文的單核系統(tǒng)調(diào)度算法完全相同。你可以使用流緩沖區(qū)或消息緩沖區(qū)作為核間通信原語, 這樣一來,一個(gè)核心上的任務(wù)可以進(jìn)入“阻塞”狀態(tài), 以等待另一個(gè)核心發(fā)來的數(shù)據(jù)或事件。
之前分享的文章《雙核單片機(jī)M4和M7之間通信的原理》其中就講述了非對(duì)稱多處理 (AMP)具體實(shí)現(xiàn)的一些原理。
實(shí)現(xiàn)雙核之間通信基本原理:發(fā)送和接收任務(wù)位于非對(duì)稱多處理器(AMP)配置中的多核微控制器(MCU)的不同內(nèi)核上,這意味著每個(gè)內(nèi)核都運(yùn)行自己的FreeRTOS程序。
同時(shí),一個(gè)內(nèi)核在另一個(gè)內(nèi)核中具有生成中斷的能力,以及兩個(gè)內(nèi)核都有訪問的內(nèi)存區(qū)域(共享內(nèi)存)。消息緩沖區(qū)以每個(gè)內(nèi)核上運(yùn)行在應(yīng)用程序已知的地址置在共享內(nèi)存中,如下圖:
xbqkxt2hcn164013295701.png (53.85 KB, 下載次數(shù): 7)
下載附件
保存到相冊(cè)
xbqkxt2hcn164013295701.png
2024-9-17 19:21 上傳
理想情況下,還將有一個(gè)內(nèi)存保護(hù)單元(MPU),以確保只能通過內(nèi)核的消息緩沖區(qū)API來訪問消息緩沖區(qū),并最好將共享內(nèi)存標(biāo)記為不可被其他程序占用。
------------ END ------------
o3y0ozfmp2w64013295801.jpg (230.7 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
o3y0ozfmp2w64013295801.jpg
2024-9-17 19:21 上傳
嵌入式代碼常見的容錯(cuò)設(shè)計(jì)
vukziveaiwm64013295901.jpg (213.63 KB, 下載次數(shù): 4)
下載附件
保存到相冊(cè)
vukziveaiwm64013295901.jpg
2024-9-17 19:21 上傳
單片機(jī)可以用 Python 開發(fā)嗎?
3ebncvt5hut64013296001.jpg (48.85 KB, 下載次數(shù): 4)
下載附件
保存到相冊(cè)
3ebncvt5hut64013296001.jpg
2024-9-17 19:21 上傳
嵌入式開發(fā),你還會(huì)用 IAR 嗎?
關(guān)注公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
點(diǎn)擊“閱讀原文”查看更多分享。 |
|