FreeRTOS學習筆記——總覽

考慮到RTOS能夠提升單片機開發能力,也是開發復雜任務的必經之路,還是有必要學習的。
FreeRTOS教程多,免費開源,是個不錯的選擇。后續可以考慮繼續學習RT-Thread等。
參考1:FreeRTOS(教程非常詳細)——作者:不禿也很強
參考2:部分內容由GPT生成,請注意核實。

一、FreeRTOS簡介

FreeRTOS 是一個開源、實時操作系統 (RTOS),它提供了對多任務處理、資源管理和硬件抽象的支持。它主要用于嵌入式系統開發,特別適合資源受限的環境。以下是對 FreeRTOS 的簡介,包括其特點、優缺點等內容:

FreeRTOS 簡介

FreeRTOS 是一個功能強大的實時操作系統,廣泛應用于嵌入式系統中。它輕量且高效,適用于對時間要求較高的應用場景,如自動化控制、工業設備、智能家居設備等。作為一個實時操作系統,FreeRTOS 支持多任務調度,并提供了諸如任務優先級、隊列、信號量、互斥量等基本的同步機制。

特點

  1. 輕量級:
    FreeRTOS 內核非常小巧,適用于資源受限的嵌入式系統。它的內核代碼可以精簡到幾 KB 的大小,適合存儲空間有限的設備。

  2. 優先級調度:
    FreeRTOS 支持基于優先級的任務調度,用戶可以為任務分配不同的優先級,并根據任務的優先級進行調度。

  3. 支持多種架構:
    FreeRTOS 支持多種微處理器架構,包括 ARM Cortex-M、AVR、PIC、RISC-V 等。可以在多種硬件平臺上進行移植。

  4. 可配置性強:
    FreeRTOS 是高度可配置的,用戶可以根據項目的需要定制調度策略、內存管理方案以及其他系統資源的管理方式。

  5. 廣泛的社區支持:
    作為一個開源項目,FreeRTOS 擁有強大的社區支持,用戶可以輕松獲取文檔、示例代碼和開發者論壇的幫助。

  6. 實時性:
    FreeRTOS 是為實時應用設計的,支持精確的任務調度和時間管理,能夠保證高優先級任務的及時響應。

  7. 集成豐富的同步機制:
    提供了信號量、隊列、互斥量等同步機制,支持多任務之間的通信和協調。

  8. 低功耗支持:
    FreeRTOS 支持低功耗管理,適合電池供電的設備,能夠根據任務需求調整處理器的工作狀態。

優點

  1. 開源和免費:
    FreeRTOS 是完全開源的,可以自由使用并根據需要修改源代碼,這使得它特別適合學術研究和商業產品開發。

  2. 高度可移植:
    支持多種硬件平臺和編譯器,開發者可以在不同的硬件上移植和使用 FreeRTOS。

  3. 靈活的任務管理:
    提供了豐富的任務調度功能,能夠在多任務系統中靈活管理任務,包括任務創建、刪除、掛起、恢復等。

  4. 實時性能:
    對實時任務的響應時間控制嚴格,適合需要嚴格時間約束的嵌入式系統。

  5. 廣泛應用和成熟:
    已經被廣泛應用于各類商業產品中,經過了大量實際應用的驗證,具有很高的穩定性。

缺點

  1. 功能相對簡單:
    雖然 FreeRTOS 提供了多任務管理和基本的同步機制,但其功能相較于一些更復雜的操作系統(如 Linux)較為簡單,不支持復雜的進程管理、文件系統和網絡協議棧。

  2. 調試較難:
    由于是嵌入式系統,調試 FreeRTOS 程序通常比較復雜。雖然有一些調試工具,但相比于標準操作系統,嵌入式開發環境的調試仍然面臨一些挑戰。

  3. 內存管理:
    FreeRTOS 的內存管理功能相對較為基礎,缺乏先進的內存保護和虛擬內存管理,可能導致一些內存溢出等問題。

  4. 不適合復雜的任務管理:
    FreeRTOS 的多任務支持適合簡單到中等復雜度的任務管理,對于需要大量進程、線程調度和高效資源管理的大規模應用可能不太適用。

