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

嵌入式裸机设计--MCU常用裸机架构有哪些?

为什么是裸机设计

792125321入群学习更高效!

在MCU(微控制器单元)裸机开发中,我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式,对我们开发一个小型项目来说及有好处!

下面介绍一下几种常用的裸机架构及其特点:

1. ​超级循环(Super Loop)​

  • ​原理:程序通过一个无限循环(while(1))不断轮询任务。这也是我们最为熟悉的开发方式!

  • ​特点:

  • 简单易实现,适合小型项目。

  • 任务按顺序执行,实时性差,高优先级任务可能被阻塞。

  • 无抢占机制,依赖任务主动释放CPU。

  • ​适用场景:简单控制任务(如LED闪烁、按键检测)。

核心:中断快速响应,主循环处理非实时任务。

例子:

 

 

运行过程:像流水线工人,永远重复三个动作:看一眼按键 → 调一下LED亮度 → 发会儿呆 → 再从头开始。

 

缺点:发呆时会卡住,不能同时做其他事(比如发呆时按键可能漏检查)。

2. ​前后台系统(Foreground-Background)

  • ​原理:

  • ​前台:由中断服务程序(ISR)处理紧急任务(如外部事件)。

  • ​后台:主循环处理非实时任务(如数据处理、状态更新)。

  • ​特点:

  • 中断响应快,适合异步事件处理。

  • 后台任务仍可能被中断打断,需注意资源共享问题(如使用临界区)。

例子:

 

 

运行过程:

 

  • ​急诊:按键按下时,中断立刻标记“有人按了”(不处理,只记下来)。

  • ​门诊:主循环看到标记后,慢慢处理按键,然后继续做杂活。 优点:急诊响应快,杂活不耽误。

  • ​适用场景:需要快速响应外部中断的应用(如传感器触发、通信接收)。

核心:顺序执行,无优先级,阻塞式延时。

 

3. ​状态机(State Machine)​

  • ​原理:将任务分解为多个状态,通过状态转移逻辑控制流程。

  • ​实现方式:

  • switch-case 结构或函数指针跳转。

  • 可能结合查表法(Lookup Table)提高效率。

  • ​特点:

  • 逻辑清晰,适合复杂流程(如协议解析、多步骤控制)。

  • 需合理设计状态迁移条件,避免死锁。

  • ​适用场景:通信协议(UART、SPI)、多阶段控制(如电机启动流程)。

核心:状态迁移由事件或条件触发,逻辑清晰。

例子:

 

 

运行过程:像交通灯,按规则切状态:

 

  • 默认关 → 按下按键切到闪烁 → 闪够时间切到常亮 → 保持常亮。 优点:逻辑清晰,适合多步骤流程(比如洗衣机:加水→洗衣→脱水)。

 

4. ​时间片轮转调度(Time-Sliced Scheduling)​

  • ​原理:利用定时器中断划分时间片,依次执行多个任务。

  • ​特点:

  • 伪并行多任务,任务切换由定时器触发。

  • 任务执行时间需短于时间片,否则可能阻塞其他任务。

  • 需平衡时间片长度和任务实时性。

  • ​适用场景:周期性任务(数据采集、显示刷新)。

核心:定时器划分时间片,任务按片切换。

例子:

 

 

运行过程:像妈妈做饭,定时切换任务:

 

  • 前10秒炒菜 → 后10秒煮汤 → 再切回炒菜 → 循环… 优点:假装“同时”做多件事,适合周期性任务(如每隔1秒读传感器)。

 

5. ​事件驱动架构(Event-Driven)​

  • ​原理:任务由事件触发(如中断、消息队列),而非轮询。

  • ​实现方式:

  • 中断标记事件,主循环检查事件标志并执行回调函数。

  • 可能使用事件队列管理多个事件。

  • ​特点:

  • 低功耗设计(可进入休眠模式等待事件)。

  • 需处理事件优先级和冲突。

  • ​适用场景:低功耗设备(如电池供电的IoT设备)。

核心:事件触发任务,无事件时休眠省电。

例子:

 

 

运行过程:像保安值班,平时睡觉 → 有事(比如报警)就处理 → 处理完继续睡。 优点:省电!适合电池设备(如无线门磁传感器)。

 

 

6. ​协作式调度(Cooperative Scheduling)​

  • ​原理:任务主动释放CPU控制权(如调用yield()),让其他任务运行。

  • ​特点:

  • 无抢占,依赖任务协作,实时性一般。

  • 避免资源竞争,适合单线程环境。

  • ​适用场景:任务间依赖性较强的应用(如顺序执行的数据处理链)。

