• 裸机:没有操作系统,程序是单流程的(比如一个大循环里依次执行各个功能,或者用中断嵌套处理事件)。优点是资源占用极少(几乎不占 RAM/Flash)、执行流程直观;但复杂项目里,多个功能(比如同时处理传感器、通信、显示)会互相阻塞,逻辑容易混乱(比如一个耗时的操作会卡住其他功能)。

  • 比如长期做单一类型的裸机项目(比如只写循环 + 中断的控制逻辑),可能会对复杂系统的任务管理、资源调度、多模块协同这些 “上层设计” 接触较少;遇到需要同时处理多个实时性任务时(比如一边高速采数、一边通信、一边控外设),纯裸机逻辑会越写越绕,这时候可能会觉得 “效率低”。

      裸机开发离不开中断,轮询,状态机,假如将状态机放在中断里,1ms触发一次,中断中时间片调度仍有其他任务,功能简单没有大的问题,一旦功能复杂,无论是在中断中即执行又判断,还是中断中只判断,将执行放在了主函数,实时性将变得非常差,耦合性会很强,即使放在主函数中执行进行模块分装,仍然不便于维护。其次,用轮询标志位去实现变量同步,代码量大的情况下逻辑会非常绕。即使可以用 结构体+队列 去完成任务解耦,利用缓冲特性去缓冲一些像阈值判断,解决延迟和滞后问题,但本身这样做已经再向架构思想,轻量级的RTOS靠近了。裸机开发也有架构思想(事件驱动架构,消费者-生产者架......),项目烂尾,其实就是没有架构思想。RTOS内功玩的就是架构。

一.中断中只做 “判断和标记”,主循环中做 “执行” 

初始化系统 → 启动定时器 → 进入主循环(轮询标志位)│▼等待定时器溢出│▼触发TIM2中断│执行ISR:1. 清除硬件中断标志2. 设置timerFlag = true│退出ISR,返回主循环│主循环检测到timerFlag = true│1. 清除timerFlag = false2. 执行process_timer_event()│继续主循环(等待下一次事件)

二.中断中即判断也执行

┌───────────────┐
│   系统初始化   │  →  配置定时器、中断使能、GPIO等(仅执行一次)
└───────┬───────┘↓
┌───────────────┐
│   启动定时器   │  →  定时器开始计数,主循环进入空闲/其他任务
└───────┬───────┘↓
┌───────────────┐
│   主循环运行   │  →  执行非中断相关任务(如传感器采样、显示刷新)
└───────┬───────┘│▼(定时器溢出时触发)
┌───────────────┐
│  进入TIM2中断  │  →  CPU暂停主循环,转去执行中断服务程序
└───────┬───────┘↓
┌───────────────┐
│ 判断中断来源   │  →  检查是否为定时器溢出(TIM_GetITStatus)
└───────┬───────┘├─ 否 → 退出中断,返回主循环│▼ 是
┌───────────────┐
│ 清除硬件标志   │  →  清除定时器中断标志(TIM_ClearITPendingBit)
└───────┬───────┘↓
┌───────────────┐
│ 直接执行任务   │  →  例如:LED_Toggle()(仅耗时极短的操作)
└───────┬───────┘↓
┌───────────────┐
│ 退出中断服务   │  →  CPU返回主循环,继续执行被中断的任务
└───────┬───────┘↓
(回到主循环,等待下一次中断)

简单示例:

一.标志位

#include "stm32f10x.h"
​
// 共享标志位
volatile bool timerFlag = false;
​
// 定时器中断服务程序(仅设置标志位)
void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  // 清除硬件中断标志timerFlag = true;  // 设置软件标志位}
}
​
// 主循环(轮询标志位并执行任务)
int main(void) {// 系统初始化(省略)...while (1) {if (timerFlag) {      // 检查标志位timerFlag = false;  // 清除标志位LED_Toggle();     // 翻转LED状态}// 执行其他任务...}
}

二.直接中断执行

