chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RTOS 必學(xué)概念:任務(wù)、信號量、隊列一次搞懂

信盈達(dá) ? 2025-11-17 10:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

如果你剛接觸 RTOS(實時操作系統(tǒng)),很可能會有這樣的困惑:

  • “RTOS 和裸機(jī)程序到底有什么區(qū)別?”
  • “任務(wù)是線程嗎?為什么要分任務(wù)?”
  • 信號量和互斥鎖有什么區(qū)別,不都是同步手段嗎?”
  • “隊列是不是就是一個 FIFO 緩沖區(qū)?”

這些問題聽起來基礎(chǔ),但又總是繞在初學(xué)者腦子里。很多人直接拿 FreeRTOS、RTX 這樣的 RTOS 例程開搞,能跑起來,卻完全沒理解任務(wù)調(diào)度、信號量、隊列的底層邏輯,導(dǎo)致后續(xù)寫項目時 Bug 橫飛,甚至懷疑“RTOS 是不是比裸機(jī)更難用”。

今天我們就來把任務(wù)、信號量、隊列這三個 RTOS 里的必學(xué)概念梳理清楚,并通過對比和例子讓你一次搞懂。


一、為什么需要 RTOS?

在裸機(jī)系統(tǒng)里,程序通常是這樣寫的:

  1. while(1){
  2. read_sensor();
  3. process_data();
  4. send_data();
  5. }

一個大循環(huán),所有邏輯順序執(zhí)行。如果功能簡單,這種模式足夠;但當(dāng)你需要同時處理傳感器采集、串口通信、顯示刷新、按鍵輸入時,問題就來了:

  • 如果某個函數(shù)阻塞太久,其他功能就卡死。
  • 優(yōu)先級無法區(qū)分,緊急任務(wù)(如電機(jī)過流保護(hù))可能沒及時處理。
  • 程序越來越復(fù)雜,大循環(huán)越來越臃腫。

這就是 RTOS 登場的理由。它通過任務(wù)調(diào)度,讓不同功能各自獨立運行,調(diào)度器負(fù)責(zé)根據(jù)優(yōu)先級和時間片切換執(zhí)行,表面上就像“多線程”,雖然 MCU 內(nèi)核本質(zhì)上還是單核順序執(zhí)行。

二、任務(wù)(Task)——RTOS 的基本單位

在 RTOS 里,任務(wù)(Task/Thread)就像是獨立的小程序,它有自己的堆棧、上下文,可以隨時被掛起或切換。

比如我們把系統(tǒng)功能拆成幾個任務(wù):

  • Task_Sensor: 負(fù)責(zé)傳感器采集
  • Task_Comm: 負(fù)責(zé)通信協(xié)議
  • Task_Display: 負(fù)責(zé)屏幕刷新
  • Task_Protect: 負(fù)責(zé)電機(jī)保護(hù)

這樣做的好處是:邏輯隔離,每個功能都在自己任務(wù)里,不會互相干擾。

在 FreeRTOS 中,創(chuàng)建一個任務(wù)的代碼大概是這樣的:

  1. xTaskCreate(Task_Sensor,"Sensor",256,NULL,2,NULL);
  2. xTaskCreate(Task_Comm,"Comm",256,NULL,3,NULL);

其中最后一個數(shù)字就是優(yōu)先級。RTOS 調(diào)度器會始終運行就緒狀態(tài)下的最高優(yōu)先級任務(wù)。

但要注意:任務(wù)不是越多越好。任務(wù)調(diào)度需要消耗時間和內(nèi)存,過多任務(wù)會帶來切換開銷,甚至造成“任務(wù)優(yōu)先級反轉(zhuǎn)”的問題(后面說信號量時會展開)。


三、信號量(Semaphore)——任務(wù)之間的協(xié)調(diào)工具

當(dāng)多個任務(wù)需要共享同一個資源時,就會發(fā)生沖突。例如:

  • Task_CommTask_Display同時想往 UART 發(fā)送數(shù)據(jù)。
  • Task_Sensor需要的 ADC 數(shù)據(jù)正在被Task_Calibration使用。

如果不加控制,兩個任務(wù)會“打架”。這時就需要信號量來實現(xiàn)任務(wù)間的同步與互斥。

常見的信號量有兩種:

1、二值信號量(Binary Semaphore)

  • 值只有 0 和 1,用來實現(xiàn)“占用/釋放”。
  • 類似于“門鑰匙”:誰拿到誰進(jìn),出來要歸還。

2、計數(shù)信號量(Counting Semaphore)

  • 值可以大于 1,適合用于資源池。
  • 例如有 3 個緩沖區(qū),最多允許 3 個任務(wù)同時使用。

在 FreeRTOS 里,創(chuàng)建和使用信號量的代碼大概是:

  1. SemaphoreHandle_txSemaphore=xSemaphoreCreateBinary();
  2. if(xSemaphoreTake(xSemaphore,portMAX_DELAY)){
  3. // 獲取到信號量,安全訪問資源
  4. UART_Send(data);
  5. xSemaphoreGive(xSemaphore);// 釋放
  6. }