架构选择建议

  • ​简单任务:超级循环或状态机。

  • ​实时响应:前后台系统 + 中断。

  • ​多任务伪并行:时间片轮转或事件驱动。

  • ​低功耗需求:事件驱动 + 休眠模式。

  • ​复杂逻辑:状态机分层设计(如Harel状态机)。

核心:任务通过yield()主动让出CPU,实现协作切换。

例子:

 

 

运行过程:像两人合作搬砖:

 

  • A搬几块 → 喊“换人!” → B接着搬 → 再换A… 优点:任务自己控制节奏,适合配合型工作流(如先读数据再处理)。

这些架构可单独使用或组合(如“时间片轮转 + 状态机”),具体取决于项目需求和资源限制。裸机开发的核心是平衡实时性、复杂度和资源开销。

题外话:

裸机编程在嵌入式开发中始终是优先考虑的方案,其核心优势在于极致的精简与高效。它直接操作硬件,无需操作系统(OS)中间层,使得资源占用近乎为零——所有内存和算力都可投入业务逻辑,尤其适合资源有限的低端MCU(如STM32F0系列或51单片机)。

此外,裸机程序通过中断和轮询的组合,能够实现硬实时响应,例如电机控制或传感器数据采集的微秒级延迟,这对工业设备等高精度场景至关重要。开发层面,裸机代码结构简单,调试透明,无需学习复杂的OS API,开发周期短且维护成本低,尤其适合功能单一的小型项目。

然而,裸机的局限性在复杂系统中逐渐显现。当系统需并行处理多任务(如同时运行通信协议解析、用户界面刷新和实时控制)时,裸机需手动管理状态机和事件队列,代码复杂度陡增,可维护性下降。此外,协作式任务调度依赖开发者自行实现,若任务间存在强依赖或资源竞争,容易引发逻辑漏洞或优先级反转问题。例如,智能家居中控需要同时处理蓝牙连接、触摸屏交互和云端同步,仅靠裸机开发会显著增加协调成本。

此时,实时操作系统(RTOS)的价值得以体现。RTOS提供任务调度、同步机制(如信号量、消息队列)和内存管理,能优雅处理多任务并行与资源竞争。例如,在无人机飞控系统中,RTOS可确保姿态计算、传感器融合和电机驱动等任务按优先级精确调度,避免手动调度导致的时序错乱。同时,RTOS的模块化设计提升了代码可复用性,适合大型团队协作开发。

尽管如此,多数嵌入式场景仍推荐裸机优先。据统计,超过70%的嵌入式应用(如智能门锁、温控器、小型传感器)仅需实现有限功能,裸机开发完全可满足需求。RTOS的引入意味着至少4-8KB的RAM/ROM开销及额外的CPU负载,对成本敏感的量产项目而言,这些资源本可用于提升功能或降低硬件规格。嵌入式开发的黄金法则是“用最少资源解决问题”——在满足实时性和功能需求的前提下,裸机不仅能降低BOM成本,还能减少系统潜在风险(如RTOS内核漏洞)。因此,除非面临多任务强实时、高复杂度或长期迭代需求,否则裸机仍是更优解

 

总结

​“如无必要,勿增实体”​ —— 裸机是嵌入式开发的第一性原理,能用裸机实现的功能,绝不上RTOS。复杂度留给代码,简单留给系统。

 

相关文章:

嵌入式裸机设计--MCU常用裸机架构有哪些?

为什么是裸机设计 792125321入群学习更高效! 在MCU(微控制器单元)裸机开发中,我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式,对我们开发一个小型项目来说及有好处! 下面介绍…...

【LInux进程六】命令行参数和环境变量

【LInux进程六】命令行参数和环境变量 1.main函数的两个参数2.利用main函数实现一个简单的计算器3.环境变量之一:PATH4.修改PATH5.在命令行解释器bash中查看所有环境变量6.用自己写的程序查看环境变量7.main函数的第三个参数8.本地的环境变量和环境变量9.环境变量具…...

深度解析前端面试八股文:核心知识点与高效应对策略

深度解析前端面试八股文:核心知识点与高效应对策略 1. 引言 前端面试是每位开发者迈向职业进阶的重要环节,涉及 HTML、CSS、JavaScript、性能优化、浏览器原理、网络、安全、框架(Vue/React) 等核心知识点。本文不仅会覆盖 前端…...