// 定时器中断服务程序(直接执行任务)
void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  // 清除硬件中断标志// 直接在中断中执行任务(无需标志位)LED_Toggle();  // 翻转LED状态(假设此函数仅操作GPIO,耗时极短)}
}
​
// 主循环(无需轮询标志位)
while (1) {// 其他任务...(不受定时器事件影响)
}

比较:

特性中断内直接执行标志位 + 主循环执行
中断服务程序 (ISR)完成判断 + 执行(如翻转 LED)仅设置标志位(轻量化)
主循环无需处理定时器事件轮询标志位并执行任务
中断响应时间短(直接完成任务)稍长(需等待主循环轮询)
主循环实时性可能受影响(ISR 执行时主循环暂停)不受影响(ISR 快速返回)
任务复杂度限制仅支持极简单任务(如 GPIO 操作)可处理复杂任务(如数据计算、通信)

总结:

  • 标志位是 “中断轻量化” 的工具:通过分离 “事件检测” 和 “事件处理”,保证中断快速响应,主循环有序执行。

  • 中断内直接执行的适用场景有限:仅适合极简单任务,复杂任务必须避免,否则会破坏系统稳定性。

  • 实际开发中,优先用 “中断设标志 + 主循环处理”,除非能确保任务耗时足够短(通常建议 ISR 执行时间不超过中断周期的 10%)。

三:状态机

中断仅仅作为状态机的触发器,在嵌入式系统中,中断确实可以仅作为状态机的触发器,这种设计模式能有效分离 “事件检测” 和 “事件处理”,提升系统的稳定性和可维护性。

一、核心设计思想

中断的唯一职责:检测特定事件(如定时器溢出、按键按下),并通过标志位通知状态机。 状态机的唯一职责:在主循环中根据标志位执行对应逻辑,完成状态转移。

优势

  • 中断轻量化:中断服务程序(ISR)执行时间极短,避免阻塞其他中断。

  • 逻辑解耦:状态机逻辑与硬件中断分离,便于修改和测试。

  • 可扩展性:可轻松添加新的中断源和状态,无需修改核心逻辑。

  • FreeRTOS作为轻量级 RTOS,本质是在裸机基础上增加了 “任务调度器”,让程序能像 “多线程” 一样运行 —— 把复杂功能拆成多个独立任务,由系统自动分配 CPU 时间。优点是任务间解耦,高优先级任务能及时响应(比如紧急报警);但会占用少量资源(比如几十 KB RAM),且需要理解任务调度、同步等概念。

  • 实时操作系统(RTOS):专门用于实时控制的操作系统,能保证任务在规定时间内响应(比如工业控制中,传感器数据必须在 10ms 内处理),FreeRTOS 就是轻量级 RTOS 的典型。
  • 任务(Task):系统中最小的执行单元,类似 “线程”,每个任务有独立的栈空间和运行状态(就绪、运行、阻塞等)。比如智能手表中,“显示时间”“检测触摸”“计步” 就是不同任务。
  • 优先级(Priority):任务的重要程度标识(FreeRTOS 中数值越大优先级越高)。高优先级任务能打断低优先级任务,比如无人机的 “避障任务” 优先级必须高于 “数据上传任务”,否则可能撞机。
  • 调度器(Scheduler):RTOS 的核心组件,负责决定哪个任务运行(基于优先级或时间片),FreeRTOS 用的是 “抢占式调度”(高优先级任务随时插队)。
  • 上下文切换(Context Switch):调度器切换任务时,保存当前任务的寄存器、栈指针等状态,加载下一个任务的状态,相当于 “暂停 A 任务,继续 B 任务” 的过程,速度越快,系统响应越流畅。
  • 信号量(Semaphore):任务间同步的工具,类似 “通行证”。比如两个任务共用一个传感器,用信号量控制:一个任务拿到信号量才能读取,读完放回,避免冲突。
  • 队列(Queue):任务间传递数据的 “缓冲区”,比如传感器任务采集到数据,通过队列发给处理任务,支持异步通信(发送方不用等接收方立即处理)。
  • FreeRTOS 更适合的场景

  • 多任务并发且有优先级区分
    比如一个设备需要同时处理:传感器数据采集、屏幕显示、蓝牙通信、电机控制,且某些任务必须优先响应(如电机故障检测要比屏幕刷新紧急)。FreeRTOS 的抢占式调度能让高优先级任务及时运行,避免裸机中 “一个任务卡壳导致全局瘫痪” 的问题。
  • 任务间需要灵活通信 / 同步
    当任务间需要传递数据(如传感器任务给处理任务发数据)或协调操作(如两个任务共用一个外设),FreeRTOS 的队列、信号量等机制能简化逻辑,而裸机需要手动设计状态机或全局变量,容易出错。
  • 系统未来可能扩展功能
    如果项目初期简单,但后期可能增加更多模块(如从单一传感器扩展到多传感器 + 联网功能),用 FreeRTOS 能降低后期维护和扩展的难度,任务模块化设计更清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91297.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91297.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91297.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑上如何查看WiFi密码

