STM32中断分组配置NVIC_PriorityGroup,移植操作系统需需注意NVIC_PriorityGroup_4

这篇具有很好参考价值的文章主要介绍了STM32中断分组配置NVIC_PriorityGroup,移植操作系统需需注意NVIC_PriorityGroup_4。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、先说明中断分组的由来
  • 中断优先级分组表:

优先级分组

抢占优先级

响应优先级

bit[7:4] 分配情况

备注

NVIC_PriorityGroup_0

取值:0

取值:0~15

0:4

0bit抢占优先级、4bit响应优先级

NVIC_PriorityGroup_1

取值:0~1

取值:0~7

1:3

1bit抢占优先级、3bit响应优先级

NVIC_PriorityGroup_2

取值:0~3

取值:0~3

2:2

2bit抢占优先级、2bit响应优先级

NVIC_PriorityGroup_3

取值:0~7

取值:0~1

3:1

3bit抢占优先级、1bit响应优先级

NVIC_PriorityGroup_4

取值:0~15

取值:0

4:

4bit抢占优先级、0bit响应优先级

抢占优先级和响应优先级:

1、抢占优先级不同,会涉及到中断嵌套,抢占优先级高的会优先抢占优先级低的,优先得到执行。

(注意:优先级数字越小,优先级越高)

2、抢占优先级相同,不涉及到中断嵌套,响应优先级不同,响应优先级高的先响应。

(例如:两个中断同时响应,这里就会先执行响应优先级高的那个中断)(注意:优先级数字越小,优先级越高)

3、抢占优先级和响应优先级都相同,则比较它们的硬件中断编号,中断编号越小,优先级越高。

(硬件中断编号从中断向量表当中查看)

二、配置中断优先级分组
  1. 整个系统执行过程中,只设置一次中断分组。(NVIC_PriorityGroupConfig只是对一个寄存器操作。多次操作以最后一次设置为准。)

即我们在上电初始化进行一次配置即可,正常是配置分组2

nvic_prioritygroup_4,STM32,stm32,单片机,嵌入式硬件,Powered by 金山文档

三、关于RTOS的中断优先级分组配置

(1)RTOS的中断配置没有处理亚优先级这种情况,即要求全部为抢占优先级,所以我们在 RTOS 调度启动前调用函数NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 )将全部优先级设为抢占优先级.

(2)相对于FreeRTOS优先级设置

configKERNEL_INTERRUPT_PRIORITY

  • 设置 FreeRTOS 内核本身使用的中断优先级, 因为FreeRTOS内核中断不应当抢占用户使用的中断, 因此一般定义为硬件最低优先级

  • #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY15 //中断最低优先级

我的理解目前知道这边。后面子在看看资料有没有更深入理解。

转发一位大哥记录的由于中断分组导致RTOS出现的问题:

原文:https://blog.csdn.net/HuiCMs/article/details/83065791

最近一年多在做freeRTOS+stm32F407IG+LwIP+CAN等的应用,研发铁路逻辑控制单元LCU,实现可视化IO逻辑编程。

其中有一项功能,是利用TCP连接在PC机和LCU机箱内的控制板之间进行数据同步,从而实现IO逻辑代码Debug。

TCP连接作为一个任务,传输调试信息。要求TCP连接要稳定(至少24小时以上,因为地铁一般每天运行不会超过18小时),且不能影响其他任务的实时性(IO逻辑、机箱控制逻辑等)。因此TCP连接任务优先级较低(但是LwIP任务优先级较高),且为信号触发性任务。

此为背景。

在调试该功能的过程中,出现连接不稳定、死机等情况:

测试现象每次都不太一样,hardfault中断、陷入OS的死循环、任务全部停止但程序未死、部分任务停止运行而其他任务正常等等。基本每次建立连接后几分钟到十几二十分钟,就会出现以上各种各样的问题。甚至有根本连接不上的情况。

直观判断,很像内存溢出,或者任务堆栈溢出。在尝试增加任务堆栈、分析内存消耗后,未解决问题。

最后重新翻书

ALIENTEK的基础例程默认将STM32的优先级分组配置为2,即4个抢占优先级、4个亚优先级。而freeRTOS的中断配置没有处理亚优先级这种情况,即要求全部为抢占优先级。所以STM32移植freeRTOS时,应将中断优先级配置为4,即16个抢占优先级。

依此修改代码:


  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
修改为 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

此后测试,以太网稳如狗,问题得到较好解决。

心得:看书要从头看,温故知新。

转载一位大哥的:https://www.cnblogs.com/milton/p/16884964.html

