正确设置 FreeRTOS 与 STM32 的中断优先级

裸机开发(非 RTOS)时,大多数 STM32 外设的中断优先级通常不需要手动配置,原因如下:


✅ 裸机开发中默认中断优先级行为

特点说明
默认中断优先级为 0如果你不设置,STM32 HAL 默认设置所有外设中断为 0(最高优先级)
没有中断抢占冲突因为没有 RTOS 调度器,也不需要区分 ISR 和任务的优先级
ISR 不调用复杂调度逻辑不存在优先级违反 FreeRTOS API 限制的问题
常见 HAL 示例也是默认优先级STM32CubeMX 生成代码通常直接 SetPriority(0,0)

🛠 举个例子:裸机中 USART 初始化

HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);

甚至你在裸机中 可以完全不调用 HAL_NVIC_SetPriority(),只调用 EnableIRQ() 也能正常运行,因为:

  • 启动文件中(CMSIS)中断默认优先级为 0
  • 没有任务调度抢占的风险

🚨 但在使用 FreeRTOS 时必须配置

因为:

  • FreeRTOS 内核本身运行在中断上下文中
  • ISR 优先级太高会 抢占调度器,而调度器不能被中断
  • 使用了 FreeRTOS API 的 ISR 优先级必须 ≥ configMAX_SYSCALL_INTERRUPT_PRIORITY(默认 5

✅ 总结:裸机 vs RTOS 中断优先级对比

项目裸机开发FreeRTOS 下
是否必须配置中断优先级❌ 不需要✅ 必须配置
默认优先级0通常不够安全
可否在 ISR 中调用复杂逻辑✅ 可以(不推荐)❌ 需要优先级保护
是否存在调度器限制❌ 无✅ 有严格限制

所以:

🟩 裸机时你基本可以不管中断优先级,一切默认值也能跑
🟥 但用上 RTOS 后,中断优先级配置就变成“必须做的事情”



要在 STM32(特别是使用 STM32 HAL 库或 STM32duino)中正确配置 FreeRTOS 的中断优先级宏,你需要理解两部分:


✅ 正确设置 FreeRTOS 与 STM32 的中断优先级宏

🔧 1. 关键宏定义

这些宏应该在 FreeRTOSConfig.h 中配置,主要是以下几个:

#define configPRIO_BITS             __NVIC_PRIO_BITS  // STM32 定义的中断优先级位数
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY      15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
#define configKERNEL_INTERRUPT_PRIORITY              ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

📌 解释各个宏:

宏名含义示例值(假设 4 bit)
configPRIO_BITSNVIC支持的优先级位数(STM32一般为4)4
configLIBRARY_LOWEST_INTERRUPT_PRIORITYHAL库中最低优先级(数值大,优先级低)15
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY允许使用 FreeRTOS API 的中断最大优先级(数值小,优先级高)5
configKERNEL_INTERRUPT_PRIORITYFreeRTOS kernel 使用的实际中断优先级值15 << (8 - 4) = 240
configMAX_SYSCALL_INTERRUPT_PRIORITY使用 FreeRTOS API 的中断最大优先级值5 << (8 - 4) = 80

⚠️ 必须遵守的规则

  • 所有 调用 FreeRTOS API 的中断,它们的优先级必须设置为 等于或低于 configMAX_SYSCALL_INTERRUPT_PRIORITY(也就是数值大于或等于)
  • Kernel 的中断优先级设置为最低(数值最大),防止抢占其他重要中断。

✅ STM32 示例:如何在 FreeRTOSConfig.h 正确配置

假设你用的是 STM32F4(它是 4-bit 优先级):

#define configPRIO_BITS                          __NVIC_PRIO_BITS#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY     5#define configKERNEL_INTERRUPT_PRIORITY      ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

✅ STM32 中断优先级设置对应修改(重要!)

你在使用 HAL 驱动时,还要确保中断优先级设置正确,例如:

HAL_NVIC_SetPriority(USART1_IRQn, 6, 0); // 优先级 6 > 5,允许使用 FreeRTOS API

如果设置为 4 或更高(即数值更小,优先级更高):

HAL_NVIC_SetPriority(USART1_IRQn, 4, 0); // ❌ 错误!优先级太高,不能使用 FreeRTOS API

✅ 总结

要做的事是否必须
FreeRTOSConfig.h 中设置中断优先级宏✅ 必须
避免高优先级中断使用 FreeRTOS API(如 xQueueSendFromISR✅ 必须
查看芯片的 __NVIC_PRIO_BITS 定义✅ 建议
使用 HAL 配置中断时遵守优先级规则✅ 必须

STM32 外设默认的 中断优先级,如果你不手动设置 NVIC 优先级,会根据芯片启动文件(CMSIS 启动代码)和 HAL 库行为,遵循如下逻辑:


默认 NVIC 中断优先级总结

情况默认优先级
手动调用 HAL_NVIC_SetPriority()你设置的值
未调用 HAL_NVIC_SetPriority()(也没配置)默认为 0(即最高优先级)

✅ 所以:如果你不设置,STM32 中断优先级就是 0(也就是“优先级最高”)


📍 示例:STM32 USB 默认优先级(未手动设置时)

例如,在 STM32F4 的 HAL_PCD_MspInit() 中:

HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);

⚠️ 所以默认优先级是 (preempt priority = 0, subpriority = 0) → 等效为 FreeRTOS 中最优先级


🚨 问题:和 FreeRTOS 冲突

FreeRTOS 要求调用其 API 的 ISR(中断服务程序)必须使用较低优先级(优先级值 configMAX_SYSCALL_INTERRUPT_PRIORITY,通常是 5)。

而默认优先级是 0,会违反这个规则,会导致:

  • xQueueSendFromISRxTaskNotifyFromISR 等出错
  • 系统断言失败(configASSERT
  • 出现 HardFault 或中断嵌套异常

✅ 如何查看某个外设当前中断优先级?

你可以在调试器或代码中读取:

uint32_t pri = NVIC_GetPriority(OTG_FS_IRQn);
printf("USB 中断优先级: %lu\n", pri);

✅ 建议你总是手动设置中断优先级

不要依赖默认值!

例如:

HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0); // 比 FreeRTOS MAX_SYSCALL 中断优先级(5)低,合法使用 FreeRTOS API
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);

