單片機實現多線程的方法匯總

在單片機上實現“多線程”的方法有幾種,下面按照從簡單到復雜、從輕量到系統性來列出常見的方案:


🧵 一、偽多線程(最輕量)

方法:主循環 + 狀態機 / 定時器輪詢

  • 主循環中輪流調用各個任務的處理函數,每個任務保存自己的狀態。

  • 沒有真正的上下文切換,適合資源極少的 8/16 位 MCU。

  • 每個任務必須是“非阻塞”的,不能使用 delay

while (1) {task1();task2();task3();
}

優點:

  • 簡單、高效、占用資源極少。

  • 不需要堆棧切換,不需要操作系統。

缺點:

  • 不是真正的多線程,不能處理阻塞任務。


🕒 二、基于中斷的任務分發

方法:中斷觸發事件 + 主循環消費

  • 中斷中設置標志或將事件放入隊列;

  • 主循環中根據事件執行任務處理。

volatile int flag = 0;void USART_IRQHandler() {flag = 1;
}int main() {while (1) {if (flag) {handle_uart();flag = 0;}}
}

優點:

  • 響應快,適合 IO 驅動型任務。

  • 不涉及線程切換和堆棧管理。

缺點:

  • 中斷中不能做太多事,邏輯要分拆。


🧠 三、協程(Coroutine)

方法:使用 switchDuff's device 實現偽線程

  • 基于狀態保存和跳轉的方式,實現類似線程掛起和恢復的機制。

  • 只使用一個棧,代碼結構像線程。

#define crBegin static int state=0; switch(state) { case 0:
#define crReturn(x) do { state=__LINE__; return x; case __LINE__:; } while (0)
#define crEnd }int task() {crBegin;crReturn(1);crReturn(2);crEnd;
}

優點:

  • 沒有線程上下文切換。

  • 寫法更接近同步邏輯。

缺點:

  • 不是真正的線程,不支持阻塞等待。


🧵 四、基于 RTOS(真正多線程)

方法:使用輕量級操作系統(如 FreeRTOS、RT-Thread)

  • 每個線程有獨立棧空間;

  • 內核實現任務調度、搶占式多任務;

  • 支持優先級、信號量、消息隊列、互斥鎖等。

void task1(void *arg) {while (1) {do_something();vTaskDelay(1000);}
}
xTaskCreate(task1, "T1", 128, NULL, 1, NULL);

優點:

  • 真正多線程,支持阻塞、同步。

  • 易于模塊化和擴展。

缺點:

  • 占用資源高(Flash/RAM)、上手略有門檻。

  • 對調度和資源管理有更高要求。


🛠 五、軟調度器(TinyOS、protothread等)

方法:輕量調度框架(介于 FSM 和 RTOS 之間)

  • 有些庫如 protothread,用極少資源實現多任務編排;

  • 適合資源受限又希望更接近線程體驗的項目。


總結表格:

方法是否真多線程RAM占用復雜度是否阻塞推薦場景
主循環 + FSM資源極少,超低功耗
中斷觸發IO驅動系統
協程寫法優雅但簡單任務
RTOS中~高任務多、同步復雜
輕量調度器部分支持資源受限但邏輯復雜

評論中告訴我你用的是哪種 MCU,我們可以一起探討一個適合你的“多線程”實現方式。

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

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

相關文章

網絡:華為數通HCIA學習:靜態路由基礎

文章目錄 前言靜態路由基礎靜態路由應用場景 靜態路由配置靜態路由在串行網絡的配置靜態路由在以太網中的配置 負載分擔配置驗證 路由備份(浮動靜態路由)配置驗證 缺省路由配置驗證 總結 華為HCIA 基礎實驗-靜態路由 & eNSP靜態路由 基礎…

[項目總結] 在線OJ刷題系統項目技術應用(下)

🌸個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵?熱門專欄: 🧊 Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection與…

Qt音頻輸出:QAudioOutput詳解與示例

1. 簡介 QAudioOutput是Qt多媒體框架中的一個關鍵類,它提供了將PCM(脈沖編碼調制)原始音頻數據發送到音頻輸出設備的接口。作為Qt多媒體組件的一部分,QAudioOutput允許開發者在應用程序中實現音頻播放功能,支持多種音…

【計算機網絡】Linux配置SNAT/DNAT策略

什么是NAT? NAT 全稱是 Network Address Translation(網絡地址轉換),是一個用來在多個設備共享一個公網 IP上網的技術。 NAT 的核心作用:將一個網絡中的私有 IP 地址,轉換為公網 IP 地址,從而…

Redis淘汰策略詳解!

目錄 一、為什么需要淘汰策略? 🤔二、Redis 的淘汰策略詳解 👇三、如何選擇合適的淘汰策略? 🤔???四、如何切換 Redis 的淘汰策略? ??🔧五、總結 🎉 🌟我的其他文章…

存儲基石:深度解讀Linux磁盤管理機制與文件系統實戰