这部分我还没理解,有兴趣同学可以琢磨看下

FreeRTOS优先级设置


对于 STM32F103, FreeRTOSConfig.h 中需要配置 configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY, 另外在 FreeRTOS 调度启动前调用函数NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 )将全部优先级设为抢占优先级.

configKERNEL_INTERRUPT_PRIORITY


  • 设置 FreeRTOS 内核本身使用的中断优先级, 因为FreeRTOS内核中断不应当抢占用户使用的中断, 因此一般定义为硬件最低优先级

  • 对于STM32F103, 优先级总共4-bit, 在字节的最高位, bit[7:4], 全一表示的最低优先级, 所以在 FreeRTOSConfig.h 中将其设置为 0B1111xxxx 的任一个值就行 [240, 255]

  • 对于AIR32F103, 优先级总共3-bit, 字节最高位 bit[7:5], 所以设置为 0B111xxxxx 的任一个值就行 [160, 255]

configMAX_SYSCALL_INTERRUPT_PRIORITY


设置可以在中断服务程序中, 调用中断安全的FreeRTOS API函数的最高中断优先级.

FreeRTOS 中断嵌套方案将可用的中断优先级分成2组: 被 FreeRTOS 临界区覆盖的, 和不会被覆盖的(这些中断是无法被屏蔽的), 优先级高于配置值的中断, 不受FreeRTOS管控, 在 FreeRTOS 中无法通过进入临界区屏蔽这些中断, 因此也不能在这些中断中调用 FreeRTOS API, 否则系统会有崩溃的风险

例如将这个优先级设置为5, 那么如果有一个中断优先级等于4, 在这个中断中调用了FreeRTOS API, 则系统会有崩溃的风险, 如果使能了configASSERT宏, 会触发断言失败.

在STM32中要保证所有的优先级设置为可抢占优先级, 具体实现方式是在 FreeRTOS 启动前, 调用函数NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4)

STM32使用了中断优先级寄存器中的4位, bit[7:4], 如果设置优先级为5, 对应的二进制值为0x101,

  • 对应STM32使用的 bit[7:4] 就是0x0101, 剩余的 bit[3:0] 可以设置成任何值, 但为了兼容,最好将他们设置成1. 因此就是0x0101 1111 = 0x5F = 95

  • 对应AIR32/MH32使用的是 bit[7:5] 就是0x101, 剩余的 bit[4:0] 可以设置成任何值, 设成全1就是0x1011 1111 = 0xBF = 191

/* AIR32F103 only use 3 bits(bit[7:5]) for priority */
 
/* This is the raw value as per the Cortex-M3 NVIC.  Values can be 255
(lowest) to 0 (1?) (highest). */
/* equivalent to 0xFF (0x111x xxxx, x=1), or priority 7. */
#define configKERNEL_INTERRUPT_PRIORITY     255
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
/* equivalent to 0xBF (0x101x xxxx, x=1), or priority 5. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY  191

常见的是结合 CMSIS_CORE 的宏进行设置, 下面是M0/M0+的例子, 如果是M3/M4, 将 configPRIO_BITS 改为 4, configLIBRARY_LOWEST_INTERRUPT_PRIORITY 改为 0x0F. 如果是AIR32F103则是 3 和 0x07.

/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
    /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
    #define configPRIO_BITS               __NVIC_PRIO_BITS
#else
    #define configPRIO_BITS               2        /* 4 priority levels for Cortex M0/M0+ */
#endif
 
/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY            0x03
 
/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    0x01
 