🔚 总结

问题默认行为
STM32 外设中断默认优先级是多少?0(最高)
会影响 FreeRTOS 使用吗?会。若你使用 FreeRTOS API,默认 0 会导致断言失败
应该设置吗?必须设置,尤其是在 ISR 中用到了 FreeRTOS API

好的!以下是 STM32 常见外设的 推荐 NVIC 中断优先级设置清单(在使用 FreeRTOS 的情况下,特别是涉及 xTaskNotifyFromISRxQueueSendFromISR 等 API 的时候)。


📌 优先级规则前提(以 4 个优先级位为例)

优先级数值优先级级别说明
0最高优先级❌ 不允许调用 FreeRTOS API
1 ~ 4高优先级❌ 不建议使用 FreeRTOS API
5 ~ 15合法范围✅ 可使用 FreeRTOS API(建议 5~10)

✅ 所有 使用 FreeRTOS API 的中断必须设置优先级为 ≥ configMAX_SYSCALL_INTERRUPT_PRIORITY(通常为 5


✅ 常见外设中断推荐优先级表

外设类型中断名称(示例)推荐优先级(preempt)是否允许使用 FreeRTOS API说明
USB FS/HSOTG_FS_IRQn, USB_LP_CAN_RX0_IRQn6✅ 是TinyUSB 常用
USART / UARTUSARTx_IRQn67✅ 是接收中断中常用队列、通知
TIM 定时器TIMx_IRQn78✅ 是软件定时器事件、任务唤醒等
EXTI 外部中断EXTI0_IRQn, EXTIx_IRQn6 ~ 10✅ 是按键、外部触发事件
DMADMAx_Streamx_IRQn6 ~ 8✅ 是用于通知任务数据到位
I2C / SPII2Cx_EV_IRQn, SPIx_IRQn6 ~ 10✅ 是通信完成后唤醒任务
ADC / DACADCx_IRQn8 ~ 12✅ 是可用于数据采样后任务处理
看门狗 / 硬件错误WWDG_IRQn, HardFault_IRQn0 ~ 2❌ 否不应使用 FreeRTOS API

📌 示例配置代码(推荐)

// USB
HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0);
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);// USART
HAL_NVIC_SetPriority(USART1_IRQn, 7, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);// TIM 定时器
HAL_NVIC_SetPriority(TIM2_IRQn, 8, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);