總結

FreeRTOS 是一個非常適合嵌入式系統的小型實時操作系統,它提供了強大的多任務處理能力和良好的實時性支持,尤其適合資源有限、對時間要求嚴格的應用。它的開源特性和高可配置性使得它在嵌入式領域有著廣泛的應用,但對于需要更復雜功能的系統,可能需要考慮其他更強大的 RTOS 或操作系統。

希望這個簡介能夠幫助你理解 FreeRTOS 的基本概念,后續可以在博客中進一步深入探討具體的使用場景和移植過程。

二、函數名前綴和參數命名規范

在 FreeRTOS 中,函數名前綴和參數命名通常有一些約定,這些約定有助于區分不同類型的變量、函數或對象的作用。下面是一些常見的命名約定,解釋了這些前綴的含義:

1. x 前綴

  • x 是 FreeRTOS 中非常常見的前綴,表示 “變量”。它用于標識一個 結構體、句柄、或其他對象,這些對象通常會存儲狀態信息或數據,并且可能會在多個任務間傳遞。
  • xTaskHandle:例如 xTaskHandle 是一個句柄類型,用于引用任務。
  • xQueueHandle:表示隊列的句柄。
  • xSemaphoreHandle:表示信號量的句柄。
  • xEventGroupHandle:表示事件組的句柄。

例子:

xQueueHandle xQueue;  // 隊列句柄
xTaskHandle xTask;    // 任務句柄

2. v 前綴

  • v 前綴通常表示 “void” 類型的函數,即不返回值的函數。許多 FreeRTOS 的 API 函數都是以 v 為前綴的,它們執行任務但不需要返回值。

例子:

void vTaskDelay( TickType_t xTicksToDelay );  // 延遲函數,不返回值
void vTaskStartScheduler(void);                // 啟動調度器函數

3. px 前綴

  • px 前綴表示一個 指針,尤其是指向任務、隊列、信號量等對象的指針。在 FreeRTOS 的許多數據結構中,使用了指針來管理和傳遞對象。

例子:

TaskHandle_t *pxTask;  // 任務指針
QueueHandle_t *pxQueue;  // 隊列指針

4. ux 前綴

  • ux 前綴通常表示 無符號類型的變量,尤其是一些與計數、任務優先級、事件等有關的變量。

例子:

uxQueueMessagesWaiting( QueueHandle_t xQueue );  // 返回隊列中消息的數量
uxTaskPriorityGet( TaskHandle_t xTask );  // 獲取任務的優先級

5. pv 前綴

  • pv 前綴表示 指向 void 類型的指針。它通常用于指向無法預先確定類型的通用數據結構。

例子:

void *pvParameter = NULL;  // 無類型的參數

6. prv 前綴

  • prv 表示 “private”(私有的)。通常用于表示在文件內部或靜態作用域中的私有函數。它表明這些函數不應該被外部調用,僅限于文件內部的使用。

例子:

static void prvTaskFunction(void *pvParameters);  // 私有任務函數

7. ux 和 x 的結合

  • uxx 在某些情況下會結合使用,用于表示 無符號普通 的參數或返回值。

8. 其他命名約定

  • TickType_t:表示 FreeRTOS 中時間計時單位的類型,通常是無符號整數。
  • BaseType_t:表示帶符號的基礎類型,常用于任務或事件標志返回的結果。
  • TickType_tBaseType_t:都是 FreeRTOS 內部時間和狀態相關的標準數據類型。

總結:

這些命名約定為開發者提供了一定的 代碼規范,便于理解和維護代碼。在使用 FreeRTOS 時,熟悉這些命名規則能幫助你更快速地理解 API 的含義和功能,從而有效地進行開發。

三、開發規范

為了確保后續開發的規范性、可維護性和代碼的統一性,命名約定是非常重要的。以下是一些通用的命名約定,適用于 FreeRTOS 或其他嵌入式開發項目。你可以根據具體項目的需求進行調整和擴展:

