单片机实现多线程的方法汇总

在单片机上实现"多线程"的方法有几种,下面按照从简单到复杂、从轻量到系统性来列出常见的方案:


🧵 一、伪多线程(最轻量)

方法:主循环 + 状态机 / 定时器轮询

  • 主循环中轮流调用各个任务的处理函数,每个任务保存自己的状态。

  • 没有真正的上下文切换,适合资源极少的 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,我们可以一起探讨一个适合你的"多线程"实现方式。

相关推荐
叁散4 小时前
实验项目1 RFID 标签实验
单片机·嵌入式硬件
比奇堡派星星8 小时前
MCU 裸机时间片调度系统
单片机·嵌入式硬件
安科瑞刘鸿鹏179 小时前
工业自动化系统中抗晃电保护的协同控制研究
运维·网络·嵌入式硬件·物联网
深圳市方中禾科技10 小时前
LED驱动芯片FZH02,应用开发相关数据技术手册
单片机·嵌入式硬件·led
第二层皮-合肥11 小时前
光耦瞬态响应特性:上升时间与下降时间的测试方法与误差分析
嵌入式硬件
yuanmenghao11 小时前
CAN系列 — (6) CAN FD 带宽、CPU、中断:工程上是如何一起算的?
网络·驱动开发·单片机·mcu·自动驾驶·信息与通信
Arciab14 小时前
51单片机_蜂鸣器
单片机·嵌入式硬件·51单片机
SmartRadio14 小时前
在CH585M代码中如何精细化配置PMU(电源管理单元)和RAM保留
linux·c语言·开发语言·人工智能·单片机·嵌入式硬件·lora
qq_4112624214 小时前
纯图像传感器(只出像素),还是 Himax WiseEye/WE1/WE-I Plus 这类带处理器、能在端侧跑模型并输出“metadata”的模块
人工智能·嵌入式硬件·esp32·四博智联
不脱发的程序猿14 小时前
嵌入式开发中C++内存泄漏的场景与解决办法
单片机·嵌入式硬件·嵌入式