FreeRTOS 中主函數 while 循環與任務創建的緊密聯系

FreeRTOS 中主函數 while 循環與任務創建的緊密聯系

在嵌入式開發領域,FreeRTOS 是一款被廣泛應用的輕量級實時操作系統,為開發者提供了高效的多任務調度機制。對于初學者來說,理解主函數中的 while 循環與通過 xTaskCreate 創建的任務之間的關系,是掌握 FreeRTOS 系統架構的關鍵一步。

主函數中的 while 循環

在基于 FreeRTOS 的 STM32 應用程序中,主函數中包含一個獨特的 while 循環,其功能與傳統的程序主循環有所不同。它的主要職責是在系統啟動階段完成硬件初始化和任務創建操作。

int main(void)
{// 硬件初始化(時鐘、GPIO、外設等)// 創建任務xTaskCreate(Task1, "Task 1", 1000, NULL, 1, NULL);xTaskCreate(Task2, "Task 2", 1000, NULL, 1, NULL);// 啟動調度器vTaskStartScheduler(); // 從這里開始,RTOS開始調度任務// 如果調度器啟動失敗(通常不會發生),進入死循環while (1){}
}

在調用 vTaskStartScheduler() 啟動調度器之前,這個循環確保了硬件資源得到正確配置,為后續任務的運行提供了必要的物理環境。例如,對時鐘系統的配置決定了整個系統的運行速度,GPIO 的初始化則為與外部設備的數據交互做好準備。

系統運行正常時,一旦調度器成功啟動,主函數中的 while 循環就不再對任務調度產生直接影響。它僅作為一個后備機制存在,以防調度器啟動失敗,避免程序出現未定義行為,確保系統穩定運行。

xTaskCreate 與任務創建

xTaskCreate 是 FreeRTOS 提供的關鍵 API,用于將用戶定義的任務函數及其相關配置整合到系統中。

xTaskCreate(Task1, "Task 1", 1000, NULL, 1, NULL);
  • Task1 是用戶定義的任務函數,包含該任務的具體執行邏輯。
  • “Task 1” 為任務名稱,便于調試時識別。
  • 1000 表示分配給該任務的堆棧大小,單位通常是字。
  • 1 是任務優先級,優先級數值越小,任務優先級越高。
  • 第四個參數 NULL 可用于傳遞任務函數的參數。
  • 最后一個參數 NULL 用于返回任務句柄,方便后續對任務的操作。

當 xTaskCreate 被調用時,它會將任務添加到 FreeRTOS 的任務就緒隊列中。調度器啟動后,FreeRTOS 內核會根據任務優先級和調度策略(默認為可搶占式優先級調度算法)選擇任務執行。優先級高的任務會優先獲得 CPU 資源,確保系統的實時性和可靠性。

主函數 while 循環與任務的關系

主函數中的 while 循環與通過 xTaskCreate 創建的任務之間存在著緊密的協作關系。

時間順序關系

在程序啟動的早期階段,主函數中的 while 循環先執行,完成硬件初始化和任務創建操作。這些任務在主函數的 while 循環之外創建,充分利用了主函數的執行流,確保任務在調度器啟動前被注冊到系統中。

功能分工關系

  • 主函數 while 循環:它為系統的啟動提供必要的前期準備工作環境和調度器啟動的觸發機制。在其運行期間,主要負責硬件資源的配置和任務的注冊,為后續任務的調度和執行奠定了基礎。
  • xTaskCreate 創建的任務:一旦調度器啟動,任務調度權就交由 FreeRTOS 內核管理。各個任務依據自身優先級和調度策略,在適當的時機被執行,實現了系統的多任務并行處理和實時響應。

調度權交接關系

調用 vTaskStartScheduler() 是調度權交接的關鍵節點。在此之前,主函數的 while 循環控制著程序的執行流程;在此之后,FreeRTOS 內核接管任務調度,主函數的 while 循環不再參與任務的調度決策。

總結

在 FreeRTOS 中,主函數中的 while 循環與通過 xTaskCreate 創建的任務相互配合,共同推動系統的啟動和運行。主函數的 while 循環在前期完成硬件初始化和任務創建,為調度器的啟動做好準備工作。而 xTaskCreate 創建的任務則在調度器啟動后,按照設定的優先級和調度策略,由 FreeRTOS 內核進行調度和執行,實現系統的多任務并行處理和實時響應。

理解這種關系對于深入掌握 FreeRTOS 的系統架構和任務調度機制至關重要。只有清晰地認識到主函數和任務之間的分工與協作,才能更好地設計和優化基于 FreeRTOS 的嵌入式應用程序,充分發揮其在實時性、可靠性和資源利用率方面的優勢。

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

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

相關文章

Flutter基礎(前端教程⑦-Http和卡片)

