FreeRTOS多核支持

個人博客:blogs.wurp.top

簡介

1. 多核支持概述

在傳統的單核系統中,FreeRTOS 通常運行在一個 CPU 核心上,負責任務調度、中斷處理和資源管理。然而,在多核系統中,多個核心可以并行執行不同的任務或線程,從而提升系統的性能和響應能力。

2. 多核支持方式

共享內存模型:多個核心共享同一塊內存,通過鎖機制協調訪問。分布式模型:每個核心獨立運行一個 FreeRTOS 實例,各自維護自己的任務隊列和資源。

3. FreeRTOS典型應用場景

  • 分布式計算任務:

    每個核心運行獨立的任務,分別處理不同的計算任務。通過隊列或信號量協調任務之間的數據交換。

  • 實時任務與非實時任務分離:

    將實時任務分配給一個核心,非實時任務分配給另一個核心。使用互斥鎖或信號量保證任務間的同步。

  • 多核協同處理:

    多個核心協同完成復雜任務(如圖像處理、網絡通信等)。通過共享內存或消息隊列進行數據傳輸。

FreeRTOS多核架構

1. 單核與多核系統的區別

特性單核系統多核系統
運行環境一個 CPU 核心多個 CPU 核心
任務調度搶占式或時間片輪轉可以分配到不同核心
資源管理單一核心管理需要協調多個核心
通信與同步簡單更加復雜
性能與效率適合小規模應用更高并發和性能
開發與調試相對簡單更加復雜

2. FreeRTOS多核支持的實現方式

  • 在 FreeRTOS 中,多核支持主要分為以下兩種架構類型:

    架構類型描述
    SMP(對稱多處理)所有核心共享相同的內存和資源,由同一個 FreeRTOS 內核管理。
    AMP(異步多處理)每個核心運行獨立的 FreeRTOS 實例,彼此之間通過通信機制進行交互
  • FreeRTOS 支持多種多核平臺,包括但不限于:

    ARM Cortex-M7/M4/M3:支持 SMP 和 AMP 模式。

    RISC-V:支持多核架構。

    Xilinx Zynq UltraScale+ MPSoC:支持多核 FreeRTOS 配置。

    TI AM335x 系列:支持多核 FreeRTOS 應用。

3. 多核任務調度機制

  • FreeRTOS 的任務調度是基于優先級的搶占式調度。在多核環境中,調度機制如下:

    • 本地調度:每個核心維護自己的就緒任務列表,并根據優先級進行調度。
    • 任務遷移:某些版本支持任務在不同核心之間遷移,以平衡負載。
    • 中斷處理:中斷可以在任意核心上處理,但需要確保中斷服務程序(ISR)的可重入性和同步。

多核支持的關鍵技術