1. 函數命名

  • 動詞+名詞結構:函數名應該清晰表達其功能,通常使用動詞+名詞結構來描述。

  • 避免簡寫:使用完整的單詞,避免使用不常見的縮寫。

  • 動詞使用

    • create: 創建任務、隊列、信號量等(如 createTaskcreateQueue)。
    • init: 初始化操作(如 initSysteminitHardware)。
    • get: 獲取某個值(如 getTaskPriority)。
    • set: 設置某個值(如 setTaskPriority)。
    • handle: 處理某個操作(如 handleInterrupt)。
    • start, stop: 啟動和停止操作(如 startSchedulerstopTask)。
    • check: 檢查狀態(如 checkQueueEmpty)。

例子

void createTask(void);
void initSystem(void);
int getQueueLength(QueueHandle_t xQueue);
void startScheduler(void);
void stopTask(TaskHandle_t xTask);

2. 參數命名

  • 小寫字母+駝峰法:使用小寫字母,并遵循駝峰命名規則(第一個單詞首字母小寫,后續單詞首字母大寫)。
  • 描述性:參數命名要有描述性,能反映它在函數中的作用。
  • 避免縮寫:盡量避免使用縮寫,除非是眾所周知的縮寫(如 ptr 表示指針)。

例子

void setTaskPriority(TaskHandle_t taskHandle, UBaseType_t priority);
void initQueue(QueueHandle_t *queueHandle, size_t queueSize);

3. 結構體命名

  • 類型名稱+結構體標識:結構體的名稱應該能明確表示其用途和類型。通常以類型名稱為基礎,加上 Struct 后綴。
  • 駝峰命名法:使用大駝峰命名法(每個單詞首字母大寫)。
  • 結構體成員命名:結構體成員一般使用小寫字母,并用下劃線分隔(如果需要)。

例子

typedef struct TaskConfig {uint32_t taskId;uint32_t taskPriority;void (*taskFunction)(void *);
} TaskConfig_t;

4. 全局變量命名

  • 小寫字母+下劃線分隔:全局變量命名應簡潔明了,使用小寫字母和下劃線分隔各個詞。
  • 避免與局部變量沖突:確保全局變量的命名不會與函數中的局部變量沖突。

例子

uint32_t system_status;
TaskHandle_t scheduler_task;

5. 常量命名

  • 全大寫+下劃線分隔:常量(如宏、枚舉等)使用全大寫字母,單詞之間使用下劃線分隔。
  • 前綴標識:可以使用一些前綴來表示常量的作用或范圍,例如 MAX_ 表示最大值,CONFIG_ 表示配置相關常量。

例子

#define MAX_TASK_PRIORITY 10
#define CONFIG_QUEUE_SIZE 128

6. 句柄命名

  • Handle 結尾:句柄一般是指向某個對象(如任務、隊列等)的指針,命名時可以在名稱的后面加上 Handle 后綴。

例子

TaskHandle_t taskHandle;
QueueHandle_t queueHandle;
SemaphoreHandle_t semaphoreHandle;

7. 類型定義

  • typedef 類型名+描述性后綴:如果需要為某些數據類型定義類型別名,可以使用描述性的名稱,并以 _t 結尾。

例子

typedef uint32_t TickType_t;
typedef struct {int x;int y;
} Position_t;

8. 文件命名

  • 小寫字母+下劃線分隔:文件名應簡潔明了,使用小寫字母和下劃線分隔,便于識別文件內容。
  • 與功能匹配:文件名應與文件中的功能或模塊匹配。

例子

task_scheduler.c
queue_manager.c
system_init.c

9. 宏命名

  • 全大寫字母:宏定義使用全大寫字母,單詞之間使用下劃線分隔,便于區分常量和宏定義。

例子

#define TASK_STACK_SIZE 1024
#define QUEUE_TIMEOUT 100

10. 命名約定總結

  • 可讀性優先:命名應具有描述性,能準確反映變量或函數的用途。
  • 統一性:保持項目中的命名風格一致,避免混用不同的命名方式。
  • 避免使用類似“temp”、“data”等沒有實際意義的名稱,除非是臨時變量。
  • 避免過度縮寫:縮寫可以提高代碼簡潔性,但要確保其他開發者能理解這些縮寫的含義。

