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

news2025/4/7 21:53:42

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


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

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

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

  • 没有真正的上下文切换,适合资源极少的 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.coloradmin.cn/o/2330077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java八股文-List集合

集合的底层是否加锁也就代表是否线程安全 (一)List集合 一、数组 array[1]是如何通过索引找到堆内存中对应的这块数据的呢? (1)数组如何获取其他元素的地址值 (2)为什么数组的索引是从0开始的,不可以从1开始吗 (3)操作数组的时间复杂度 ①查找 根据索引查询 未…

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.2.3行业案例:智能客服中的图文交互系统

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第四部分:工程实践与部署4.2.3 行业案例:智能客服中的图文交互系统1. 图文交互系统的核心挑战与价值2. 系统架构设计2.1 分层架构2.2 Adapter技术应用3. 行业应用案例…

华为IP(4)

VRRP(虚拟路由冗余协议) 前言: 局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络,如果默认网关设备发生故障,那么所有用户终端访问外部网络的流量将会中断。可以通过部署多个网关的方式来解决单点故障…

计算机网络中科大 - 第1章 结构化笔记(详细解析)

博主主页 目录 **1. 计算机网络概述****1.1 计算机网络的定义****1.2 计算机网络的发展** **2. 计算机网络的组成与分类****2.1 计算机网络的组成****2.2 计算机网络的分类****按地理范围****按拓扑结构****按交换方式** **3. 计算机网络的性能指标****4. 计算机网络体系结构**…

【神经网络】python实现神经网络(三)——正向学习的模拟演练

有了之前的经验(【神经网络】python实现神经网络(二)——正向推理的模拟演练),我们继续来介绍如何正向训练神经网络中的超参(包含权重以及偏置),本章大致的流程图如下: 一.损失函数 神经网络以某个指标为基准寻求最优权重参数,而这个指标即可称之为 “损失函数” 。(…

PPTAgent:一款开源免费生成和评估幻灯片的项目

这篇文章介绍一下PPTAgent,一个从文档自动生成演示文稿的创新系统。该系统从人类的展示创作方法中汲取灵感,采用两步流程来确保卓越的整体质量。此外,本文还介绍了PPTEval,这是一个综合评估框架,可以跨多个维度评估演示…

Java 大视界 -- Java 大数据在智能供应链库存优化与成本控制中的应用策略(172)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

斯坦福大学李飞飞团队新突破!FlowMo 革新图像 Tokenizer

当我们悠然刷着手机,看到一张可爱猫咪的照片时,大脑会瞬间识别出「这是一只猫」,这一切不过是电光火石间的事儿。但在计算机的 “眼中”,情况却复杂得超乎想象。假设这是一张10001000像素的彩色照片,在计算机的世界里&…

博客文章:深入分析 PyMovie - 基于 Python和 MoviePy 的视频管理工具

这是一个使用 wxPython 构建界面、moviepy 处理视频的自定义 GUI 应用程序。该工具提供了视频播放、元数据提取、格式转换、视频裁剪和截图等功能。通过分析其设计和实现,我们将了解其工作原理、优点和潜在的改进空间。 C:\pythoncode\new\output\pymovieSample.py …

2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 携程旅游-基础安全工程师 反序列化原理 核心原理 扩展分析 SQL注入本质 核心原理 扩展分析 SQL注…

niuhe插件, 在 go 中渲染网页内容

思路 niuhe 插件生成的 go 代码是基于 github.com/ma-guo/niuhe 库进行组织管理的, niuhe 库 是对 go gin 库的一个封装,因此要显示网页, 可通过给 gin.Engine 指定 HTMLRender 来实现。 实现 HTMLRender 我们使用 gitee.com/cnmade/pongo2gin 实现 1. main.go …

使用MySQL时出现 Ignoring query to other database 错误

Ignoring query to other database 错误 当在远程连接软件中输入MySQL命令出现该错误 导致错误原因是:登录mysql时账户名没有加上u 如果出现该错误,退出mysql,重新输入正确格式进入即可!

java后端开发day34--脑子空空如何无痛想起所有知识点--概念拟人化

1.上半部学习思考 1.1反思–浮躁–二倍速 刚开始算半个小白吧,从最基础的知识点开始学习,到后面学习整个项目的布局和功能。可能是后面慢慢懂得多了,每次打代码搞项目啊什么的,就能明显感觉到自己很浮躁:脑子里已经明…

fastGPT—前端开发获取api密钥调用机器人对话接口(HTML实现)

官网文档链接&#xff1a;OpenAPI 介绍 | FastGPT 首先按照文档说明创建api密钥 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

解决 PDF 难题:批量处理、文档清理与自由拆分合并

软件介绍 在日常办公与学习中&#xff0c;处理 PDF 文件常常让人头疼不已&#xff0c;不过别担心&#xff0c;今天有一款堪称神器的国产老牌 PDF 工具要分享给大家。它就是 PDF 补丁丁&#xff0c;凭借其强大功能&#xff0c;为大家排忧解难。 界面体验 初次打开 PDF 补丁丁&…

使用pycharm社区版调试DIFY后端python代码

目录 背景 前置条件 DIFY使用的框架 API服务调试配置步骤&#xff08;基于tag为0.15.3的版本&#xff09; 1.配置.env文件 2.关闭docker里面的docker-api-1服务 3.使用DOCKER启动本地环境需要用到的中间件&#xff0c;并暴露端口 注意事项一&#xff1a; 注意事项二&#xff1a…

量子计算与人工智能的结合:未来科技的双重革命

引言 在过去几十年里&#xff0c;人工智能&#xff08;AI&#xff09;和计算能力的提升一直是推动科技进步的重要力量。然而&#xff0c;随着深度学习和大规模数据处理的发展&#xff0c;传统计算架构的算力瓶颈逐渐显现&#xff0c;人工智能的训练和推理效率受到了限制。在此背…

关于存储的笔记

存储简介 名称适用场景常见运用网络环境备注块存储高性能、低延迟数据库局域网专业文件存储数据共享共享文件夹、非结构化数据局域网通用对象存储大数据、云存储网盘、网络媒体公网&#xff08;断点续传、去重&#xff09;海量 存储协议 名称协议块存储FC-SAN或IP-SAN承载的…

JWT认证服务

JSON Web Token&#xff08;JWT&#xff09;是一种用于在网络应用间安全地传递信息的紧凑、自包含的方式。以下是关于 JWT 认证服务器更详细的介绍&#xff0c;包括其意义、作用、工作原理、组成部分、时效性相关内容、搭建条件以及代码案例。 JWT 的意义与作用 意义&#xf…

手机中的type-C是如何防水的呢?

防水类型的type-C座子&#xff1a; 电子产品防水等级的区分&#xff1a; 这里的“IP”是国际防护标准等级&#xff1b;简而言之&#xff0c;IPXX中“XX”两位数字分别代表防尘和防水等级&#xff0c;其中防尘等级从0&#xff5e;6&#xff0c;防水等级则从0&#xff5e;8。 第…