Linux系列 文章目錄 Linux系列前言一、磁盤1.1 初識磁盤1.2 磁盤的物理結構1.3 磁盤的存儲結構1.4 磁盤的邏輯結構 二、文件系統2.1 系統對磁盤的管理2.2 文件在磁盤中的操作 前言 Linux 文件系統是操作系統中用于管理和組織存儲設備(如硬盤、SSD、USB 等&#xff…

本節課課堂總結

匿名子類: 說明 和 Java 一樣,可以通過包含帶有定義或重寫的代碼塊的方式創建一個匿名的子類。 單例對象(伴生對象) Scala語言是完全面向對象的語言,所以并沒有靜態的操作(即在Scala中沒有靜態的概念&a…

I2C、SPI、UART、CAN 通信協議詳解

一、協議基本特性對比 特性ICSPIUARTCAN通信類型同步、半雙工同步、全雙工異步、全雙工異步、多主多從信號線SDA(數據)、SCL(時鐘)MOSI、MISO、SCK、SS(片選)TX(發送)、RX&#xff…

【diffusers 進階(十五)】dataset 工具,Parquet和Arrow 數據文件格式,load dataset 方法

系列文章目錄 【diffusers 極速入門(一)】pipeline 實際調用的是什么? call 方法!【diffusers 極速入門(二)】如何得到擴散去噪的中間結果?Pipeline callbacks 管道回調函數【diffusers極速入門&#xff0…

第十三章:持久化存儲_《鳳凰架構:構建可靠的大型分布式系統》

第十三章 持久化存儲 一、Kubernetes存儲設計核心概念 (1)存儲抽象模型 PersistentVolume (PV):集群級別的存儲資源抽象(如NFS卷/云存儲盤)PersistentVolumeClaim (PVC):用戶對存儲資源的聲明請求&#…

以太網安全

前言: 端口隔離可實現同一VLAN內端口之間的隔離。用戶只需要將端口加入到隔離組中,就可以實現隔離組內端口之間的二層數據的隔離端口安全是一種在交換機接入層實施的安全機制,旨在通過控制端口的MAC地址學習行為,確保僅授權設備能…

跨域問題前端解決

由于瀏覽器的同源策略,前后端分離的項目,調試的時候總是會遇到跨域的問題,這里通過修改前端代碼解決跨域問題。 首先先查看前端代碼的根目錄下,有沒有vue.config.js文件, 若有,使用方法1,若沒有此文件&…

Elasticsearch 報錯index_closed_exception

index_closed_exception 是 Elasticsearch 中的一個異常類型,它通常發生在嘗試對一個已經被關閉(closed)的索引執行搜索、寫入或其他操作時。在 Elasticsearch 中,索引是用來存儲和檢索數據的邏輯命名空間,可以將其類比…

LearnOpenGL-筆記-其九

今天讓我們完結高級OpenGL的部分: Instancing 很多時候,在場景中包含有大量實例的時候,光是調用GPU的繪制函數這個過程都會帶來非常大的開銷,因此我們需要想辦法在每一次調用GPU的繪制函數時盡可能多地繪制,這個過程就…

PDF預覽-搜索并高亮文本

在PDF.js中實現搜索高亮功能可以通過自定義一些代碼來實現。PDF.js 是一個通用的、基于Web的PDF閱讀器,它允許你在網頁上嵌入PDF文件,并提供基本的閱讀功能。要實現搜索并高亮顯示文本,你可以通過以下幾個步驟來完成: 1. 引入PDF…

二叉樹——隊列bfs專題

1.N叉樹的層序遍歷 我們之前遇到過二叉樹的層序遍歷,只需要用隊列先進先出的特性就可以達到層序遍歷的目的。 而這里不是二叉樹,也就是說讓節點的孩子入隊列時不僅僅是左右孩子了,而是它的所有孩子。而我們看這棵多叉樹的構造,它…

Python高級爬蟲之JS逆向+安卓逆向1.1節-搭建Python開發環境

目錄 引言: 1.1.1 為什么要安裝Python? 1.1.2 下載Python解釋器 1.1.3 安裝Python解釋器 1.1.4 測試是否安裝成功 1.1.5 跟大神學高級爬蟲安卓逆向 引言: 大神薯條老師的高級爬蟲安卓逆向教程: 這套爬蟲教程會系統講解爬蟲的初級&…

Windows 安裝和使用 ElasticSearch

SpringBoot3 整合 Elasticsearch 1. ElasticSearch 1.1 ES (1)ES 是一個開源的分布式搜索和分析引擎,專為處理大模型數據而設計,它能夠實現近乎實時的數據檢索、分析和可視化,廣泛用于全文搜索、日志分析和監控&…

matplotlib初探

庫引入 import matplotlib.pyplot as pltpyplot.figure 創建新圖形或激活現有圖形

NVM 多版本Node.js 管理全指南(Windows系統)

🧑 博主簡介:CSDN博客專家、全棧領域優質創作者、高級開發工程師、高級信息系統項目管理師、系統架構師,數學與應用數學專業,10年以上多種混合語言開發經驗,從事DICOM醫學影像開發領域多年,熟悉DICOM協議及…