總結

通過遵循這些命名約定,可以確保代碼的清晰性和可維護性。為不同類型的參數、變量、函數等選擇合適的命名規則,不僅可以提高開發效率,還能減少后期維護中的混淆和錯誤。在寫博客時,你可以根據這些規則為開發項目提供清晰的命名標準,并幫助其他開發者更好地理解代碼。

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

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

相關文章

Clip微調系列:《coOp: learning to prompt for vision-language models》

論文鏈接:arxiv.org/pdf/2109.01134v1 推薦視頻(clip_coop的代碼邏輯講解,代碼簡單,有助于理解):CLIP和CoOp工作的簡單Pytorch復現和理解_嗶哩嗶哩_bilibili 其他參考鏈接:CoOp - CLIP 自適應Prompt工程 【一】_coop…

[論文閱讀] 人工智能 + 軟件工程 | 開源軟件中的GenAI自白:開發者如何用、項目如何管、代碼質量受何影響?

開源軟件中的GenAI自白:開發者如何用、項目如何管、代碼質量受何影響? 論文:Self-Admitted GenAI Usage in Open-Source SoftwarearXiv:2507.10422 Self-Admitted GenAI Usage in Open-Source Software Tao Xiao, Youmei Fan, Fabio Calefato…

AI繪畫版權問題全解析:你的作品真的屬于你嗎?

AI繪畫版權問題全解析:你的作品真的屬于你嗎? 關鍵詞:AI繪畫、版權歸屬、生成式AI、訓練數據、獨創性、法律合規、知識產權 摘要:當你用MidJourney生成一張“賽博朋克風格的熊貓”,或用Stable Diffusion畫出“梵高筆觸的星空咖啡館”時,你是否想過:這張圖的版權屬于你、…

深入理解Linux文件I/O:系統調用與標志位應用

目錄 一、引入 二、標志位 1、什么是標志位? 2、標志位傳遞示例 輸出結果分析 關鍵點解釋 三、文件描述符(File Descriptor)(先大概了解) 四、接口介紹:open()函數 1、命令查看 2、頭文件 3、函數原型 4、參數說明 …

海康線掃相機通過采集卡的取圖設置

目錄 1、掃描高度小于65000行 1.1 軟觸發 1、采集卡設置項 2、相機設置項 1.2 硬觸發 1、采集卡設置項 2、相機設置項 2、掃描高度大于65000行 1.1 軟觸發 1、采集卡設置項 2、相機設置 1.2 硬觸發 1、采集卡設置項 2、相機設置 2.1 幀掃描 2.2 行掃描 3、注意…

InfluxDB 3與Apache Parquet:打造高性能時序數據存儲與分析解決方案

在當今數據驅動的時代,各行業產生的數據量呈爆炸式增長,如何高效存儲和管理海量數據成為企業和開發者面臨的重大挑戰。對于時序數據而言,其具有數據量大、寫入頻繁、查詢模式多樣等特點,對存儲系統的性能和效率提出了更高的要求。…

20250718-4-Kubernetes 應用程序生命周期管理-Pod對象:實現機制_筆記

