【单片机】嵌入式系统的硬件与软件特性
嵌入式系统的软件结构
嵌入式系统的软件结构一般分为 不带操作系统(Bare Metal) 和 带操作系统(RTOS / Linux) 两种。不同的软件架构适用于不同的应用场景,如 简单控制系统、实时控制系统、物联网、工业自动化等。

嵌入式软件结构可以分为不带 OS(裸机)和带 OS(RTOS / Linux)两种,裸机系统适用于简单任务,代码直接运行在 MCU 上,RTOS 适用于多任务管理,提高系统稳定性和可扩展性。
1. 不带 OS 的嵌入式软件结构(Bare Metal)
概述:不带操作系统的软件架构通常应用于 单片机(MCU),运行简单的任务,程序直接控制硬件。如 Arduino、STM32(无 RTOS)、AVR、8051、PIC 等。
软件结构:
+------------------+
| 应用程序 | 用户编写的功能代码
| Application |
+------------------+
| 设备驱动 | 控制外设,如 GPIO、UART、SPI
| Driver |
+------------------+
| 硬件(MCU) | 处理器、存储器、外设
+------------------+
特点:1. 程序直接运行在硬件上,没有操作系统的调度;2. 代码简单,执行效率高; 3. 适用于小型嵌入式设备(如 8-bit、32-bit MCU); 4. 缺乏多任务管理,任务间靠循环或中断实现。
应用场景:
📌 传感器采集
📌 LED 控制、电机驱动
📌 简单串口通讯(UART、I2C、SPI)
📌 低功耗 IoT 设备(如无线传感器节点)
示例代码(裸机 LED 闪烁 - STM32):
int main(void) {HAL_Init(); // 初始化 MCUGPIO_Init(); // 初始化 GPIOwhile (1) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);HAL_Delay(500); // 延时 500ms}
}
2. 带 OS 的嵌入式软件结构(RTOS / Linux)
概述:带操作系统的软件架构通常用于 复杂的嵌入式系统(MPU / 高级 MCU),需要多任务处理、实时性、网络通信等功能。
常见的操作系统包括:
- RTOS(实时操作系统):FreeRTOS、RT-Thread、Zephyr
- 嵌入式 Linux:Yocto、Buildroot、Ubuntu Core
软件结构:
+------------------------+
| 应用程序 (Application) | 用户应用,业务逻辑、UI、通信协议
+------------------------+
| 标准 API 层 (API) | 提供标准接口,如 POSIX、CMSIS-RTOS
+------------------------+
| 实时操作系统 (RTOS) | 任务调度、线程管理、定时器
+------------------------+
| 硬件抽象层 (HAL) | 提供硬件驱动接口,如 STM32 HAL
| BSP(Board Support) | 板级支持包,适配不同硬件平台
+------------------------+
| 硬件 (MCU/MPU) | 处理器、存储器、外设
+------------------------+
特点:1. 支持多任务调度(如 FreeRTOS 任务管理);2. 提高系统稳定性(任务隔离,防止崩溃) 3. 适用于复杂嵌入式应用(如 TCP/IP、USB、GUI) 4. 功耗管理更精细。
应用场景:
📌 物联网设备(无线通信、MQTT)
📌 车载系统(仪表盘、导航)
📌 工业控制(PLC、机器人)
📌 智能家居(智能音箱、网关)
示例代码(FreeRTOS 任务调度 - STM32):
void Task1(void *pvParameters) {while (1) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);vTaskDelay(pdMS_TO_TICKS(500)); // 任务延时 500ms}
}
int main(void) {HAL_Init();xTaskCreate(Task1, "LED_Task", 128, NULL, 1, NULL);vTaskStartScheduler(); // 启动 FreeRTOS
}
不带 OS vs 带 OS 的对比
| 对比项 | 不带 OS(Bare Metal) | 带 OS(RTOS / Linux) |
|---|---|---|
| 任务管理 | 通过循环或中断 | 任务调度(多线程) |
| 实时性 | 高 | 取决于 RTOS 设计 |
| 复杂度 | 代码简单 | 需要 RTOS 框架 |
| 功耗管理 | 低功耗,适合小 MCU | 需要 OS 支持 |
| 应用场景 | 传感器、LED 控制 | 物联网、工业控制 |
如果系统简单(如 LED 控制、UART 通信) → 使用 Bare Metal
如果需要多任务调度、网络功能(如 MQTT) → 使用 RTOS
如果系统复杂(如 Linux + GUI + 网络) → 使用嵌入式 Linux
嵌入式系统的硬件特性
硬件
1. 体积小、集成效率高嵌入式设备通常体积小,适用于便携式或嵌入式环境高度集成的 SoC(System on Chip)减少 PCB 设计复杂度部分系统采用 SIP(System in Package)进一步缩小体积部分应用:智能手表(Apple Watch, 华为手表)物联网传感器(无线温湿度检测)无人机控制芯片2. 面向特定的应用嵌入式系统为特定任务设计,如工业控制、汽车电子、医疗设备硬件定制化程度高,优化 CPU、存储、通信接口不需要通用计算能力,而是专注于某项功能部分应用:车载 ECU(发动机控制单元)智能家居(智能门锁、摄像头)工业 PLC(可编程逻辑控制器)3. 功耗低、电磁兼容性(EMC)好嵌入式设备通常采用低功耗架构(如 ARM Cortex-M 系列)支持低功耗模式(Sleep, Deep Sleep),延长电池续航优化 PCB 布局,减少 EMI(电磁干扰)和 EMC(电磁兼容)问题部分应用:低功耗 IoT 设备(ESP32, STM32L 系列)医疗植入设备(心脏起搏器)无线通信模块(LoRa, Zigbee)
嵌入式系统的软件特性
1. 软件开发与硬件紧密相关嵌入式软件依赖于具体硬件,通常需要驱动开发不同的 MCU / MPU 需要不同的 BSP(Board Support Package)与低级硬件交互,如 GPIO、UART、I2C、SPI示例:STM32 配置 GPIO
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 设置引脚高电平
2. 代码要求高效率和高可靠性嵌入式系统资源有限(RAM / Flash 小),代码需优化通常需要实时性,避免延迟和死机使用 RTOS(如 FreeRTOS)实现任务调度,提高代码可靠性示例:FreeRTOS 任务调度:
void Task1(void *pvParameters) {while (1) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);vTaskDelay(pdMS_TO_TICKS(500)); // 500ms 延时}
}
3. 软件一般固化在 Flash 或 ROM嵌入式程序存储在 Flash / ROM,而非硬盘部分设备支持 OTA(Over-the-Air)更新固件升级需谨慎,避免损坏 Bootloader示例:STM32 Flash 读取
uint32_t data = *(__IO uint32_t*)FLASH_ADDRESS; // 读取 Flash 数据
4. 具有高实时性嵌入式系统通常需要实时响应,如汽车刹车系统、工业控制使用 RTOS(实时操作系统)或裸机(Bare Metal)提高实时性定时器(Timer)、中断(Interrupt)在嵌入式系统中至关重要示例:STM32 定时器中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if (htim->Instance == TIM2) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); // 定时器触发 LED 闪烁}
}
5. 一般采用 C 语言开发C 语言是嵌入式开发的主要语言,因其高效、可移植性强部分系统使用 C++(如 Qt GUI)、Python(如 MicroPython)汇编用于极限优化(如 Bootloader、DSP 算法)示例:STM32 C 代码
#include "stm32f4xx.h"
int main(void) {HAL_Init();while (1) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);HAL_Delay(500);}
}
嵌入式系统的硬件和软件特点决定了它的高效、低功耗、实时性和可靠性,硬件:小型化、低功耗、面向特定应用;软件:高效、实时、代码固化、多任务管理。在开发中需要合理应用与设计硬件和软件。
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!
相关文章:
【单片机】嵌入式系统的硬件与软件特性
嵌入式系统的软件结构 嵌入式系统的软件结构一般分为 不带操作系统(Bare Metal) 和 带操作系统(RTOS / Linux) 两种。不同的软件架构适用于不同的应用场景,如 简单控制系统、实时控制系统、物联网、工业自动化等。 嵌…...
5G核心网实训室搭建方案:轻量化部署与虚拟化实践
5G核心网实训室 随着5G技术的广泛应用,行业对于5G核心网人才的需求日益增长。高校、科研机构和企业纷纷建立5G实训室,以促进人才培养、技术创新和行业应用研究。IPLOOK凭借其在5G核心网领域的深厚积累,提供了一套高效、灵活的5G实训室搭建方…...
使用Qt创建悬浮窗口
在Qt中创建悬浮窗口(如无边框、可拖动的浮动面板或提示框)可以通过以下方法实现。以下是几种常见场景的解决方案: 方法1:使用无边框窗口 鼠标事件拖动 适用于自定义浮动工具窗口(如Photoshop的工具栏)。 …...
蓝耘MaaS平台:阿里QWQ应用拓展与调参实践
摘要:本文深入探讨了蓝耘MaaS平台与阿里QWQ模型的结合,从平台架构、模型特点到应用拓展和调参实践进行了全面分析。蓝耘平台凭借其强大的算力支持、弹性资源调度和全栈服务,为QWQ模型的高效部署提供了理想环境。通过细化语义描述、调整推理参…...
一次Milvus迁移的记录
前言 希望把Linux上生产环境中使用docker compose运行的milvus迁移到本地(mac os)的docker compose中 操作过程 找到了官方有两个相关的项目: https://github.com/zilliztech/milvus-backup https://github.com/zilliztech/vts 但是…我都没用,因为使…...
在线 SQL 转 SQLAlchemy:一键生成 Python 数据模型
一款高效的在线 SQL 转 SQLAlchemy 工具,支持自动解析 SQL 语句并生成 Python SQLAlchemy 模型代码,适用于数据库管理、后端开发和 ORM 结构映射。无需手写 SQLAlchemy 模型,一键转换 SQL 结构,提升开发效率,简化数据库…...
即插即用模块--KANLinear
KAN网络 KAN网络即Kolmogorov-Arnold 网络,是一类基于 Kolmogorov-Arnold 表示定理的神经网络架构,具有强大的非线性表达能力。在相同迭代次数下超越传统MLP,不仅训练速度更快,收敛性更好,而且在拟合复杂函数时的精度…...
LLM本地化部署与管理实用工具实践记录
文章目录 前言OllamaQWen模型部署Python调用API AnythingLLM本地基础配置AI知识库检索 CherryStudio访问DeepSeek系统内置AI助手嵌入知识库文档 LLMStudio基础环境安装模型管理应用命令行的管理 总结 前言 发现好久没更新 CSDN 个人博客了,更多的是转移到了个人私有…...
免费高质量贴图(Textures) 网站推荐
以下是一些提供 免费或高质量贴图(Textures) 的网站,包括 PBR 贴图、HDRI 贴图、材质等,适用于 Three.js、Blender、Unity、Unreal Engine 等软件。 🌍 1. Poly Haven(https://polyhaven.com/)⭐…...
第十次CCF-CSP认证(含C++源码)
第十次CCF-CSP认证 分蛋糕满分题解 学生排队满分题解 Markdown语法题目解读满分代码 结语 分蛋糕 题目链接 满分题解 基本思路:我们需要保证除了最后一个小朋友之外的所有人,分得的蛋糕都大于等于给定的K值,为什么是大于等于,是…...
windows 启用linux子系统不必再装双系统
搜索栏搜索:启用或关闭Windows功能,把下面3项勾选上: 若没有Hyper-V,则根据以下步骤添加: 在桌面新建一个txt文件,将下面的程序复制进去,之后修改文件后缀名为.bat 右键管理员运行即可。 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.m…...
lanqiaoOJ 1180:斐波那契数列 ← 矩阵快速幂
【题目来源】 https://www.lanqiao.cn/problems/1180/learning/ 【题目描述】 定义斐波那契数列数列为 F11,F21,FnFn-1Fn-2,n>2。 给定一个正整数 n,求 Fn 在模 10^97 的值。 【输入格式】 第1行为一个整数 T&#x…...
go程序运行Spaitalite踩坑记录
Spatialite参考资料:8.1. 开源地理空间数据库 — Python与开源GIS Ubuntu安装SpaitaLite: apt-get install libspatialite7 libsqlite3-mod-spatialite apt-get install spatialite-bin 命令行打开数据库:spatialite xxx.db 执行一个空间函…...
【react】react中的<></>和React Fragment的用法及区别详解
目录 1、<>是什么 2、为什么要使用<>? 3、如何使用<>? 基本用法 需要传递属性时(如key) 使用效果 注意事项 总结 4、React Fragment 与空标签(<>)详解 1. Fragment 的用…...
Everything搜索工具下载使用教程(附安装包),everything搜索工具文件快速查找
文章目录 前言一、Everything搜索工具下载二、Everything搜索工具下载使用教程 前言 Everything搜索工具能凭借文件名实时精准定位文件,接下来的教程,将详细为你呈现 Everything搜索工具的下载及使用方法,助你开启高效文件搜索的便捷之旅 。…...
LeetCode 解题思路 17(Hot 100)
解题思路: 找到链表中点: 使用快慢指针法,快指针每次移动两步,慢指针每次移动一步。当快指针到达末尾时,慢指针指向中点。递归分割与排序: 将链表从中点处分割为左右两个子链表,分别对这两个子…...
Qt程序基于共享内存读写CodeSys的变量
文章目录 1.背景2.结构体从CodeSys导出后导入到C2.1.将结构体从CodeSys中导出2.2.将结构体从m4文件提取翻译成c格式 3.添加RTTR注册信息4.读取PLC变量值5.更改PLC变量值 1.背景 在文章【基于RTTR在C中实现结构体数据的多层级动态读写】中,我们实现了通过字符串读写…...
7-12 关于堆的判断
输入样例: 5 4 46 23 26 24 10 24 is the root 26 and 23 are siblings 46 is the parent of 23 23 is a child of 10输出样例: F T F T 这题是建最小堆,数据结构牛老师讲过这个知识点,但是我给忘了,补题搜了一下才解…...
《SQL编程思想》中的 MySQL 建表语句和测试数据
《SQL编程思想》中的 MySQL 建表语句 建表语句 -- 创建 4 个示例表和索引 CREATE TABLE department( dept_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 部门编号,自增主键, dept_name VARCHAR(50) NOT NULL COMMENT 部门名称) ENGINEInnoDB COMM…...
STL标准库
感谢哔哩哔哩UP“开发者LaoJ”,以下是学习记录~ 一、容器 1.1、vector 底层实现是动态数组,向尾部插入数据很方便,但是向中间和头部插入数据需要移动其它元素 可以实现随机访问 如果插入时,当前vector容纳不下,会…...
STM32 HAL库实战:高效整合DMA与ADC开发指南
STM32 HAL库实战:高效整合DMA与ADC开发指南 一、DMA与ADC基础介绍 1. DMA:解放CPU的“数据搬运工” DMA(Direct Memory Access) 是STM32中用于在外设与内存之间直接传输数据的硬件模块。其核心优势在于无需CPU干预,…...
什么是机器学习?从零基础到自动驾驶案例全解析
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-4 uboot目录分析
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Unity开发——点击事件/射线检测
一、IPointerClickHandler接口 通过为 UI 元素添加自定义脚本,实现IPointerClickHandle接口,在点击事件发生时进行处理。 这种方式适用于对特定 UI 元素的点击检测。 using UnityEngine; using UnityEngine.EventSystems;public class UIClickHandler…...
【零基础入门unity游戏开发——unity3D篇】3D物理系统之 —— 3D刚体组件Rigidbody
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
微信小程序接入DeepSeek模型(火山方舟),并在视图中流式输出
引言: DeepSeek,作为一款先进的自然语言处理模型,以其强大的文本理解和生成能力著称。它能够处理复杂的文本信息,进行深度推理,并快速给出准确的回应。DeepSeek模型支持流式处理,这意味着它可以边计算边输…...
55年免费用!RevoUninstaller Pro专业版限时领取
今天,我要给大家介绍一款超给力的卸载工具——RevoUninstaller Pro。这是一款由保加利亚团队精心打造的专业级卸载软件,堪称软件卸载界的“神器”。 RevoUninstaller分为免费版和专业版。专业版功能更为强大,但通常需要付费才能解锁全部功能。…...
Markdig:强大的 .NET Markdown 解析器详解
在现代开发中,Markdown 已经成为了一种广泛使用的轻量级标记语言,特别是在文档、博客和内容管理系统中,Markdown 为开发者提供了快速、简洁的格式化文本方式。而在 .NET 生态中,Markdig 是一款非常强大的 Markdown 解析器…...
基于ensp的IP企业网络规划
基于ensp的IP企业网络规划 前言网络拓扑设计功能设计技术详解一、网络设备基础配置二、虚拟局域网(VLAN)与广播域划分三、冗余协议与链路故障检测四、IP地址自动分配与DHCP相关配置五、动态路由与安全认证六、广域网互联及VPN实现七、网络地址转换&#…...
谷歌Chrome或微软Edge浏览器修改网页任意内容
在谷歌或微软浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable"true"效果如下:...