需要注意:信號量不是數(shù)據(jù)傳遞工具,它只解決“誰先用”的問題。

四、隊列(Queue)——任務(wù)間的數(shù)據(jù)通道

如果說信號量是用來“協(xié)調(diào)資源”,那么隊列就是用來“傳遞數(shù)據(jù)”。

舉個例子:

  • Task_Sensor采集到溫度數(shù)據(jù) 25℃,需要傳給Task_Comm發(fā)送到上位機(jī)。
  • Task_Comm不能直接去讀傳感器,因為那是Task_Sensor的職責(zé)。

解決辦法就是:Task_Sensor把數(shù)據(jù)放進(jìn)隊列,Task_Comm從隊列里取出來。

  1. QueueHandle_txQueue=xQueueCreate(10,sizeof(int));
  2. voidTask_Sensor(void*pvParameters){
  3. inttemp=ReadTemp();
  4. xQueueSend(xQueue,&temp,0);
  5. }
  6. voidTask_Comm(void*pvParameters){
  7. inttemp;
  8. if(xQueueReceive(xQueue,&temp,portMAX_DELAY)){
  9. UART_Send(temp);
  10. }
  11. }

這樣兩個任務(wù)就解耦了:一個只管“生產(chǎn)數(shù)據(jù)”,一個只管“消費數(shù)據(jù)”。

隊列還有一個好處:可以緩存數(shù)據(jù),避免丟失。比如傳感器每 10ms 產(chǎn)生一次數(shù)據(jù),而通信任務(wù)可能要等到 100ms 才空閑,隊列可以起到“緩沖區(qū)”的作用。

五、任務(wù) + 信號量 + 隊列:三者如何配合?

在實際系統(tǒng)里,這三者往往要一起使用。比如一個智能家居網(wǎng)關(guān):

1、任務(wù)劃分

  • Task_Network負(fù)責(zé) WiFi 連接
  • Task_Sensor負(fù)責(zé)數(shù)據(jù)采集
  • Task_Comm負(fù)責(zé)和手機(jī) APP 通信

2、信號量的作用

  • Task_CommTask_Network都要用到 UART,必須加信號量保護(hù)。

3、隊列的作用

  • Task_Sensor把采集的數(shù)據(jù)丟到隊列里,Task_Comm從隊列里拿出來發(fā)給手機(jī)。

最終系統(tǒng)就像流水線一樣:

  • 隊列解決“數(shù)據(jù)怎么流動”;
  • 信號量解決“資源怎么共享”;
  • 任務(wù)解決“邏輯怎么拆分”。

六、常見誤區(qū)與思考

1、誤區(qū):任務(wù)越多系統(tǒng)越高效

  • 實際上任務(wù)太多會增加調(diào)度開銷,還會導(dǎo)致優(yōu)先級反轉(zhuǎn)。正確做法是合理劃分任務(wù),能用狀態(tài)機(jī)解決的場景不必創(chuàng)建任務(wù)。

2、誤區(qū):信號量可以傳數(shù)據(jù)

  • 信號量只有“有/無”的信息,本質(zhì)上是控制權(quán),而不是數(shù)據(jù)傳輸工具。傳數(shù)據(jù)應(yīng)該用隊列。

3、誤區(qū):隊列容量開得越大越好

  • 隊列需要內(nèi)存,MCU 內(nèi)存有限。更大的容量并不意味著更高效,而是要根據(jù)數(shù)據(jù)產(chǎn)生與消費的速率來設(shè)計。

七、總結(jié)

學(xué)習(xí) RTOS,最重要的是搞清楚任務(wù)、信號量、隊列這三個核心概念:

  • 任務(wù):功能劃分的基本單元,讓不同邏輯獨立運行。
  • 信號量:任務(wù)間的協(xié)調(diào)工具,避免資源沖突。
  • 隊列:任務(wù)間的數(shù)據(jù)通道,實現(xiàn)生產(chǎn)者-消費者模型。

當(dāng)你理解了這三者的關(guān)系,再去看 FreeRTOS、RTX 的例程,就不會覺得“黑盒子一樣”。寫項目時,也能更從容地選擇用狀態(tài)機(jī)還是任務(wù),用信號量還是隊列。