一、Pod對象1. 資源共享實現機制1)共享網絡基本概念實現方式:通過將業務容器網絡加入到負責網絡的容器(infra container)實現網絡共享核心特點:共享網絡協議棧(包括TC…

防爆手機是什么?能用普通手機改裝嗎?

在石油開采平臺的井架之上,在化工車間的反應釜旁,在煤礦深達千米的巷道中,一群特殊的工作人員正使用著看似普通的通訊設備。這些設備外殼上醒目的Ex防爆認證標志,揭示著其與眾不同的身份——防爆手機。這類專為易燃易爆環境設計的…

gem install報錯解析

報錯內容 [rootlocalhost ~]# gem install bundler Fetching: bundler-2.6.9.gem (100%) ERROR: Error installing bundler:bundler requires Ruby version > 3.1.0. The current ruby version is 2.5.0.解決方案(任選其一) 這個錯誤表明你當前的 Ru…

css 如何實現大屏4個占位 中屏2個 小屏幕1個

1、 使用grid.container {display: grid;grid-template-columns: repeat(4, 1fr);gap: 20px;border: 1px solid red;width: 400px;height: 400px;}media (max-width: 768px) {.container {grid-template-columns: 1fr;}}media (min-width: 768px) and (max-width: 992px) {.con…

Redis學習系列之—— JDHotKey 熱點緩存探測系統

一、為什么需要熱點緩存探測 在回答這個問題前,我們先考慮一下:為什么光用 Redis 還不夠,還需要使用本地緩存? 一般來說,Redis 集群的性能能抗住幾十萬并發,能夠應付大部分情況。但對于一些頭部 APP&#x…

Linux 安全加固

Linux 安全加固需要從??用戶權限、系統服務、網絡防護、日志審計、文件系統、訪問控制??等多個維度入手,目標是減少攻擊面、限制未授權訪問、提升系統健壯性。以下是??詳細步驟實操示例??,覆蓋主流 Linux 發行版(如 CentOS/Ubuntu&am…

【Docker#2】容器歷史發展 | 虛擬化實現方式

一、前言 – 容器技術發展史 容器技術是現今計算技術的重要組成部分,其發展歷程可以追溯到很早的計算機系統提供的進程隔離工具。以下是容器技術的發展歷程,其中涵蓋了從早期的進程隔離技術到現代云計算和云原生的演變: ① Jail 時代 1979 年…

React + Mermaid 圖表渲染消失問題剖析及 4 種代碼級修復方案

Mermaid 是一個流行的庫&#xff0c;它可以將文本圖表&#xff08;例如 graph LR; A-->B;&#xff09;轉換為 SVG 圖表。在靜態 HTML 頁面中&#xff0c;Mermaid 會查找 <pre class"mermaid"> 代碼塊&#xff0c;并在頁面加載時將它們替換為渲染后的圖表。它…

[Element]修改el-pagination背景色

[Element]修改el-pagination背景色 代碼 <el-pagination:current-page.sync"queryParams.current":page-size.sync"queryParams.size":page-sizes"[10, 20, 50, 100]"layout"prev, pager, next, jumper, sizes":total"queryP…

Docker 可用鏡像列表

Docker 鏡像源列表&#xff08;7月15日更新-長期&免費&#xff09;_dockerhub國內鏡像源列表-CSDN博客

低代碼可視化工作流的系統設計與實現路徑研究

一、背景分析在數字化轉型不斷深化的背景下&#xff0c;企業業務流程呈現出高度定制化與動態調整的趨勢&#xff0c;傳統信息系統在開發周期、實施成本與擴展能力上的局限性日益凸顯&#xff0c;已難以支撐快速響應和敏捷迭代的實際需求。面向這一現實挑戰&#xff0c;基于 BPM…

mac mlx大模型框架的安裝和使用

mlx是apple平臺的大模型推理框架&#xff0c;對mac m1系列處理器支持較好。 這里記錄mlx安裝和運行示例。 1 安裝mlx框架 conda create -n mlx python3.12 conda activate mlx pip install mlx-lm 2 運行mlx測試例 以下是測試程序&#xff0c;使用方法和hf、vllm等推理框架基…

JAVA 使用Apache POI合并Word文檔并保留批注的實現

一、需求背景 在實際工作中&#xff0c;我們經常需要將多個Word文檔合并成一個文件。但當文檔中包含批注&#xff08;Comments&#xff09;時&#xff0c;傳統的復制粘貼會導致批注丟失或引用錯亂。本文將介紹如何通過Java和Apache POI庫實現保留批注及引用關系的文檔合并功能。…

Linux的服務管理工具:`systemd`(`systemctl`)和`SysVinit ` 筆記250718

Linux的服務管理工具:systemd(systemctl)和SysVinit 筆記250718 Linux的服務管理工具 Linux 的服務管理工具隨著發行版和初始化系統的發展而演變。以下是主要的服務管理工具及其對應的初始化系統&#xff1a; 1. systemd (現代主流標準) 初始化系統&#xff1a; 是絕大多數…