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

大白话畅谈:stm32中断和FreeRTOS的中断

STM32 的中断(裸机开发)

STM32 的中断就像是 “紧急电话”,当某个硬件事件(比如按键按下、定时器到点、串口收到数据)发生时,CPU 会 暂停 当前的任务,立刻处理 这个紧急事件,处理完再回来继续原来的工作。

关键点:
  1. 中断源

    • 比如 GPIO 引脚电平变化、定时器溢出、UART 收到数据等,都能触发中断。

    • STM32 的中断向量表(startup_stm32xxxxx.s)定义了所有可能的中断。

  2. 中断优先级

    • STM32 使用 NVIC(嵌套向量中断控制器)管理优先级。

    • 优先级高的中断可以打断优先级低的中断(嵌套中断)。

  3. 中断处理函数(ISR)

    • 在代码里写一个函数,比如 void USART1_IRQHandler(),STM32 检测到中断后会自动跳转执行它。

    • ISR 要尽量短,避免长时间占用 CPU,否则会影响其他中断和主程序。

  4. 中断开关

    • HAL_NVIC_EnableIRQ(USART1_IRQn) —— 开启中断

    • HAL_NVIC_DisableIRQ(USART1_IRQn) —— 关闭中断


FreeRTOS 的中断管理

FreeRTOS 是一个实时操作系统,它 仍然依赖 STM32 的中断机制,但增加了 任务调度 和 临界区保护,避免中断和任务互相干扰。

关键点:
  1. FreeRTOS 如何管理中断?

    • FreeRTOS 提供了 “中断安全”的 API(以 FromISR 结尾的函数),比如 xQueueSendFromISR(),可以在中断里安全地发送数据给任务。

    • 普通任务 API(如 xQueueSend())不能在中断里用!

  2. 临界区保护(关中断)

    • taskENTER_CRITICAL() —— 临时关闭中断(防止任务被中断打断)

    • taskEXIT_CRITICAL() —— 恢复中断

    • 适用于 保护共享数据(比如全局变量)。

  3. 任务和中断的交互

    • 中断发送信号量/队列 → 任务接收并处理(避免在中断里做复杂操作)。

    • 例如:

      // 在中断里发送数据
      BaseType_t xHigherPriorityTaskWoken = pdFALSE;
      xQueueSendFromISR(xQueue, &data, &xHigherPriorityTaskWoken);
      portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // 如果需要,立即切换任务
  4. 中断优先级 vs FreeRTOS 优先级

    • FreeRTOS 的 任务切换(PendSV) 通常设为 最低优先级,确保高优先级中断能立即响应。

    • SysTick 中断(系统心跳)负责 任务时间片调度


对比总结

对比项STM32(裸机)FreeRTOS
中断处理直接写 ISR用 FromISR API
任务切换由 SysTick 和 PendSV 管理
临界区保护手动开关中断taskENTER_CRITICAL()
数据交互全局变量(需保护)队列、信号量(更安全)

大白话总结

  • STM32 中断:就像 “接紧急电话”,处理完就回去继续干活。

  • FreeRTOS 中断:在“接电话”时,还能 告诉任务(比如:“数据收到了,你去处理吧”),但 不能耽误太久,否则系统会卡住。

  • FreeRTOS 的优势:让中断和任务 安全协作,避免数据混乱,提高系统稳定性。

适用场景:

  • 裸机中断:简单项目,比如 LED 闪烁、按键检测。

  • FreeRTOS 中断:复杂系统,比如多任务 + 网络通信 + 传感器数据处理。

http://www.dtcms.com/a/307536.html

相关文章:

  • 【源力觉醒 创作者计划】_巅峰对话文心 4.5 与通义千问、DeepSeek 能力对比解析
  • 【工具】NVM完全指南:Node.js版本管理工具的安装与使用详解
  • 如何将照片从 realme 手机传输到电脑?
  • MongoDB系列教程-第四章:MongoDB Compass可视化和管理MongoDB数据库
  • node.js之Koa框架
  • 蓝牙 BR/EDR 与 BLE PHY
  • Kafka在Springboot项目中的实践
  • vue3.0 + TypeScript 中使用 axios 同时进行二次封装
  • ESXI虚拟交换机 + H3C S5120交换机 + GR5200路由器组网笔记
  • 数据结构与算法:队列的表示和操作的实现
  • Linux 下自动化脚本安装Jdk、Nginx等软件
  • Java语言/Netty框架的新能源汽车充电桩系统平台
  • 《人工智能导论》(python版)第2章 python基础2.2编程基础
  • Rust视频处理开源项目精选
  • FFmpegHandler 功能解析,C语言程序化设计与C++面向对象设计的核心差异
  • 【日常问题解决方案】VS2022不小心解决方案资源管理器把关掉了怎么办
  • spring cloud alibaba ——gateway网关
  • Day36| 1049. 最后一块石头的重量 II、494.目标和、474.一和零
  • 图论-最短路Dijkstra算法
  • 澳交所技术重构窗口开启,中资科技企业如何破局?——从ASX清算系统转型看跨境金融基础设施的赋能路径
  • Python爬虫07_Requests爬取图片
  • 基于Spring Boot实现中医医学处方管理实践
  • 【05】大恒相机SDK C#开发 —— Winform中采集图像并显示
  • 金融分类提示词演示
  • 【03】大恒相机SDK C#开发 —— 回调采集图像,关闭相机
  • STM32学习记录--Day4
  • TOC-Transformer-LSTM-ABKDE,计算机一区算法龙卷风优化算法应用到概率区间预测!Matlab实现
  • 九识智能与星逻智能达成战略合作,共推“无人车 + 无人机”空地一体巡检升级
  • Java中的“Dead Code”
  • 基于 Amazon Nova Sonic 和 MCP 构建语音交互 Agent