電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 284|回復: 0
收起左側(cè)

FreeRTOS 單核、多核的調(diào)度策略

[復制鏈接]

484

主題

484

帖子

2859

積分

三級會員

Rank: 3Rank: 3

積分
2859
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-20 11:38:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
關注+星標公眾,不錯過精彩內(nèi)容

作者 | strongerHuang
微信公眾號 | 嵌入式專欄
FreeRTOS 因為早期的開源免費商用(遵循MIT開源許可協(xié)議),占據(jù)了 RTOS 絕大部分市場。
隨著多核MCU的普及,F(xiàn)reeRTOS也緊跟潮流,支持多核調(diào)度。今天就來分享一下 FreeRTOS 單核、多核的調(diào)度策略。
單核調(diào)度策略
單核調(diào)度是所有RTOS都具有的功能,也是必備的最基礎的功能。

FreeRTOS的單核調(diào)度策略和市面上很多RTOS相同或類似,也就是:默認使用固定優(yōu)先級的搶占式調(diào)度策略,對同等優(yōu)先級的任務執(zhí)行時間切片輪詢調(diào)度。
  • 固定優(yōu)先級:指調(diào)度器不會永久更改任務的優(yōu)先級, 但可能會因優(yōu)先級繼承而暫時提高任務的優(yōu)先級。
  • 搶占式:指調(diào)度器始終運行優(yōu)先級最高且可運行的 RTOS 任務, 無論任務何時能夠運行。例如, 如果中斷服務程序 (ISR) 更改了優(yōu)先級最高且可運行的任務, 調(diào)度器會停止當前正在運行的低優(yōu)先級任務 并啟動高優(yōu)先級任務——即使這發(fā)生在同一個時間片內(nèi) 。這種情況下可以說高優(yōu)先級任務 “搶占”了低優(yōu)先級任務。
  • 輪詢調(diào)度:指具有相同優(yōu)先級的任務輪流進入運行狀態(tài)。
  • 時間切片:指調(diào)度器會在每個 tick 中斷上在同等優(yōu)先級任務之間進行切換, tick 中斷之間的時間構(gòu)成一個時間切片。(tick 中斷是 RTOS 用來衡量時間的周期性中斷。)
    這里可以參看我前面分享的文章:關于RTOS設置滴答Tick設置的問題

    配置調(diào)度策略FreeRTOSConfig.h是整個系統(tǒng)的配置文件,這里有兩個調(diào)度相關的配置。
    1、configUSE_PREEMPTION默認配置為 1
  • #define configUSE_PREEMPTION      1如果 configUSE_PREEMPTION 為 0,則表示搶占已關閉, 而且只有當運行狀態(tài)的任務進入“阻塞”或“掛起”狀態(tài), 或運行狀態(tài)任務調(diào)用 taskYIELD(), 或中斷服務程序 (ISR) 手動請求上下文切換時,才會發(fā)生上下文切換。
    2、configUSE_TIME_SLICING這個配置在早期版本是沒有的,后面新增的功能。同樣,默認配置 1
  • #define configUSE_TIME_SLICING                     1如果 configUSE_TIME_SLICING 為 0,則表示時間切片已關閉, 因此調(diào)度器不會在每個 tick 中斷上在同等優(yōu)先級的任務之間切換。
    多核調(diào)度策略
    MCU多核調(diào)度分為:對稱多處理 (SMP) 和 非對稱多處理 (AMP)。

    1、對稱多處理 (SMP)
    使用 FreeRTOS 的對稱多處理 (SMP) 指的是一個 FreeRTOS 實例可以跨多個處理器核心調(diào)度 RTOS 任務。

    由于只有一個 FreeRTOS 實例在運行,一次只能使用 FreeRTOS 的一個“移植”, 因此每個核心必須具有相同的處理器架構(gòu)并共用相同的內(nèi)存空間。
    針對(SMP)對稱多處理,同樣在FreeRTOSConfig.h配置文件中有相關的配置。
    a、configRUN_MULTIPLE_PRIORITIES如果 configRUN_MULTIPLE_PRIORITIES 設置為 0,則只有在多個任務具有相同優(yōu)先級的情況下, 調(diào)度器才會同時運行多個任務。這可以修復基于下列假設編寫的代碼:一次將只運行一個任務,但同時必須犧牲 SMP 配置帶來的一些好處。
    b、configUSE_CORE_AFFINITY如果 configUSE_CORE_AFFINITY 設置為 1, 則 vTaskCoreAffinitySet() API 函數(shù)可用于定義某個任務可以在哪些核心上運行以及不可以在哪些核心上運行。使用該方法,應用程序編寫者可以防止同時執(zhí)行假設了自身執(zhí)行順序的兩個任務 。
    2、非對稱多處理 (AMP)
    使用 FreeRTOS 的非對稱多處理 (AMP) 是指多核設備的每個核心都單獨運行自己的 FreeRTOS 實例。這些核心并不都需要具有相同架構(gòu), 但如果 FreeRTOS 實例之間需要進行通信,則需要共享一些內(nèi)存。

    每個核心都會運行自己的 FreeRTOS 實例, 因此任何給定核心上的調(diào)度算法與上文的單核系統(tǒng)調(diào)度算法完全相同。你可以使用流緩沖區(qū)或消息緩沖區(qū)作為核間通信原語, 這樣一來,一個核心上的任務可以進入“阻塞”狀態(tài), 以等待另一個核心發(fā)來的數(shù)據(jù)或事件。

    之前分享的文章《雙核單片機M4和M7之間通信的原理》其中就講述了非對稱多處理 (AMP)具體實現(xiàn)的一些原理。

    實現(xiàn)雙核之間通信基本原理:發(fā)送和接收任務位于非對稱多處理器(AMP)配置中的多核微控制器(MCU)的不同內(nèi)核上,這意味著每個內(nèi)核都運行自己的FreeRTOS程序。
    同時,一個內(nèi)核在另一個內(nèi)核中具有生成中斷的能力,以及兩個內(nèi)核都有訪問的內(nèi)存區(qū)域(共享內(nèi)存)。消息緩沖區(qū)以每個內(nèi)核上運行在應用程序已知的地址置在共享內(nèi)存中,如下圖:

    理想情況下,還將有一個內(nèi)存保護單元(MPU),以確保只能通過內(nèi)核的消息緩沖區(qū)API來訪問消息緩沖區(qū),并最好將共享內(nèi)存標記為不可被其他程序占用。
    猜你喜歡:
    WiFi6+藍牙+星閃,三合一開發(fā)板,真香!
    Github上熱門 C 語言項目匯總!
    嵌入式,可測試性軟件設計!
    一些低功耗軟件設計的要點!
    嵌入式 C 保護結(jié)構(gòu)體的方式
    實用 | 10分鐘教你通過網(wǎng)頁點燈
    談談嵌入式軟件的兼容性!
    分享一個嵌入式代碼生成器設計思路!
    點擊閱讀原文,查看更多分享。
  • 回復

    使用道具 舉報

    發(fā)表回復

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則

    關閉

    站長推薦上一條 /1 下一條


    聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表