1. 假設后端返回的數據格式{"code": 200,"data": [{"name": "張三","age": 25,"email": "zhangsanexample.com","avatar": "https://picsum.photos/200/200?random1","statu…

pytorch chunk 切塊

目錄 chunk切塊 chunk???????切塊 import torch# 創建一個形狀為 [2, 3, 4] 的張量 x torch.arange(6).reshape(2, 3) print("原始張量形狀:", x.shape) print("x:", x) # 輸出: 原始張量形狀: torch.Size([2, 3, 4])# 沿著最后一個維度分割成 2 …

PCIe基礎知識之Linux內核中PCIe子系統的架構

5.1 先驗知識 驅動模型:Linux建立了一個統一的設備模型,分別采用總線、設備、驅動三者進行抽象,其中設備和驅動均掛載在總線上面,當有新的設備注冊或者新的驅動注冊的時候,總線會進行匹配操作(match函數),…

2.2 TF-A在ARM生態系統中的角色

目錄2.2.1 作為ARM安全架構的參考實現2.2.2 與ARM處理器內核的協同關系2.2.3 在啟動鏈中的核心地位2.2.4 與上下游軟件的關系與底層固件的協作與上層軟件的接口2.2.5 在ARM生態系統中的標準化作用2.2.6 典型應用場景2.2.1 作為ARM安全架構的參考實現 TF-A(Trusted …

Chrome 開發者警告:`DELETE err_empty_response` 是什么?jQuery AJAX 如何應對?

在Web開發的世界里,我們時常會遇到各種各樣的錯誤信息,它們像一個個謎語,等待我們去破解。今天我們要聊的這個錯誤——DELETE err_empty_response,尤其是在使用 jQuery 的 $.ajax 發送 DELETE 請求時遇到,確實讓人頭疼。它意味著瀏覽器嘗試刪除某個資源,卻收到了一個空蕩…

python作業 1

1.技術面試題 (1)TCP與UDP的區別是什么? 答: TCP建立通信前有三次握手,結束通信后有四次揮手,數據傳輸的可靠性高但效率較低;UDP不需要三次握手就可傳輸數據,數據傳輸完成后也不需要…

centos7 java多版本切換

文章目錄前言一、卸載原來的jdk二、下載jdk三、解壓jdk三、配置環境變量四、切換JAVA環境變量前言 本來是為了安裝jenkins,安裝了對應的java,node,maven,git等環境,然后運行jenkins時候下載插件總是報錯,我下載的jenkins是 2.346.1 版本&…

用Python和OpenCV從零搭建一個完整的雙目視覺系統(四)

本系列文章旨在系統性地闡述如何利用 Python 與 OpenCV 庫,從零開始構建一個完整的雙目立體視覺系統。 本項目github地址:https://github.com/present-cjn/stereo-vision-python.git 在上一篇文章中,我們完成了相機標定這一最關鍵的基礎步驟…

STM32-中斷

中斷分為兩路:12345用于產生中斷;678產生事件外設為NVIC設計流程:使能外設中斷設置中斷優先級分組初始化結構體編寫中斷服務函數初始化結構體:typedef struct {uint8_t NVIC_IRQChannel; 指定要使能或禁用的中斷通道例如: TIM3_I…

Shader面試題100道之(61-80)

Shader面試題(第61-80題) 以下是第61到第80道Shader相關的面試題及答案: 61. 什么是UV展開?它在Shader中有什么作用? UV展開是將3D模型表面映射到2D紋理空間的過程,用于定義紋理如何貼合模型。在Shader中&a…

C#基礎:Winform桌面開發中窗體之間的數據傳遞

1.主窗體using System; using System.Windows.Forms;public partial class MainForm : Form {public MainForm(){InitializeComponent();}// 打開二級窗體private void btnOpenSecondaryForm_Click(object sender, EventArgs e){// 創建二級窗體并訂閱事件SecondaryForm second…

工程改Mvvm

導入CommunityToolKit vs2017只能導入7 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input;namespace WpfApp1.vi…

【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 動態修改編譯配置

目錄 1 -> 通過hook以及插件上下文實現動態配置 2 -> 在hvigorfile.ts中通過overrides關鍵字導出動態配置 3 -> 通過hook以及插件上下文動態配置構建配置 3.1 -> 修改每個hvigorNode中的build-profile.json5 3.2 -> 修改module.json5中的配置信息 3.3 -&g…

Android View事件分發機制詳解

Android 的 View 事件分發機制是處理用戶觸摸(Touch)事件的核心流程,它決定了觸摸事件如何從系統傳遞到具體的 View 并被消費。理解這個機制對于處理復雜的觸摸交互、解決滑動沖突至關重要。 核心思想:責任鏈模式 事件分發遵循一個…

【CMake】自定義package并通過find_package找到

在一些場景下我們需要編寫一些庫,并希望其他程序可以找到這些庫并引用。 CMake采用package這個概念來解決這個問題。 關于CMake的find_package文章有很多,但這些文章的內容大多不直觀講了一堆講不到點子上,讓人看了一頭霧水。因此我想通過本文…

【MATLAB例程】AOA與TDOA混合定位例程,適用于二維環境、3個錨點的定位|附代碼下載鏈接

本 MATLAB 程序實現了基于 Angle of Arrival (AOA) 與 Time Difference of Arrival (TDOA) 的二維定位方法,通過自適應融合與最小二乘優化,實現對未知目標的高精度估計。本例中固定使用了 3 個基站(錨點),算法框架支持…

磐維數據庫panweidb集中式集群配置VIP【添加、刪除和修改】

0 說明 panweidb集中式集群為了防止主備切換后應用連接無法切換到新主庫,需要配置vip,應用可以只通過該ip與數據庫連接,不用感知數據庫在哪個節點上。 panweidb中配置 VIP主要依賴 CM 組件的 VIP 仲裁功能,通過回調腳本在主備切換…

python的保險業務管理與數據分析系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具:Navicat/SQLyog等都可以 保險行業…

R語言如何接入實時行情接口

目錄 1. 安裝必要的R包 2. 導入庫 3. 連接WebSocket 4. 處理連接成功后的操作 5. 處理接收到的消息 6. 處理連接關閉和錯誤 7. 發送心跳數據 8. 自動重連機制 9. 啟動連接和重連 總結 在數據分析和金融研究中,實時行情數據的獲取至關重要,但市…

Redis數據安全性分析

Redis高可用與數據安全機制深度解析前置知識:Redis基礎安裝與使用(主從復制、哨兵集群、Cluster集群搭建)一、Redis性能壓測工具 工具名稱:redis-benchmark核心作用:快速基準測試Redis性能使用場景:評估不同…