FreeRTOS移植筆記:讓操作系統在你的硬件上跑起來

一、為什么需要移植?

FreeRTOS就像一套"操作系統積木",但不同硬件平臺(如STM32、ESP32、AVR等)的CPU架構和外設差異大,需要針對目標硬件做適配配置。移植工作就是讓FreeRTOS能正確管理你的硬件資源。

二、源碼文件夾大揭秘(新人必看)

???????

FreeRTOS├── Source ? ? ? ? ??│ ? ├──?include? ? ??// 內核頭文件(任務、隊列、信號量等API定義)│ ? └── portable ? ??// 移植專用目錄(不同編譯器/處理器的適配代碼)│ ? ? ? ├── MemMang ?// 內存管理方案(heap_1.c ~ heap_5.c)│ ? ? ? ├── GCC ? ? ?// GCC編譯器移植文件│ ? ? ? ├── IAR ? ? ?// IAR編譯器移植文件│ ? ? ? └── RVDS ? ??// ARM RealView移植文件(常用ARM_CM3/CM4)└── Demo ? ? ? ? ? ??// 官方示例代碼(非必需,可參考)

關鍵文件說明:

  1. portable/MemMang

    • heap_1.c:簡單靜態分配(不釋放內存)

    • heap_4.c:帶碎片合并的動態分配(新手推薦

    • heap_5.c:支持非連續內存區域分配

    • 包含5種內存管理方案(類似不同的"內存分配器"):

  2. portable/[Compiler]/[Architecture]

    • 處理器核心移植文件(如port.cportmacro.h

    • 例如:STM32F4使用?RVDS/ARM_CM4F?目錄下的文件

  3. FreeRTOSConfig.h

    • 用戶自定義配置文件(需手動創建/復制)

    • 位于工程目錄,用于裁剪功能、設置時鐘等參數

移植步驟講解

1.首先我們在STM32裸機工程模板根目錄下新建一個文件夾叫“FreeRTOS”,并在該文件夾下在創建兩個文件夾“src”,"port",src文件夾用于保存FreeRTOS中的核心文件,也就是我們常說的“.c文件”,port文件夾中存放管理以及處理器相關代碼,這些代碼FreeRTOS官方提供給我們,直接使用。

FreeRTOS是軟件,我們開發板是硬件,軟硬件中間要有橋梁來連接,這些與處理器架構相關的代碼,可以稱為RTOS硬件接口層,它們位于FreeRTOS/Source/Portable文件夾下

2. 打開FreeRTOS,在目錄“FreeRTOSvXXX\FreeRTOS\Source”找到.c文件,將他們拷貝到我們新建的src文件夾中

3.??打開FreeRTOS,在目錄“FreeRTOSvXXX\FreeRTOS\portable”下找到“MemMang”文件夾與"RVDS'文件夾,將他們拷貝到我們新建的port文件夾

4.?打開FreeRTOS,在目錄“FreeRTOSvXXX\FreeRTOS\Source”目錄下找到"include" 文件夾,它們是我們需要用到FreeRTOS的一些頭文件,將它們直接拷貝到我們新建的FreeRTOS文件夾中,完成這一步就可以看到我們新建的FreeRTOS文件夾已經有3個文件夾,這三個文件夾就包含了FreeRTOS的核心文件,至此FreeRTOS的源碼就提取完成。

5. 拷貝FreeRTOSConfig.h文件到user文件夾

FreeRTOSConfig,h文件是FreeRTOS的工程配置文件,因為FreeRTOS是可以裁剪的實時操作系統,應用于不同處理器平臺,我們可以修改這個文件來裁剪FreeRTOS的功能,一般我們把它拷貝在user文件夾下

6.添加FreeRTOS源碼到工程文件夾

7. 配置FreeRTOS頭文件路徑

8.接下來我們就把文件FreeRTOSConfig.h進行修改

FreeRTOSConfig.h 文件是從 FreeRTOS 的 demo 文件夾下拷貝過來的。該頭文件包含了用于裁剪整個 FreeRTOS 所需功能的宏定義。其中,一些宏定義被啟用,一些被禁用。最初,我們只需要配置最基本的功能。然而,要自由配置 FreeRTOS 的功能,我們需要了解這些宏定義的功能。這樣,其他人也能夠輕松理解并讀懂這些配置。

加上頭文件"stm32f10x.h"

然后再將下述代碼進行復制粘貼FreeRTOSConfig.h文件中

#define?configUSE_TIME_SLICING ?1 ?//使能時間片調度(默認式使能的)?#define?configUSE_PORT_OPTIMISED_TASK_SELECTION 1?//硬件計算前導零指令,如果所使用的, MCU 沒有這些硬件指令的話此宏應該設置為?0?#define?configUSE_TICKLESS_IDLE ?1 ?保持系統節拍(tick)中斷一直運行?#define?configUSE_QUEUE_SETS 1 ? ? ?#define?configUSE_TASK_NOTIFICATIONS 1 ?#define?configUSE_MUTEXES ? ?#define?configUSE_RECURSIVE_MUTEXES 1 ? ?#define?configUSE_COUNTING_SEMAPHORES 1 ?#define?configQUEUE_REGISTRY_SIZE 10 ??#define?configUSE_APPLICATION_TASK_TAG ?0 ?#define?configSUPPORT_DYNAMIC_ALLOCATION ?1 ?#define?configUSE_MALLOC_FAILED_HOOK ?0?//使用內存申請失敗鉤子函數?#define?configCHECK_FOR_STACK_OVERFLOW ?1#define?configGENERATE_RUN_TIME_STATS 0?//啟用運行時間統計功能?#define?configUSE_STATS_FORMATTING_FUNCTIONS 1?#define?configUSE_TIMERS 1 ??//啟用軟件定時器?#define?configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) ?#define?configTIMER_QUEUE_LENGTH 10 ??//軟件定時器優先級?//軟件定時器隊列長度?#define?configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) ?//可選函數配置選項?#define?INCLUDE_xTaskGetSchedulerState 1?#define?INCLUDE_eTaskGetState 1?#define?INCLUDE_xTimerPendFunctionCall 1?//中斷服務函數 ?也可以修改起始文件?#define?vPortSVCHandler ? ? SVC_Handler#define?xPortPendSVHandler ? ?PendSV_Handler#define?xPortSysTickHandler ? SysTick_Handler

在port.c文件,寫一個鉤子函數

以上步驟就是移植FreeRTOS的詳細步驟

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

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

相關文章

【C++11(下)】—— 我與C++的不解之緣(三十二)

前言 隨著 C11 的引入,現代 C 語言在語法層面上變得更加靈活、簡潔。其中最受歡迎的新特性之一就是 lambda 表達式(Lambda Expression),它讓我們可以在函數內部直接定義匿名函數。配合 std::function 包裝器 使用,可以…

JavaScript中的Proxy詳解

1. 什么是Proxy? Proxy是ES6引入的一個強大特性,它允許你創建一個對象的代理,從而可以攔截和自定義該對象的基本操作。Proxy提供了一種機制,可以在對象的基本操作,如屬性查找、賦值、枚舉、函數調用等之前或之后執行自…

【git】VScode修改撤回文件總是出現.lh文件,在 ?所有 Git 項目 中全局忽略特定文件

VScode里面powershell被迫關閉 場景解決辦法 場景 系統:Windows IDE:Visual Studio Code 一旦修改代碼,就算撤回也會顯示 解決辦法 第一步:“C:\Users\用戶名字.gitignore_global”:在該路徑下新建.gitignore_glo…

為什么 LoRA 梯度是建立在全量參數 W 的梯度之上

🧠 首先搞清楚 LoRA 是怎么做微調的 我們原來要訓練的參數矩陣是 W W W,但 LoRA 說: 別動 W,我在它旁邊加一個低秩矩陣 Δ W U V \Delta W UV ΔWUV,只訓練這個部分! 也就是說,LoRA 用一個…

Nginx負載均衡時如何為指定ip配置固定服務器

大家在用Nginx做負載均衡時,一般是采用默認的weight權重指定或默認的平均分配實現后端服務器的路由,還有一種做法是通過ip_hash來自動計算進行后端服務器的路由,但最近遇到一個問題,就是希望大部分用戶采用ip_hash自動分配后端服務…

Llama 4 家族:原生多模態 AI 創新的新時代開啟

0 要點總結 Meta發布 Llama 4 系列的首批模型,幫用戶打造更個性化多模態體驗Llama 4 Scout 是有 170 億激活參數、16 個專家模塊的模型,同類中全球最強多模態模型,性能超越以往所有 Llama 系列模型,能在一張 NVIDIA H100 GPU 上運…

【硬件開發技巧】如何通過元器件絲印反查型號

目錄 一、在線數據庫查詢 二、官方資料匹配 三、專業軟件輔助 四、實物比對與場景推斷 五、社區與人工支持 注意事項 一、在線數據庫查詢 專業元器件平臺 Digi-Key、Mouser、ICMaster等平臺支持直接輸入絲印代碼檢索,可獲取芯片型號、技術文檔及替代型號。例如…

【算法/c++】利用中序遍歷和后序遍歷建二叉樹

目錄 題目:樹的遍歷前言題目來源樹的數組存儲基本思想存儲規則示例 建樹算法關鍵思路代碼總代碼 鏈表法 題目:樹的遍歷 前言 如果不是完全二叉樹,使用數組模擬樹,會很浪費空間。 題目來源 本題來自 PTA 天梯賽。 題目鏈接: 樹…

李臻20242817_安全文件傳輸系統項目報告_第6周

安全文件傳輸系統項目報告(第 1 周) 1. 代碼鏈接 Gitee 倉庫地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代碼結構說明: project-root/├── src/ # 源代碼目錄│ ├── main.c # 主程序入口│ ├…

嵌入式rodata段

在嵌入式軟件開發中,將數據放入只讀數據段(.rodata)具有以下好處及典型應用示例: 好處 數據保護 .rodata段的內容在程序運行時不可修改,防止意外或惡意篡改,提升系統穩定性。 節省RAM資源 只讀數據可直接…

InfoSec Prep: OSCP靶場滲透

InfoSec Prep: OSCP InfoSec Prep: OSCP ~ VulnHubInfoSec Prep: OSCP, made by FalconSpy. Download & walkthrough links are available.https://www.vulnhub.com/entry/infosec-prep-oscp,508/ 1,將兩臺虛擬機網絡連接都改為NAT模式 2,攻擊機上做…

【JavaWeb-Spring boot】學習筆記

目錄 <<回到導覽Spring boot1. http協議1.1.請求協議1.2.響應協議 2.Tomcat2.1.請求2.1.1.apifox2.1.2.簡單參數2.1.3.實體參數2.1.4.數組集合參數2.1.5.日期參數2.1.6.(重點)JSON參數2.1.7.路徑參數 2.2.響應2.3.綜合練習 3.三層架構3.1.三層拆分3.2.分層解耦3.3.補充 &…

C++的多態-上

目錄 多態的概念 多態的定義及實現 1.虛函數 2. 多態的實現 2.1.多態構成條件 2.2.虛函數重寫的兩個例外 (1)協變(基類與派生類虛函數返回值類型不同) (2)析構函數的重寫(基類與派生類析構函數的名字不同) 2.3.多態的實現 2.4.多態在析構函數中的應用 2.5.多態構成條…

網絡安全的重要性與防護措施

隨著信息技術的飛速發展&#xff0c;互聯網已經成為我們日常生活、工作和學習的必需品。無論是通過社交媒體與朋友互動&#xff0c;還是在網上進行銀行交易&#xff0c;網絡已經滲透到我們生活的方方面面。然而&#xff0c;隨之而來的是各種網絡安全問題&#xff0c;包括數據泄…

CMake學習--Window下VSCode 中 CMake C++ 代碼調試操作方法

目錄 一、背景知識二、使用方法&#xff08;一&#xff09;安裝擴展&#xff08;二&#xff09;創建 CMake 項目&#xff08;三&#xff09;編寫代碼&#xff08;四&#xff09;配置 CMakeLists.txt&#xff08;五&#xff09;生成構建文件&#xff08;六&#xff09;開始調試 …

訪問數組元素(四十四)

1. 數組下標與類型 數組的索引從 0 開始。例如&#xff0c;一個包含 10 個元素的數組&#xff0c;其合法下標范圍為 0 到 9&#xff0c;而不是 1 到 10。為了表示下標&#xff0c;通常使用 size_t 類型&#xff0c;它是一種與機器相關的無符號整型&#xff0c;足夠大以存放內存…

計算機網絡 3-1 數據鏈路層(功能+組幀+差錯控制)

【考綱內容】 &#xff08;一&#xff09;數據鏈路層的功能 &#xff08;二&#xff09;組幀 &#xff08;三&#xff09;差錯控制 檢錯編碼&#xff1b;糾錯編碼 &#xff08;四&#xff09;流量控制與可靠傳輸機制 流量控制、可靠傳輸與滑動窗口機制&#xff1b;停止-等…

Django中使用不同種類緩存的完整案例

Django中使用不同種類緩存的完整案例 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 Django中使用不同種類緩存的完整案例步驟1:設置Django項目步驟2:設置URL路由步驟3:視圖級別…

Spring Boot 集成Redis 的Lua腳本詳解

1. 對比Lua腳本方案與Redis自身事務 對比表格 對比維度Redis事務&#xff08;MULTI/EXEC&#xff09;Lua腳本方案原子性事務命令序列化執行&#xff0c;但中間可被其他命令打斷&#xff0c;不保證原子性Lua腳本在Redis單線程中原子執行&#xff0c;不可中斷計算能力僅支持Red…

【大模型】DeepSeek + 藍耕MaaS平臺 + 海螺AI生成高質量視頻操作詳解

目錄 一、前言 二、藍耘智能云MaaS平臺介紹 2.1 藍耘智算平臺是什么 2.2 平臺優勢 2.3 平臺核心能力 三、海螺AI視頻介紹 3.1 海螺AI視頻是什么 3.2 海螺AI視頻主要功能 3.3 海螺AI視頻應用場景 3.4 海螺AI視頻核心優勢 3.5 項目git地址 四、藍耘MaaS平臺DeepSeek海…