打开控制面板>点击网络和Internet在查看网络和共享中心找到网络状态和任务点击进去点击连接的WLAN在WLAN状态中点击无线属性在无线网络属性中点击安全,点击显示字符(H)就可以显示密码了

文心一言4.5企业级部署实战:多模态能力与Docker容器化测评

随着大语言模型在企业服务中的应用日益广泛,如何选择一款既能满足多模态创作需求,又具备良好企业级适配性的AI模型成为了关键问题。文心一言4.5作为百度最新开源的大模型,不仅在传统的文本处理上表现出色,更是在多模态理解和企业级…

VUE Promise基础语法

目录 异步和同步 异步的问题 new Promise语法 promise的状态 promise.then() Promise.resolve() Promise.reject() Promise.all() Promise.race() Promise.catch() Promise.finally() 异步和同步 同步模式下,代码按顺序执行,前一条执行完毕后…

用TensorFlow进行逻辑回归(六)

import tensorflow as tfimport numpy as npfrom tensorflow.keras.datasets import mnistimport time# MNIST数据集参数num_classes 10 # 数字0到9, 10类num_features 784 # 28*28# 训练参数learning_rate 0.01training_steps 1000batch_size 256display_step 50# 预处…

【HTTP版本演变】

在浏览器中输入URL并按回车之后会发生什么1. 输入URL并解析输入URL后,浏览器会解析出协议、主机、端口、路径等信息,并构造一个HTTP请求(浏览器会根据请求头判断是否又HTTP缓存,并根据是否有缓存决定从服务器获取资源还是使用缓存…

Android 16系统源码_窗口动画(一)窗口过渡动画层级图分析

一 窗口过渡动画 1.1 案例效果图1.2 案例源码 1.2.1 添加权限 (AndroidManifest.xml) <!-- 系统悬浮窗权限&#xff08;Android 6.0需动态请求&#xff09; --> <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />1.2.2 窗口显示…

腾讯云WAF域名分级防护实战笔记

基于业务风险等级、合规要求及腾讯云最佳实践&#xff0c;提供可直接落地的配置方案&#xff0c;供学习借鉴&#xff1a;一、域名分级与防护原则1. ​域名分级清单&#xff08;核心资产&#xff09;​​​主域名​​业务类型​​风险等级​​合规要求​​防护等级​example.com…

1. 请说出你知道的水平垂直居中的方法

总结 容器 flex 布局&#xff0c;jsutify-content: center; align-items: center;容器 flex 布局&#xff0c;子项 margin: auto;容器 relative 布局&#xff0c;子项 absolute 布局&#xff0c;left: 50%; top: 50%; transform: translate(-50%, -50%);子项 absolute 布局&…

VS Code `launch.json` 完整配置指南:参数详解 + 配置实例

文章目录&#x1f4e6; 一、基本结构&#x1f50d; 二、单个配置项详解示例配置&#xff1a;&#x1f9e9; 三、字段说明与可选值&#x1f4c1; 四、常用变量&#xff08;宏替换&#xff09;&#x1f6e0;️ 五、常见配置实例1️⃣ 调试当前打开的 .py 文件2️⃣ 调试 Jupyter …

使用浏览器inspect调试wx小程序

edge://inspect/#devices调试wx小程序 背景&#xff1a; 在开发混合项目的过程中&#xff0c;常常需要在app环境排查问题&#xff0c;接口可以使用fiddler等工具来抓包&#xff0c;但是js错误就不好抓包了&#xff0c;这里介绍一种调试工具-浏览器。 调试过程 首先电脑打开edg…

【论文阅读】-《Simple Black-box Adversarial Attacks》

简单黑盒对抗攻击 Chuan Guo Jacob R. Gardner Yurong You Andrew Gordon Wilson Kilian Q. Weinberger 摘要 我们提出了一种在黑盒&#xff08;black-box&#xff09;场景下构建对抗样本&#xff08;adversarial images&#xff09;的极其简单的方法。与白盒&#xff08;…

基于ASP.NET+SQL Server实现(Web)企业进销存管理系统

企业进销存管理系统的设计和实现一、摘要进销存管理是现代企业生产经营中的重要环节&#xff0c;是完成企业资源配置的重要管理工作&#xff0c;对企业生产经营效率的最大化发挥着重要作用。本文以我国中小企业的进销存管理为研究对象&#xff0c;描述了企业进销存管理系统从需…

(LeetCode 面试经典 150 题 ) 15. 三数之和 (排序+双指针)

题目&#xff1a;15. 三数之和 思路&#xff1a;排序双指针&#xff0c;时间复杂度0(n^2nlogn)。 先将数组nums升序排序&#xff0c;方便去重和使用双指针。第一层for循环来枚举第一位数&#xff0c;后面使用双指针来找到第二个、第三个数即可&#xff0c;细节看注释。 C版本…

easy-springdoc

介绍 简化springdoc的使用&#xff08;可以搭配knife4j-openapi3-jakarta-spring-boot-starter一起使用&#xff09; maven引用 <dependency><groupId>io.github.xiaoyudeguang</groupId><artifactId>easy-springdoc</artifactId><version>…

配置nodejs,若依

1.配置node.js环境 Node.js — Download Node.js 1.下载好一路下一步&#xff0c;可以安装到d盘 装完之后执行 npm -v 显示版本号即安装成功 2.安装好后新建两个文件夹&#xff0c;node_cache和node_global 3.配置环境变量 新建变量 在path里编辑变量 4.配置用户变量 5.…

Python学习之路(十二)-开发和优化处理大数据量接口

文章目录一、接口设计原则二、性能优化策略1. 数据库优化2. 缓存机制3. 并发模型三、内存管理技巧1. 内存优化实践2. 避免内存泄漏四、接口测试与监控1. 性能测试2. 日志与监控3. 错误处理与限流五、代码示例&#xff08;Flask 流式处理&#xff09;六、部署建议一、接口设计原…

【实时Linux实战系列】实时数据流的网络传输

在实时系统中&#xff0c;数据流的实时传输是许多应用场景的核心需求之一。无论是工业自动化中的传感器数据、金融交易中的高频数据&#xff0c;还是多媒体应用中的视频流&#xff0c;都需要在严格的时间约束内完成数据的传输。实时数据流的传输不仅要求高吞吐量&#xff0c;还…

C#数组(一维数组、多维数组、交错数组、参数数组)

在 C# 中&#xff0c;数组是一种用于存储固定大小的相同类型元素的集合。数组可以包含值类型、引用类型或对象类型的元素&#xff0c;并且在内存中是连续存储的。以下是关于 C# 数组的详细介绍&#xff1a;1. 一维数组声明与初始化// 声明数组 int[] numbers; // 声…

Dify离线安装包-集成全部插件、模板和依赖组件,方便安可内网使用

项目介绍 Dify一键离线安装包&#xff0c;集成安装了全部插件、模板&#xff0c;并集成了dify全部插件所需的依赖组件。方便你在内网、安可环境等离线状态下使用。 Dify是一个开源的LLM应用开发平台。其直观的界面结合了AI工作流、RAG管道、Agent、模型管理、可观测性功能等&…

面试150 翻转二叉树

思路 采用先序遍历&#xff0c;可以通过新建根节点node&#xff0c;将原来root的右子树连到去node的左子树中&#xff0c;root的左子树连到去node的右子树中。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): …