RTOS 的世界不復(fù)雜,復(fù)雜的是我們一開始沒抓住重點。掌握了這些核心機(jī)制,你會發(fā)現(xiàn) RTOS 不僅不是負(fù)擔(dān),反而讓代碼更清晰、系統(tǒng)更可靠。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7395

    瀏覽量

    129219
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    866

    瀏覽量

    122898
  • 裸機(jī)
    +關(guān)注

    關(guān)注

    0

    文章

    42

    瀏覽量

    6947
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    RTOS信號量、隊列通信原理

    有深入理解RTOS原理,或閱讀過RTOS源碼的同學(xué)應(yīng)該知道:RTOS實現(xiàn)任務(wù)間通信通常是由系列指針進(jìn)行操作實現(xiàn)的。
    發(fā)表于 08-16 10:07 ?2198次閱讀

    FreeRTOS信號量使用教程

    信號量是操作系統(tǒng)中重要的部分,信號量般用來進(jìn)行資源管理和任務(wù)同步, FreeRTOS中信號量
    的頭像 發(fā)表于 12-19 09:22 ?4359次閱讀
    FreeRTOS<b class='flag-5'>信號量</b>使用教程

    FreeRTOS信號量的使用與實例

    在嵌入式系統(tǒng)中,任務(wù)管理是個重要的部分,它涉及到任務(wù)之間的通信和同步,信號量隊列,互斥鎖和事件標(biāo)志組等
    的頭像 發(fā)表于 12-12 15:25 ?4295次閱讀

    轉(zhuǎn):第24章 FreeRTOS任務(wù)計數(shù)信號量

    本章節(jié)為大家講解FreeRTOS計數(shù)信號量的另種實現(xiàn)方式----基于任務(wù)通知(Task Notifications)的計數(shù)信號量,這里我們將這種方式實現(xiàn)的計數(shù)
    發(fā)表于 09-07 06:43

    請問使用郵箱、消息隊列、信號量進(jìn)行任務(wù)間通信時任務(wù)之間的切換要考慮優(yōu)先級嗎?

    使用郵箱、消息隊列信號量進(jìn)行任務(wù)間通信時,任務(wù)之間的切換(在釋放信號量任務(wù)、請求
    發(fā)表于 04-22 06:14

    FreeRTOS隊列信號量是干什么用的?

    1.最近在學(xué)習(xí)FreeRTOS(stm32下),雖然好像知道了隊列信號量是用來做任務(wù)之間的通信的,但是不太理解為什么要用這些東西,我覺得好像用rtos
    發(fā)表于 08-05 02:57

    信號量的作用與分類

    其他任務(wù)就無法獲取了!遞歸互斥除外!信號量的分類信號量作用計數(shù)信號量判斷是信號量是否為空,就是獲取和釋放是不是相等二值
    發(fā)表于 08-24 06:13

    新手請教信號量概念問題

    請教信號量概念問題. 我準(zhǔn)備用信號量來編寫個ARM程序,但我沒有完全理解信號量概念.例如:
    發(fā)表于 02-27 11:15

    消息隊列理解為任務(wù)之間互相傳遞的參數(shù),但信號量怎樣理解呢

    請教:在 rtos51 解釋的概念里的"信號量"比較難懂,"消息隊列"可以理解為任務(wù)之間互相傳遞的參數(shù),但"
    發(fā)表于 02-28 14:17

    詳解互斥信號量概念和運行

    1 、互 斥 信 號 1.1 互斥信號量概念及其作用 互斥信號量的主要作用是對資源實現(xiàn)互斥訪問,使用二值信號量也可以實現(xiàn)互斥訪問的功能
    的頭像 發(fā)表于 10-22 11:57 ?1.3w次閱讀
    詳解互斥<b class='flag-5'>信號量</b>的<b class='flag-5'>概念</b>和運行

    Linux信號量(2):POSIX 信號量

    (Inter-Process Communication) 機(jī)制之,3 種 IPC 機(jī)制源于 POSIX.1 的實時擴(kuò)展。Single UNIX Specification 將 3 種機(jī)制(消息隊列,信號量和共享
    的頭像 發(fā)表于 10-29 17:34 ?1284次閱讀

    FreeRTOS 隊列 信號量 互斥

    文章目錄前言Queue 隊列semaphore 信號量Mutex 互斥微信公眾號前言FreeRTOS STM32CubeMX配置 內(nèi)存管理 任務(wù)管理上節(jié)介紹了用STM32CubeMX
    發(fā)表于 12-09 09:51 ?0次下載
    FreeRTOS <b class='flag-5'>隊列</b> <b class='flag-5'>信號量</b> 互斥<b class='flag-5'>量</b>

    使用二進(jìn)制信號量取代任務(wù)通知

    二進(jìn)制信號量只有0和1,兩個任務(wù)公用信號量,任務(wù)用于產(chǎn)生
    的頭像 發(fā)表于 09-15 09:22 ?1387次閱讀

    FreeRTOS的二值信號量

    FreeRTOS中的信號量任務(wù)間通信的方式,信號量包括:二值信號量、互斥信號量、計數(shù)
    的頭像 發(fā)表于 02-10 15:07 ?2523次閱讀

    Free RTOS的互斥信號量

    二進(jìn)制信號量和互斥非常相似,但確實有些細(xì)微的區(qū)別。互斥體包含優(yōu)先級繼承機(jī)制,而二進(jìn)制信號量沒有。這使得二進(jìn)制信號量成為實現(xiàn)同步(
    的頭像 發(fā)表于 02-10 15:36 ?2166次閱讀
    Free <b class='flag-5'>RTOS</b>的互斥<b class='flag-5'>信號量</b>