⚠️ 注意:STM32 优先级是“数值越小,优先级越高”

所以:

  • 0 是最高优先级(❌ 禁止用于 FreeRTOS ISR API)
  • 15 是最低优先级

✅ 建议配置总结

类型推荐优先级范围(Preempt)举例
非实时,允许用 FreeRTOS API5 ~ 10USB / USART / TIM
高实时需求 ISR(不用 RTOS API)0 ~ 4ADC / HardFault / 高速通信
RTOS 调度器自身通常为 15自动配置

在 FreeRTOS 中,调度器本身并不是一个中断或任务,它运行在 CPU空闲时 或由 SysTick 和 PendSV 中断驱动上下文切换。但我们可以从以下几个角度来理解你问的“调度器优先级”:


🔧 1. 调度相关中断优先级

FreeRTOS 使用两个关键中断来实现调度:

中断作用推荐优先级说明
SysTick_IRQn触发时间片中断,驱动 tick 增加最低优先级(如 15系统节拍来源
PendSV_IRQn实现任务切换(上下文切换)最低优先级(如 15必须低于其他中断

✅ 所以我们通常手动或由 FreeRTOS 内部将这两个设置为:

NVIC_SetPriority(PendSV_IRQn, 15);
NVIC_SetPriority(SysTick_IRQn, 15);

📌 它们必须设为最低优先级,否则会干扰中断服务。


⚙️ 2. FreeRTOS 内核中配置项解释

FreeRTOSConfig.h 中,你配置了内核调度相关的“优先级窗口”,用于约束允许调用 FreeRTOS API 的中断优先级范围:

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY     5

这意味着:

  • 所有使用 FreeRTOS API 的中断优先级 必须为 5~15(数值越大优先级越低)
  • PendSV_IRQnSysTick_IRQn 会设置为 configKERNEL_INTERRUPT_PRIORITY(通常为 15

✅ 3. FreeRTOS 任务优先级

这个和 NVIC 中断优先级是两个不同的体系

概念范围数值越大优先级
任务优先级0 ~ configMAX_PRIORITIES - 1越高(更优先被调度)
中断优先级数值越小优先级越高(STM32)越高(会抢占其他中断)

例如:

vTaskCreate(..., uxPriority = 5, ...);  // FreeRTOS 任务优先级为 5(调度优先)

🧠 总结:FreeRTOS 调度器相关优先级一览

项目优先级值(通常)优先级说明
PendSV_IRQn15最低中断优先级,切换任务用,必须最低
SysTick_IRQn15时钟节拍中断,驱动调度器 tick
configKERNEL_INTERRUPT_PRIORITY15内核运行的最低安全中断
configMAX_SYSCALL_INTERRUPT_PRIORITY5(可调)可使用 FreeRTOS API 的最高优先级
FreeRTOS 任务优先级0 ~ configMAX_PRIORITIES-1数值越大越优先执行(与中断无关)

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

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

相关文章

EasyExcel之SheetWriteHandler:解锁Excel写入的高阶玩法

引言在 EasyExcel 强大的功能体系中&#xff0c;SheetWriteHandler 接口是一个关键的组成部分。它允许开发者在写入 Excel 的 Sheet 时进行自定义处理&#xff0c;为实现各种复杂的业务需求提供了强大的支持。通过深入了解和运用 SheetWriteHandler 接口&#xff0c;我们能够更…

Python单例模式魔法方法or属性

1.单例模式概念定义:单例模式(Singleton Pattern)是一种创建型设计模式&#xff0c;它确保一个类只能有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这种模式在需要控制资源访问、配置管理或协调系统操作时特别有用。核心特点:私有构造函数&#xff1a;防止外部通过…

【Kubernetes系列】Kubernetes 资源请求(Requests)

博客目录 引言一、资源请求的基本概念1.1 什么是资源请求1.2 请求与限制的区别 二、CPU 请求的深入解析2.1 CPU 请求的单位与含义2.2 CPU 请求的调度影响2.3 CPU 请求与限制的关系 三、内存请求的深入解析3.1 内存请求的单位与含义3.2 内存请求的调度影响3.3 内存请求的特殊性 …

大型语言模型中的自动化思维链提示

摘要 大型语言模型&#xff08;LLMs&#xff09;能够通过生成中间推理步骤来执行复杂的推理任务。为提示演示提供这些步骤的过程被称为思维链&#xff08;CoT&#xff09;提示。CoT提示有两种主要范式。一种使用简单的提示语&#xff0c;如“让我们一步一步思考”&#xff0c;…

Private Set Generation with Discriminative Information(2211.04446v1)

1. 遇到什么问题&#xff0c;解决了什么遇到的问题现有差分隐私生成模型受限于高维数据分布建模的复杂性&#xff0c;合成样本实用性不足。深度生成模型训练依赖大量数据&#xff0c;加入隐私约束后更难优化&#xff0c;且不保证下游任务&#xff08;如分类&#xff09;的最优解…

C++编程语言入门指南

一、C语言概述 C是由丹麦计算机科学家Bjarne Stroustrup于1979年在贝尔实验室开发的一种静态类型、编译式、通用型编程语言。最初被称为"C with Classes"(带类的C)&#xff0c;1983年更名为C。它既具有高级语言的抽象特性&#xff0c;又保留了底层硬件操作能力&…

ZED相机与Foxglove集成:加速机器人视觉调试效率的实用方案

随着机器人技术的发展&#xff0c;实时视觉数据流的高效传输和可视化成为提升系统性能的重要因素。通过ZED相机&#xff08;包括ZED 2i和ZED X&#xff09;与Foxglove Studio平台的结合&#xff0c;开发者能够轻松访问高质量的2D图像、深度图和点云数据&#xff0c;从而显著提高…

目标检测新纪元:DETR到Mamba实战解析

&#x1f680;【实战分享】目标检测的“后 DEⱯ”时代&#xff1a;DETR/DINO/RT-DETR及新型骨干网络探索&#xff08;含示例代码&#xff09; 目标检测从 YOLO、Faster R-CNN 到 Transformer 结构的 DETR&#xff0c;再到 DINO、RT-DETR&#xff0c;近两年出现了许多新趋势&am…

【IOS】XCode创建firstapp并运行(成为IOS开发者)

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍XCode创建firstapp并运行 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路…

class类和style内联样式的绑定 + 事件处理 + uniapp创建自定义页面模板

目录 一.class类的绑定 1.静态编写 2.动态编写 二.style内联样式的绑定 三.事件处理 1.案例1 2.案例2 四.uniapp创建自定义页面模板 1.为什么要这么做&#xff1f; 2.步骤 ①打开新建页面的界面 ②在弹出的目录下&#xff0c;新建模板文件 ③用HBuilderX打开该模板…

android 卡顿和丢帧区别

Android 卡顿&#xff08;Jank&#xff09;与丢帧&#xff08;Frame Drop&#xff09;的核心区别在于问题本质与用户感知&#xff0c;以下是分层解析&#xff1a; ️ 一、本质差异 维度卡顿&#xff08;Jank&#xff09;丢帧&#xff08;Frame Drop&#xff09;定义用户可感知…

【python实用小脚本-125】基于 Python 的 Gmail 邮件发送工具:实现高效邮件自动化

引言 在现代办公和开发环境中&#xff0c;邮件通信是一种重要的沟通方式。自动化发送邮件可以大大提高工作效率&#xff0c;例如发送通知、报告或文件。本文将介绍一个基于 Python 的 Gmail 邮件发送工具&#xff0c;它能够通过 Gmail 的 SMTP 服务器发送邮件&#xff0c;并支持…

gateway断言配置详解

一、Predicate - 断⾔ 1、简单用法 spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After2017-01-20T17:42:47.789-07:00[America/Denver] 2、自定义断言 新建类VipRoutePredicateFactory&#xff0c;注意VipRoutePredicateFactory名字…

基于大模型的尿毒症全流程预测与诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、尿毒症相关理论基础 2.1 尿毒症的定义、病因与发病机制 2.2 尿毒症的症状与诊断标准 2.3 尿毒症的治疗方法概述 三、大模型技术原理与应用 3.1 大模型的基本概念与发展历程 3.2 大模型…

裸金属服务器租用平台-青蛙云

企业对服务器性能与灵活性的要求与日俱增。青蛙云M-启强裸金属服务器租用平台应运而生&#xff0c;为企业提供了一种兼具物理机性能和云计算弹性的解决方案。裸金属服务器租用平台的优势​(一)高配性能&#xff0c;无虚拟化开销​裸金属服务器直接运行在物理硬件之上&#xff0…

[Terence Tao访谈] AlphaProof系统 | AI嗅觉 | 研究生学习 | 庞加莱猜想(高维) | 复杂问题简单化

玩这些有趣的东西。通常情况下什么也得不到&#xff0c;你必须学会说&#xff1a;“好吧&#xff0c;再试一次&#xff0c;什么都没发生&#xff0c;我会继续前进。” DeepMind的AlphaProof系统 Q&#xff1a;DeepMind的AlphaProof系统是通过强化学习训练的&#xff0c;使用的…

Aseprite工具入门教程4之动画导入Unity

1、时间轴功能 &#xff08;1&#xff09;眼睛图标 显示/隐藏图层图层隐藏时无法绘制 &#xff08;2&#xff09;锁定图标 锁定后无法移动或编辑图层防止意外在错误图层上绘制 &#xff08;3&#xff09;单元格图标 两个点代表帧分开&#xff0c;一个椭圆代表帧统一。分开就…

移动硬盘频繁提示格式化?解决异常故障的正确方法

移动硬盘作为数据存储的重要工具&#xff0c;不少人都习惯将照片、文档、项目资料甚至整台电脑的备份都放在里面。但有时&#xff0c;一件令人头疼的事悄然发生&#xff1a; 插上硬盘&#xff0c;系统却突然提示&#xff1a;“使用驱动器中的光盘之前需要将其格式化。是否要将…

Java泛型笔记

1 为什么需要泛型 Java5之前&#xff0c;是没有泛型的。通过两段代码我们就可以知道为何我们需要泛型 public int addInt(int a, int b) {return a b; }public double addDouble(double a, double b) {return a b; } 实际开发中&#xff0c;经常有数值类型求和的需求&…

mysql 图形化界面工具 DataGrip 安装与配置

安装地址&#xff1a; Download DataGrip: Cross-Platform IDE for Databases & SQLhttps://www.jetbrains.com/datagrip/download/?sectionwindows 添加数据源&#xff1a; 下载驱动文件&#xff1a;直接点击下载即可 点击测试连接&#xff1a;成功后点击确定 显示所有数…