1. 互斥鎖(Mutex)

  • 在多核環境中,多個核心可能會同時訪問共享資源。為了防止競態條件,FreeRTOS 提供了互斥鎖(xSemaphoreCreateMutex())來確保同一時間只有一個核心可以訪問 共享資源。
    SemaphoreHandle_t xMutex = xSemaphoreCreateMutex();void vTaskFunction(void *pvParameters) {if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {// 訪問共享資源xSemaphoreGive(xMutex);}
    }
    

2. 信號量(Semaphore)

  • 信號量用于控制對共享資源的訪問或任務之間的同步。FreeRTOS 提供了二值信號量(Binary Semaphore)、計數信號量(Counting Semaphore)和遞歸信號量 (Recursive Semaphore)。
    SemaphoreHandle_t xBinarySemaphore = xSemaphoreCreateBinary();void vTaskFunction(void *pvParameters) {if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {// 任務執行邏輯xSemaphoreGive(xBinarySemaphore);}
    }
    

3. 隊列(Queue)

  • 隊列是 FreeRTOS 中任務間通信的核心機制之一。在多核系統中,可以通過隊列傳遞數據或事件,實現跨核通信。
    QueueHandle_t xQueue = xQueueCreate(10, sizeof(int));void vTaskFunction(void *pvParameters) {int data = 42;xQueueSend(xQueue, &data, portMAX_DELAY);
    }
    

4. 任務調度器(Scheduler)

  • 在多核系統中,FreeRTOS 可以配置為在多個核心上運行獨立的調度器。每個核心的任務調度器獨立運行,但可以通過共享資源進行協調。
    // 啟動任務調度器(適用于多核)
    vTaskStartScheduler();
    

FreeRTOS多核配置(以ARM Cortex-M7為例)

1. 硬件支持:確保使用的微控制器支持多核架構(如雙核Cortex-M7)。

2. 內核配置:

  • 啟用configMULTI_CORE選項。
  • 設置configNUM_CORES為實際的核數。
  • 任務創建:
    使用xTaskCreatePinnedToCore()函數將任務綁定到特定的核心。
  • 資源同步:
    使用xSemaphoreCreateBinary()或xQueueCreate()等機制進行任務間的通信。
  • 中斷配置:
    將關鍵中斷綁定到特定的核心,避免搶占問題。

3. 示例代碼

#include "FreeRTOS.h"
#include "task.h"
void vTaskFunction(void *pvParameters) {while (1) {// 任務邏輯vTaskDelay(pdMS_TO_TICKS(1000));}
}
int main(void) {xTaskCreatePinnedToCore(vTaskFunction, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL, 0);xTaskCreatePinnedToCore(vTaskFunction, "Task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL, 1);vTaskStartScheduler();for (;;);
}

多核任務調度

1. 任務分配策略

在多核系統中,合理的任務分配策略能夠提升系統的性能和穩定性。常見的任務分配策略包括:

  • 靜態分配(Static Allocation)

    任務在啟動時就被分配到特定的核心。適用于對實時性要求高且任務數量固定的場景。

    優點:可預測性強,減少任務遷移開銷。

    缺點:靈活性差,難以適應動態負載變化。

  • 動態分配(Dynamic Allocation)

    任務根據當前核心的負載情況動態分配。適用于負載不穩定的場景。

    優點:提高資源利用率,優化系統性能。

    缺點:可能增加任務遷移的開銷。

  • 基于優先級的分配(Priority-Based Allocation)

    高優先級任務優先分配到空閑的核心。適用于對響應時間敏感的應用。

    優點:保證關鍵任務的實時性。

    缺點:可能導致低優先級任務長時間得不到執行。

  • 基于負載的分配(Load-Balanced Allocation)

    根據每個核心的負載情況動態分配任務。適用于多核系統中負載不均的場景。

    優點:平衡各核心負載,提高整體性能。

    缺點:需要額外的負載監控機制。

2. 負載均衡

  • 目標:負載均衡的目標是將任務均勻地分配到各個核心上,避免某些核心過載而其他核心空閑,從而提高系統吞吐量和響應速度。

  • 實現方式
    動態任務遷移:根據各核心的負載情況,自動將任務遷移到較為空閑的核心上運行。

    任務優先級調整:通過調整任務優先級,確保高優先級任務能夠及時得到處理。

    負載監控:定期檢查各核心的負載狀態,為調度決策提供依據。

3. 任務優先級與搶占

  • 任務優先級

    在 FreeRTOS 中,每個任務都有一個優先級值,用于決定其調度順序。優先級越高,任務越有可能被調度執行。
    優先級范圍
    通常為 0 到 (configMAX_PRIORITIES - 1);0 表示最低優先級,configMAX_PRIORITIES - 1 表示最高優先級。
    優先級設置

    xTaskCreate(vTaskFunction,        // 任務函數"TaskName",           // 任務名稱STACK_SIZE,           // 堆棧大小NULL,                 // 任務參數tskIDLE_PRIORITY + 1, // 任務優先級&xTaskHandle          // 任務句柄
    );
    
  • 搶占機制

    reeRTOS 支持 搶占式調度,即高優先級任務可以中斷低優先級任務的執行。

    搶占規則

    當高優先級任務就緒時,它會立即搶占當前正在運行的低優先級任務。搶占行為僅在任務處于“就緒狀態”時發生。

    搶占模式

    完全搶占:高優先級任務可以隨時搶占低優先級任務。

    部分搶占:某些情況下,搶占可能受限(如任務處于臨界區)。

    在多核環境中,任務的優先級和搶占行為仍然遵循上述規則,但可能會受到以下因素影響:

      任務綁定:如果任務綁定到特定核心,則優先級和搶占僅在該核心內生效。核心間通信:跨核心的任務交互需要考慮同步機制,例如使用隊列、信號量等。
    

4. 多核任務同步機制

同步機制描述
互斥鎖(Mutex)用于保護共享資源,確保同一時間只有一個任務可以訪問資源。
信號量(Semaphore)用于任務之間的通信,控制對共享資源的訪問。
隊列(Queue)用于任務之間傳遞數據或事件信息。
事件組(Event Group)用于任務之間傳遞多個事件的狀態信息。
任務通知(Task Notification)一種輕量級的通信方式,用于任務之間的直接通知。

多核通信與同步

1. 消息隊列與信號量

  • 消息隊列是一種用于任務間或中斷服務程序與任務之間傳遞數據的機制。它支持先進先出(FIFO)或后進先出(LIFO)的數據傳輸方式。

    QueueHandle_t xQueue;// 創建消息隊列
    xQueue = xQueueCreate(10, sizeof(uint32_t));// 發送消息
    uint32_t data = 0x1234;
    xQueueSend(xQueue, &data, portMAX_DELAY);// 接收消息
    uint32_t receivedData;
    xQueueReceive(xQueue, &receivedData, portMAX_DELAY);
    
  • 信號量是一種用于控制對共享資源訪問的同步機制。它可以用來實現任務間的同步、互斥訪問等。

    // 創建二值信號量
    SemaphoreHandle_t xSemaphore = xSemaphoreCreateBinary();// 獲取信號量(阻塞等待)
    xSemaphoreTake(xSemaphore, portMAX_DELAY);// 釋放信號量
    xSemaphoreGive(xSemaphore);
    

2. 共享內存與互斥鎖

  • 共享內存是一種允許多個任務或核心訪問同一塊內存區域的機制。在 FreeRTOS 中,通常通過以下方式實現共享內存:

    使用全局變量或靜態變量。

    使用 Heap 區域分配的動態內存(如 pvPortMalloc())。

    使用特定的內存映射機制(依賴于硬件平臺)。

  • 互斥鎖是一種用于保護共享資源的同步機制,確保在同一時間只有一個任務可以訪問受保護的代碼段。

    SemaphoreHandle_t xMutex = xSemaphoreCreateMutex();void TaskA(void *pvParameters) {while (1) {xSemaphoreTake(xMutex, portMAX_DELAY); // 獲取互斥鎖// 訪問共享內存xSemaphoreGive(xMutex); // 釋放互斥鎖}
    }void TaskB(void *pvParameters) {while (1) {xSemaphoreTake(xMutex, portMAX_DELAY); // 獲取互斥鎖// 訪問共享內存xSemaphoreGive(xMutex); // 釋放互斥鎖}
    }
    

3. 事件組與標志位

  • 事件組是 FreeRTOS 中一種用于任務間通信和同步的機制,主要用于任務等待多個事件的發生,或者通知其他任務某個事件已經發生。
    // 定義事件組
    EventGroupHandle_t xEventGroup;// 初始化事件組
    xEventGroup = xEventGroupCreate();// 任務 A:等待事件
    void vTaskA(void *pvParameters)
    {EventBits_t uxBits;// 等待事件 0x01 和 0x02 同時發生uxBits = xEventGroupWaitBits(xEventGroup, 0x03, pdTRUE, pdTRUE, portMAX_DELAY);if ((uxBits & 0x01) && (uxBits & 0x02)){// 所有事件已觸發}
    }// 任務 B:設置事件
    void vTaskB(void *pvParameters)
    {// 設置事件 0x01xEventGroupSetBits(xEventGroup, 0x01);// 設置事件 0x02xEventGroupSetBits(xEventGroup, 0x02);
    }
    
  • 標志位是事件組的一個子集,通常用于表示簡單的狀態變化。它比事件組更輕量,適合用于單個狀態的標記。
    // 定義標志位
    volatile uint32_t ulFlag = 0;// 任務 A:等待標志位
    void vTaskA(void *pvParameters)
    {while (1){if (ulFlag & 0x01){// 標志位 0x01 被設置ulFlag &= ~0x01; // 清除標志位}vTaskDelay(pdMS_TO_TICKS(100));}
    }// 任務 B:設置標志位
    void vTaskB(void *pvParameters)
    {while (1){// 設置標志位 0x01ulFlag |= 0x01;vTaskDelay(pdMS_TO_TICKS(500));}
    }
    

4. 多核中斷處理

  • 在 FreeRTOS 中支持多核系統(如基于多核處理器的嵌入式設備),多核之間的通信和同步是實現任務協調的關鍵。
    // 將任務綁定到核心
    void vTaskFunction(void *pvParameters) {while (1) {// 任務邏輯}
    }// 創建任務并綁定到核心
    xTaskCreatePinnedToCore(vTaskFunction, "Task", 2048, NULL, 1, NULL, 1);// 設置中斷處理函數
    void vMyInterruptHandler(void) {// 中斷處理邏輯xTaskGenerateSoftwareInterrupt(0); // 觸發任務
    }
    

結論

FreeRTOS多核支持的優勢

  • 提高系統性能

    多核架構允許同時執行多個任務,從而提升系統的整體性能。FreeRTOS 支持將任務分配到不同的核心上運行,充分利用多核處理器的計算能力。

  • 增強實時性

    在多核系統中,關鍵任務可以被分配到特定的核心上運行,避免因其他任務的干擾而影響實時響應。這有助于實現更精確的時序控制和更低的延遲。

  • 任務隔離與安全性

    多核支持使得不同任務可以在獨立的內核上運行,減少任務之間的相互干擾。提高了系統的穩定性和安全性,尤其適用于需要高可靠性的應用。

  • 靈活的任務調度

    FreeRTOS 支持多種任務調度策略,并可根據多核架構進行優化。用戶可以根據需求選擇適合的調度方式,以適應不同的應用場景。

  • 簡化開發與維護

    使用多核 FreeRTOS 可以通過模塊化設計,將功能拆分到不同的核心上,便于開發和維護。開發者可以專注于各自核心上的功能實現,降低整體復雜度。

  • 兼容現有生態

    FreeRTOS 的多核支持與現有的 API 和工具鏈保持兼容,開發者無需重寫大量代碼即可利用多核優勢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95672.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95672.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95672.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CUDA中的基本概念

要學習cuda的同學相信已經對其有一定的了解了,至少直到它是干什么的了。這篇文章主要是對cuda編程中的主要概念進行總結,有了一個大致的輪廓后就好入手了。 異構架構 異構架構即使用CPU和GPU共同進行計算。GPU不能作為一個獨立的運行平臺(程序…

【LINUX網絡】HTTP協議基本結構、搭建自己的HTTP簡單服務器

目錄 1. 初識HTTP 2. URL 2.1 基本結構 2.2 URL中的?與urldecode\urlencode 易混淆:URL和HTTP傳輸請求兩者是什么關系? HTTP的宏觀結構 3. DEMO CODE loop模塊,核心邏輯 HttpServer 初代版本(DEMO 0.0) DEMO 1.0 DEMO…

Spring Boot 靜態函數無法自動注入 Bean?深入解析與解決方案

在 Spring Boot 項目中,開發者常遇到一個典型問題:在靜態方法或靜態變量中嘗試使用 Autowired 注入 Bean 時,始終得到 null 值。本文將深入剖析這一問題的根源,并提供多種可靠解決方案。問題重現:為什么注入失敗&#…

存儲過程作為系統邏輯核心的架構思考 —— 以 SaaS 系統為例

在企業級系統尤其是 SaaS 架構中,技術選型一旦確定,就意味著底層數據庫類型基本不會輕易更換。既然如此,我們可以更大膽地將數據庫能力本身納入系統設計的核心,而不僅僅把它當成一個被動的存儲引擎。存儲過程(Stored P…

Ubuntu20.04下Remmina的VNC密碼忘記后重置

你遇到的錯誤: ** error creating password: /home/ysc/.vnc/passwd storepasswd: No such file or directory說明:x11vnc -storepasswd 無法創建密碼文件,因為 .vnc 目錄不存在。 雖然你可能以為路徑是對的,但系統找不到 /home/y…

從“存得對”到“存得準”:MySQL 數據類型與約束全景指南

目錄 一、為什么需要數據類型與約束? 二、MySQL 數據類型全覽 1. 數值類型:精確 VS 近似 2. 日期時間類型:別讓“0000-00-00”出現 3. 字符串類型:CHAR、VARCHAR、TEXT、BLOB 4. JSON 類型:文檔與關系共舞 5. 空…

Effective C++ 條款42:了解 typename 的雙重含義

Effective C 條款42:了解typename的雙重含義 核心思想:在模板聲明中,typename和class可互換使用,但在模板內部,typename必須用于顯式指明嵌套從屬類型名稱(nested dependent type name)&#xf…

ENCOPIM, S.L. 參展 AUTO TECH China 2025 廣州國際汽車技術展覽會

ENCOPIM, S.L. 參展 AUTO TECH China 2025 廣州國際汽車技術展覽會2025年11月21-24日中國進出口商品交易會展館D區(廣州)AUTO TECH China 2025同期:第二十三屆廣州車展即將盛大開幕展商推薦ENCOPIM, S.L.展位號:3916企業簡介:ENCOPIM, S.L.于…

30 HTB Soccer 機器 - 容易

主要知識點 第一階段:偵查 nmap nmap快速掃描: oxdfhacky$ nmap -p- --min-rate 10000 10.10.11.194 Starting Nmap 7.80 ( https://nmap.org ) at 2023-06-04 13:32 EDT Nmap scan report for 10.10.11.194 Host is up (0.093s latency). Not shown:…

阿里云機器翻譯接口SDK-RAM權限配置

用戶授權翻譯權限在數字化時代,短信作為企業與用戶溝通的重要橋梁,其高效、可靠的送達直接影響業務轉化與用戶體驗。SDK(軟件開發工具包)的出現極大簡化了短信功能的集成過程,讓開發者能夠快速在應用中嵌入短信驗證、通…

ESXI 6.7服務器時間錯亂問題

1. 設置ESXI服務器:在此主機上手動配置日期和時間管理-服務-ntpd-鼠標右鍵-策略-手動啟動和停止,狀態已停止管理-系統-時間和日期-編輯設置-檢查是否選擇了【在此主機上手動配置日期和時間】ntp服務狀態已停止ntp服務器已停止2. 停止所有虛擬機自動更新時…

CV 醫學影像分類、分割、目標檢測,之【皮膚病分類】項目拆解

CV 醫學影像分類、分割、目標檢測,之【皮膚病分類】項目拆解第1-12行:導入庫第14-17行:讀取標簽文件第19-21行:獲取疾病名稱第23-26行:獲取圖片名列表第28-35行:篩選有標簽的圖片第38-43行:提取…

【JavaEE】多線程 -- 線程狀態

目錄六大狀態舉例說明六大狀態 New 新建狀態:線程還沒出創建,只有Thread 實例化的對象,調用start 方法之前的狀態。Runnable 運行狀態:被系統調度后,CPU 正在執行的,Ready 就緒態,系統調度&…

網絡流初步

網絡流初步 文章目錄網絡流初步概念介紹最大流費用流概念介紹 網絡流不同之處在于它的本質圖論,但是把圖論的某些概念換了一個說法而已,初步只要了解網絡流的各個概念就可以明白的很快。 下述概念是本人自己定義的,對于網絡流的題目做的還不…

[系統架構設計師]系統架構基礎知識(一)

[系統架構設計師]系統架構基礎知識(一) 一.計算機系統基礎知識 1.計算機系統概述 硬件軟件及網絡組成的系統 2.計算機硬件基礎知識 馮 諾依曼結構:運算器,控制器,存儲器,輸入設備,輸出設備 專用…

深入解析Java代理模式:靈活控制對象訪問的核心技術

在日常開發中,我們常遇到這樣的場景:需要控制對象訪問權限、優化高成本操作,或給方法添加額外功能(如日志、事務)。代理模式(Proxy Pattern) 正是解決這類問題的金鑰匙。作為結構型設計模式的代…

【學習筆記】Java并發編程的藝術——第9章 Java中的線程池

第9章 Java中的線程池 線程池優勢: ①減少資源消耗 ②提高響應速度 ③統一管理 9.1 線程池的實現原理 當任務來后 ①判斷核心線程池是否已滿,若未滿,創建一個核心線程來執行任務 ②若無空閑核心線程且核心線程已滿,則將任務放入任…

Mybatis學習筆記(九)

常見問題與解決方案 簡要描述:總結MyBatis-Plus開發過程中常見的問題、錯誤及其解決方案,幫助開發者快速定位和解決問題。 核心概念: 常見錯誤:開發中經常遇到的錯誤類型性能問題:性能相關問題的排查和解決配置問題&am…

數據類型 list

一、介紹類似于數組,順序表,deque結構圖特點:元素有序,元素允許重復由于頭尾高效插入刪除,可以模擬棧,隊列二、常見 list 命令1、lpush key elem [elem ...]頭插元素,返回值列表長度2、lrange k…

pyqt5無法顯示opencv繪制文本和掩碼信息

背景:pyqt5無法顯示opencv繪制的標簽和mask;我們在使用YOLO做實例分割做推理時,會使用opencv做后處理結果繪制(含標簽繪制和掩碼繪制);結果opencv繪制的解碼卻無法在pyqt的解碼上面顯示。pyqt轉換代碼如下&…