/* This is the raw value as per the Cortex-M3 NVIC.  Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY     ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

configMAX_PRIORITIES


  • configMAX_PRIORITIES 表示任务支持的优先级,创建任务时, 任务的优先级取值范围为 [0, configMAX_PRIORITIES – 1],数字越大优先级越高。

  • 要注意区分前面的configKERNEL_INTERRUPT_PRIORITY, configMAX_SYSCALL_INTERRUPT_PRIORITY 两个设置项和这个设置项的区别, 这个设置项是任务优先级, 不是中断优先级, 是 FreeRTOS 用于控制任务优先级的, 值不受上面的优先级范围限制.

  • 如果将 configUSE_PORT_OPTIMISED_TASK_SELECTION 设置为1, 表示使用根据硬件优化的优先级控制, 会对 configMAX_PRIORITIES 最大值有限制.

  • configMAX_PRIORITIES的值, 对于Cortex-M3, 一般设成15以内,对于ESP32默认是25, 对于Cortex-M0, 建议设置在7以内.文章来源地址https://www.toymoban.com/news/detail-758023.html

到了这里,关于STM32中断分组配置NVIC_PriorityGroup,移植操作系统需需注意NVIC_PriorityGroup_4的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第六步:NVIC中断优先级分组

     CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。 STM32F40xx/STM32F41xx总共有92个中断。 STM32F42xx/STM32F43xx则总共有96个中断  STM32F40xx/STM32F41xx的92个中断里面,包括1

    2024年02月12日
    浏览(32)
  • Air32F103学习笔记-5.中断配置NVIC

    中断是单片机非常重要的功能,也是一个难点,本节单独讲下NVIC,以及NVIC的配置。 NVIC: Nested Vectored Interrupt Controller 内嵌向量中断控制器  是M3内核的一个外设 是用来总控中断的,例如中断优先级设置,中断使能等 下面看下《STM32F10xxx Cortex-M3编程手册-英文版》中关于NV

    2024年01月16日
    浏览(24)
  • STM32 HAL库配置 NVIC Settings 作用

    tim 1 break interrupt and tim15 global interrupt tim 1 update interrupt and tim16 global interrupt tim1 trigger and commutation interrupt and tim17 global interrupt tim1 capture compare interrupt 这四个有什么用,具体怎么选择 这四个中断与TIM1定时器相关,具体作用如下: 1.TIM1 Break Interrupt(TIM1BRKIRQHandler)和TIM15 Globa

    2024年04月09日
    浏览(26)
  • 夜深人静学32系列10——GPIO中断/NVIC/EXTI/SYSCFG详解,外部中断控制LED

    上期我们学习了GPIO驱动数码管/蜂鸣器/LED和按键等外设,本期我们一起来学习STM32中断的相关内容 当CPU正在处理某个事件的时候,外界发生了紧急事件请求,CPU需要暂停当前的工作,转而去处理这个紧急事件,处理完之后,再次回到之前被中断的地方,继续执行原来的工作,

    2024年01月16日
    浏览(32)
  • 【STM32】配置中断-实例&思路

    基于STM32F103C8T6芯片,配置按键中断的思路及过程 LED光源恒流驱动板,有两个按键,按键1降低亮度,按键2增加亮度(通过PWM方式)。本文写按键触发中断部分的思路和过程 1、先看硬件电路图,找到按键所在的引脚以及触发方式 2、翻标准库函数手册,看引脚在哪个中断线上

    2024年01月24日
    浏览(24)
  • STM32 HAL DMA中断配置

    使用HAL库方式DMA中断时,在网上找了好多资料都没有怎么介绍。所以就自己研究了一下,并做个记录。我的芯片型号是STM32G030。下面我以I2C传数据为例介绍下HAL库是如何使用DMA中断的。 我使用的是I2C2,简单配置下参数,加上DMA通道。 DMA貌似默认开启了中断,蓝色的勾勾是我

    2024年04月23日
    浏览(33)
  • STM32开发(9)----CubeMX配置外部中断

    本章介绍使用STM32CubeMX对引脚的外部中断进行配置,介绍了中断架构体系,外部中断/事件控制器(EXTI),嵌套向量中断控制器(NIVC),并通过实验展示配置后的效果。 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理

    2024年02月15日
    浏览(30)
  • STM32定时中断具体配置讲解(定时1s触发中断为例)(有待更新)

            这里介绍一下STM32定时中断。         有时候我们需要用到定时或者计数功能,这时候就需要用到定时器了,通俗地讲就是我们可以通过调节它的本身主频率来得到我们需要的频率大小,进而设定时间,也可以配置外部计数的模式使用外部计数。         这里以

    2024年02月04日
    浏览(47)
  • STM32CubeMX配置ADC采样(轮询、中断、DMA)

    STM32CubeMX能够极大减小STM32外设配置的工作量,因此作者也借助空闲时间对STM32CubeMX相关配置进行了学习,本文介绍如何利用STM32CubeMX配置ADC采样,记录了作者学习过程中遇到的问题及解决办法,使大家少走弯路,并方便以后复习 先选择所使用的MCU,这里我使用的是STM32F407ZGT系

    2024年02月03日
    浏览(38)
  • STM32串口通信——DMA中断 (简单配置即可直接使用)

    目录 各函数的功能及使用方法 1.串口调试输出 2. 串口调试输出 接口设置    3. 串口格式化输出 4.用户串口DMA中断初始化函数 使用方法 1.找到系统的串口初始化函数 2.在结束位置添加我们的串口初始化函数  5.用户中断回调函数 使用方法 1.找到系统的中断服务.c文件 打开  

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包