激光slam学习笔记10---ubuntu2004部署运行fastlivo2踩坑记录

背景:mars实验室又发福利啦!跑跑效果,验了那句,mars出品,必属精品!本人pc环境ubuntu20.04,基本流程按照readme走就行,sophus和vikit安装有些注意地方。本文做了一些部署踩坑记录&…...

织梦DedeCMS优化文章模版里的“顶一下”与“踩一下”样式

测试的版本5.7.1UTF-8 一、插入<head>Js代码 将下面代码插入到文章模版里的<head>标签里 <script language"javascript" type"text/javascript" src"{dede:global.cfg_cmsurl/}/include/dedeajax2.js"></script> <…...

IDEA+Docker插件一键部署SpringBoot项目到远程服务器

文章目录 1. 服务端1.1 安装Docker1.2 Docker放开远程连接1.3 重启Docker1.4 开放端口1.4.1 云端1.4.2 服务器内部防火墙指令 2.IntelliJ IDEA2.1 安装IDEA2.2 安装Docker插件2.3 SSH Configurations2.4 Docker选择对应的SSH2.5 Dockerfile2.5.1 Dockerfile2.5.2 Dockerfile Ed…...

【SoC基础】单片机之RCC模块

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

机器学习之梯度消失和梯度爆炸

文章目录 梯度消失1. 原理2. 影响3. 易出现情况4. 解决方法5. 编程实战案例 梯度爆炸1. 原理2. 影响3. 易出现情况4. 解决方法5. 编程实战案例 常用权重初始化方法及其影响1. 随机初始化2. Xavier初始化&#xff08;Glorot初始化&#xff09;3. Kaiming初始化&#xff08;He初始…...

C++基础 [五] - String的模拟实现

目录 前言 string类的模拟实现 成员函数的实现 构造函数 拷贝构造函数 赋值运算符重载 析构函数 元素访问的实现 operator[ ] Iterator - 迭代器 容量大小的实现 size capacity reserve ​编辑resize 内容修改的实现 push_back append operator(char ch) …...

LLVM学习-- 构建和安装

一 LLVM版本 二 适用预构建的二进制文件安装LLVM 三 适用包管理器安装LLVM 四 从源码构建用于Linux的LLVM 五 从源码构建用于Windows和Visual Studio的LLVM 六 从源码构建用于MacOS 和XCode的LLVM 1.1 LLVM项目从10年前第一次发布到版本3.4&#xff0c;其SVN存储库包含了超过20…...

python中使用单例模式在整个程序中只创建一个数据库连接,节省资源

示例代码&#xff1a; from loguru import logger from pymongo import MongoClient from pymongo.errors import ConnectionFailurefrom llm_engineering.settings import settingsclass MongoDatabaseConnector:_instance: MongoClient | None Nonedef __new__(cls, *args,…...

AIAgent有哪些不错的开源平台

AIAgent领域有许多优秀的开源平台和框架&#xff0c;以下是一些值得推荐的开源平台&#xff1a; AutoGPT AutoGPT 是一个基于 OpenAI 的 GPT-4 和 GPT-3.5 大型语言模型的开源框架&#xff0c;能够根据用户给定的目标自动生成所需提示&#xff0c;并利用多种工具 API 执行多步骤…...

Python刷题:流程控制(上)

今天刷的是PythonTip的Python 入门挑战中的题&#xff0c;整体难度不高&#xff0c;适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 每一个拼命努力的人&#xff0c;都像是独自穿越黑暗森林的行者&#xff0c; 没有并肩的身影&#xff0c;唯有孤独如影随形&…...

vulhub/Billu_b0x靶机----练习攻略

1.Billu_b0x靶场下载链接&#xff1a; https://download.vulnhub.com/billu/Billu_b0x.zip 2.下载后&#xff0c;解压出ova文件&#xff0c;直接拖至VMware中&#xff0c;重命名和选择存储位置&#xff0c;点击导入&#xff0c;报错点击重试即可。修改网卡为NAT模式。 打开靶…...

【YOLOv8】YOLOv8改进系列(8)----替换主干网络之Swin Transformer

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; 【YOLOv8】YOLOv8结构解读…...

Qwen2-Audio:通义千问音频大模型技术解读

引言:从llm到mlm(audio) 大型语言模型(LLM)的发展日新月异,它们在文本理解、生成、推理等方面展现出惊人的能力。然而,交互模态不仅仅依赖于文字,语音、语调、环境音等听觉信息同样承载着丰富的内容。阿里巴巴通义千问团队,推出了 Qwen-Audio 系列模型,这里我们一起…...

