当前位置: 首页 > news >正文

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

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


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

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

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

  • 没有真正的上下文切换,适合资源极少的 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.dtcms.com/a/113142.html

相关文章:

  • 为招聘推荐系统进行相应修改的 Python 实现方案(含协同过滤推荐算法)
  • 【Vue】 核心特性实战解析:computed、watch、条件渲染与列表渲染
  • deepseek回答ollama 下载模型的命令
  • 04.游戏开发-unity编辑器详细-工具栏、菜单栏、工作识图详解
  • 某碰瓷国赛美赛,号称第三赛事的数模竞赛
  • SQLmap工具使用
  • 详解 MySQL 三层 B+ 树能存多少数据的计算方法
  • 中国移动启动数字乡村“五新升级”:年底前,行政村5G覆盖达95%
  • 【leetcode】记录与查找:哈希表的题型分析
  • MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略
  • 群体智能避障革命:RVO算法在Unity中的深度实践与优化
  • 小刚说C语言刷题——第15讲 多分支结构
  • 紫檀博物馆一游与软件开发
  • Kerberos协议详解
  • 基于 Netty 框架的 Java TCP 服务器端实现,用于启动一个 TCP 服务器来处理客户端的连接和数据传输
  • FPGA实现按键切换流水灯不同亮灭模式
  • 【FPGA开发】利用状态机思想点亮流水灯/初学hdlbitsFPGA教程网站
  • P9752 [CSP-S 2023] 密码锁题解
  • CNN 里面能自然起到防止过拟合的办法
  • 推荐系统(二十二):基于MaskNet和WideDeep的商品推荐CTR模型实现
  • 基于大模型的重症肌无力的全周期手术管理技术方案
  • Mydumper备份数据库
  • 操作系统内存管理
  • 深入解析 RocketMQ 中的 BrokerOuterAPI 组件​
  • 使用VSCode编写C#程序
  • 低代码开发平台:飞帆中新增控件、修改他人控件
  • Python实现NOA星雀优化算法优化LightGBM分类模型项目实战
  • PyTorch中的Flatten
  • 【学习笔记】Transformers源码分析
  • LeetCode 2442:统计反转后的不同整数数量