解决 开发FFMPEG视频播放器右侧白色线问题

在开发基于 Qt 和 FFmpeg 的视频播放器时,我遇到一个常见但令人困惑的问题:在使用 VideoWidget(继承自 QOpenGLWidget)播放某些视频时,窗口右侧会出现一条白色线。这不仅影响视觉效果,还可能暴露潜在的渲染或缓冲区问题。本文将详细分析这一现象的成因,并提供经过验证的…...

解决Java多张图合成JPG时出现红色前景及多列自适应适配

目录 前言 一、追本溯源 1、回到最开始 2、合成JPG的异常 二、解决问题 1、关于ImageType 2、TYPE_INT_RGB和TYPE_INT_ARGB 3、问题修复 4、列数自适应的问题 三、总结 前言 在当今数字化信息飞速发展的时代&#xff0c;图像处理技术在各个领域都占据着举足轻重的地位…...

SpringBoot实现发邮件功能+邮件内容带模版

发送简单邮件模版邮件 1.pom引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.5.13</version></dependency><dependency><groupId&…...

npm 报错 unable to resolve dependency tree

如下图&#xff1a; 解决&#xff1a;npm install --legacy-peer-deps 其实提示上有&#xff1a;npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps...

【蓝桥杯每日一题】3.17

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 他们说内存泄漏是bug&#xff0c;我说这是系统在逼我进化成SSR级程序员 OK来吧&#xff0c;不多废话&#xff0c;今天来点有难度的&#xff1a;二进制枚举 二进制枚举&#xff0c;就是…...

leetcode刷题之-整数反转

又开始刷题了&#xff0c;最近在刷这题 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号…...

Linux:冯诺依曼体系结构、操作系统、进程概念(一.初识进程)

文章目录 1.冯诺依曼体系结构总线与数据传输通路为什么有内存这个部分计算机存储结构 2.操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 理解“管理”先描述再组织 2.4 用户使用系统调用和库函数&#xff08;lib&#xff09;概念 总结 3.初识进程3.1 基本事实与引入3.2…...

动手学深度学习:CNN和LeNet

前言 该篇文章记述从零如何实现CNN&#xff0c;以及LeNet对于之前数据集分类的提升效果。 从零实现卷积核 import torch def conv2d(X,k):h,wk.shapeYtorch.zeros((X.shape[0]-h1,X.shape[1]-w1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j](X[i:ih,j:jw…...

C语言 常用系统函数

<string.h> 头文件中的字符串函数 标准库的头文件 <string.h> 中&#xff0c;有三个常用的字符串函数&#xff1a; 函数名 描述 strlen(str) 返回str的长度&#xff0c;类型是 size_t strcpy(str1,str2) 将str2中的字符串复制到str1中 strcat(str1,str2) 将…...

删除排序链表中的重复元素(js实现,LeetCode:83)

看到这道题的第一反应是使用快慢指针&#xff0c;之前做过类似的题&#xff1a;删除有序数组中的重复项&#xff08;js实现&#xff0c;LeetCode&#xff1a;26&#xff09;原理都是一样,区别是这题需要将重复项删除&#xff0c;所以只需要走一遍单循环就可以实现 /*** Defini…...

【嵌入式学习】如何利用gitee管理记录学习内容

# 新建git仓库并连接到本地 ## 查看本地是否下载git git --version ## 全局配置git git config --global user.name "你的用户名" git config --global user.email "你的邮箱" git config --global credential.helper store ## 初始化本地仓库 git…...

C#入门学习记录(四)C#运算符详解:掌握算术与条件运算符的必备技巧+字符串拼接

一、运算符概述 运算符是程序进行数学运算、逻辑判断的核心工具&#xff0c;C#中的运算符分为&#xff1a; 算术运算符 → 数学计算&#xff08; - * / %&#xff09; 条件运算符 → 三目判断&#xff08;?:&#xff09; 关系运算符 → 比较大小&#xff08;> < &#…...

单片机自学总结

自从工作以来&#xff0c;一直努力耕耘单片机&#xff0c;至今&#xff0c;颇有收获。从51单片机&#xff0c;PIC单片机&#xff0c;直到STM32&#xff0c;以及RTOS和Linux&#xff0c;几乎天天在搞:51单片机&#xff0c;STM8S207单片机&#xff0c;PY32F003单片机&#xff0c;…...

Unity教程(二十二)技能系统 分身技能

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…...