STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)
STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)
STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)
STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)
STM32F103移植FreeRTOS必须搞明白的系列知识---4(FreeRTOSConfig.h配置文件)
目录
一、Cortex-CM3中断概念
对于FreeRTOS比较关注的是三个中断屏蔽寄存器:PRIMASK、FAULTMASK和BASEPRI。
二、中断优先级
Cortex-CM3中,优先级数值越小,优先级越高。例如:优先级数值0的优先级最高,优先级数值为15的优先级最低。
三、抢占优先级和子优先级
四、优先级分组和抢占优先级和子优先级关系
Cortex-CM3中,抢占优先级和子优先级的优先级数值越小,优先级越高。
1、优先级组0(NVIC_PriorityGroup_0)
2、优先级组1(NVIC_PriorityGroup_1)
3、优先级组2(NVIC_PriorityGroup_2)
4、优先级组3(NVIC_PriorityGroup_3)
5、优先级组4(NVIC_PriorityGroup_4)
五、STM32F103移植FreeRTOS使用哪种优先级分组
六、后记
一、Cortex-CM3中断概念
Cortex-M的NVIC最多支持240个IRQ(中断请求)、1个不可屏蔽中断(NMI)、1个Systick(滴答定时器)定时器中断和多个系统异常。
Cortex-M处理器有多个用于管中断和异常的可编程寄存器, 这些寄存器大多数都在 NVIC和系统控制块 (SCB)中, CMSIS将这些寄存器定义为结构体。以 STM32F103为例,打开core_cm3.h,有两个结构体, NVIC_Type和 SCB_Type。NVIC和SCB都位于系统控制空间(SCS)内,SCS的地址从0XE000E000开始。
对于FreeRTOS比较关注的是三个中断屏蔽寄存器:PRIMASK、FAULTMASK和BASEPRI。
二、中断优先级
Cortex-CM3中,优先级数值越小,优先级越高。例如:优先级数值0的优先级最高,优先级数值为15的优先级最低。
Cortex-CM3中,优先级数值越小,优先级越高。
NVIC 的全称是 Nested vectored interrupt controller,即嵌套向量中断控制器。对于Cortex-M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。8 位的话就可以设置 2^8 = 256 级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如 ST的STM32F1xx和F4xx只使用了这个8位中的高四位[7:4],低四位无任何意义,这样 2^4=16,只能表示 16级中断嵌套。
STM32F103只用了高4位来表达优先级(低4位无任何意义),因此最多支持16级的可编程优先级(0~15),0为最高优先级,15为最低优先级。
下面是STM32使用Cortex-M的高四位表示优先级(低4位无任何意义):
使用4位表达优先级
三、抢占优先级和子优先级
STM32F103只用了4个位(高4位)来表达优先级(注:低4位无意义,一般填写1),因此最多支持16级的可编程优先级(0~15)。0为最高优先级,15为最低优先级。然而这16级可编程优先级并不一定都是抢占优先级,它会被优先级组分成两类:抢占优先级和子优先级。
从上面的表格可以看出,STM32 支持 5 种优先级分组,系统上电复位后,默认使用的是优先级分组0(NVIC_PriorityGroup_0),也就是没有抢占式优先级,只有子优先级。
1、在KEIL软件编程时,使用库函数void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
设置优先级组,参数必须是以下5个宏定义中一个:
#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits 抢占优先级,4 bits 子优先级 */
#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits 抢占优先级,3 bits 子优先级 */
#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits 抢占优先级,2 bits 子优先级 */
#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits 抢占优先级,1 bits 子优先级 */
#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits 抢占优先级,0 bits 子优先级 */
例子:设置优先级组4(NVIC_PriorityGroup_4),也就是有0-15级抢占式优先级,没有子优先级。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
2、在KEIL软件编程时,中断优先级由抢占优先级和子优先级共同组成NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority
表示抢占优先级、NVIC_InitStruct->NVIC_IRQChannelSubPriority
表示优子先级。
3、设置优先级分组+抢占优先级+子优先级的代码:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 13;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
表示设置优先级组4,表示16级优先级全部为可抢占优先级;那么在设置TIM5中断优先级时,NVIC_IRQChannelSubPriority只能设置为0(没有子优先级),NVIC_IRQChannelPreemptionPriority设置为13表示使用优先级为13的可抢占优先级。
四、优先级分组和抢占优先级和子优先级关系
关于这个抢占优先级和这个子优先级有几点一定要说清楚
(1)、具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。
(2)、在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。
(3)、在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。
(4)、Reset、 NMI、 Hard Fault 优先级为负数,高于普通中断优先级,且优先级不可配置。
(5)、系统中断(比如:PendSV,SVC,SysTick)是不是一定比外部中断(比如 SPI,USART)要高,答案:不是的,它们是在同一个 NVIC 下面设置的。也就是说,如果你想把SPI设置的跟SysTick的中断优先级一样随你的便,如果你不想把SPI设置的跟SysTick的中断优先级不一样也随你的便,完全由你自己决定。
Cortex-CM3中,抢占优先级和子优先级的优先级数值越小,优先级越高。
1、优先级组0(NVIC_PriorityGroup_0)
0 bit 用于抢占优先级, 4 bit用于子优先级。
没有抢占优先级,有16个子优先级。
子优先级中断不允许嵌套中断,只有抢占优先级才允许嵌套中断。
例子:
(1)、当前没有进入任何中断服务程序,如果此时同时触发子优先级1和子优先级2中断,则子优先级1先进入中断服务程序(中断优先级的数值越小,优先级越高)。
(2)、当前已经进入子优先级10的中断服务程序,如果此时触发子优先级1的中断,则仍然执行子优先级10的中断服务程序,只有退出子优先级10的中断服务程序后,才能响应子优先级1的中断。(注:子优先级不允许嵌套中断)。
2、优先级组1(NVIC_PriorityGroup_1)
1 bit 用于抢占优先级, 3 bit用于子优先级。
0-1级抢占优先级,0-7级子优先级。
抢占优先级允许嵌套中断,子优先级中断不允许嵌套中断。
警告:相同的抢占优先级中断也不允许嵌套中断。
例子:
(1)、当前没有进入任何中断服务程序,如果此时同时触发(抢占优先级0,子优先级1)和(抢占优先级0,子优先级2)中断,则(抢占优先级0,子优先级1)先进入中断服务程序(中断优先级的数值越小,优先级越高),退出(抢占优先级0,子优先级1)中断服务程序后,才可以进入(抢占优先级0,子优先级2)中断服务程序。 ---> 抢占优先级相同,再比较子优先级
(2)、当前没有进入任何中断服务程序,如果此时同时触发(抢占优先级0,子优先级5)和(抢占优先级1,子优先级2)中断,则(抢占优先级0,子优先级5)先进入中断服务程序(中断优先级的数值越小,优先级越高),退出(抢占优先级0,子优先级5)中断服务程序后,才可以进入(抢占优先级1,子优先级2)中断服务程序。 ---> 先比较抢占优先级,再比较子优先级。
(3)、当前已经进入(抢占优先级0,子优先级5)中断服务程序,如果此时触发(抢占优先级0,子优先级0)中断,只有当退出(抢占优先级0,子优先级5)中断服务程序后,才可以进入(抢占优先级0,子优先级0)中断服务程序。 ---> 先比较抢占优先级,再比较子优先级。子优先级中断不允许嵌套中断。
(4)、当前已经进入(抢占优先级0,子优先级5)中断服务程序,如果此时触发(抢占优先级0,子优先级7)中断,只有当退出(抢占优先级0,子优先级5)中断服务程序后,才可以进入(抢占优先级0,子优先级7)中断服务程序。 ---> 先比较抢占优先级,再比较子优先级。子优先级7的优先级比子优先级5的优先级低,而且子优先级不允许嵌套中断。
(5)、当前已经进入(抢占优先级1,子优先级0)中断服务程序,如果此时触发(抢占优先级0,子优先级7)中断,则立即进入(抢占优先级0,子优先级7)中断服务程序。当退出(抢占优先级0,子优先级7)中断服务程序后,才可以继续执行(抢占优先级1,子优先级0)中断服务程序剩余程序。 ---> 先比较抢占优先级,再比较子优先级。抢占优先级0比抢占优先级1的优先级高,抢占优先级允许嵌套中断。
3、优先级组2(NVIC_PriorityGroup_2)
2 bit 用于抢占优先级, 2 bit用于子优先级。
0-3级抢占优先级,0-3级子优先级。
抢占优先级允许嵌套中断,子优先级中断不允许嵌套中断。
警告:相同的抢占优先级中断也不允许嵌套中断。
4、优先级组3(NVIC_PriorityGroup_3)
3 bit 用于抢占优先级, 1 bit用于子优先级。
0-7级抢占优先级,0-1级子优先级。
抢占优先级允许嵌套中断,子优先级中断不允许嵌套中断。
警告:相同的抢占优先级中断也不允许嵌套中断。
5、优先级组4(NVIC_PriorityGroup_4)
4 bit 用于抢占优先级, 0 bit用于子优先级。
0-15级抢占优先级,没有子优先级。
抢占优先级允许嵌套中断,子优先级中断不允许嵌套中断。
警告:相同的抢占优先级中断也不允许嵌套中断。
例子:
(1)、当前没有进入任何中断服务程序,如果此时同时触发(抢占优先级0)和(抢占优先级1)中断,则(抢占优先级0)先进入中断服务程序(中断优先级的数值越小,优先级越高),退出(抢占优先级0)中断服务程序后,才可以进入(抢占优先级1)中断服务程序。
(2)、当前已经进入(抢占优先级0)中断服务程序,如果此时触发(抢占优先级2)中断,则继续执行(抢占优先级0)中断服务程序(中断优先级的数值越小,优先级越高;低优先级的中断不允许打断高优先级的中断),退出(抢占优先级0)中断服务程序后,才可以进入(抢占优先级2)中断服务程序。 ---> 低抢占优先级的中断不允许打断高抢占优先级的中断。
(3)、当前已经进入(抢占优先级5)中断服务程序,如果此时触发(抢占优先级3)中断,则打断(抢占优先级5)中断服务程序(中断优先级的数值越小,优先级越高;高优先级的中断允许打断低优先级的中断),进入(抢占优先级3)中断服务程序执行。当退出(抢占优先级3)中断服务程序后,才可以重新进入(抢占优先级5)中断服务程序,继续执行剩余的程序。 ---> 高抢占优先级的中断允许打断低抢占优先级的中断。
五、STM32F103移植FreeRTOS使用哪种优先级分组
官方强烈建议,STM32F103移植FreeRTOS时使用优先级组4(NVIC_PriorityGroup_4)。可以分配16种抢占中断源,中断可以快速响应,优先执行最急迫的中断。
六、后记
有些读者觉得疑惑了,如此强大的STM32,所有GPIO都能够配置成外部中断,USART、ADC 等外设也有中断,而NVIC 只能配置16 种中断向量,那么在某个工程中使用超过16 个中断怎么办呢?
注意NVIC 能配置的是16 种中断向量,而不是16 个,当工程中有超过16 个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。
例如:如果工程项目中超过16个中断源,可以将优先级分组定义为优先级组4(NVIC_PriorityGroup_4),USART1的抢占优先级定义为12,USART2的抢占优先级定义为12,SPI1的抢占优先级定义为12。
如果当前已经进入USART1中断服务程序,这时候SPI1中断触发(警告:相同的抢占优先级中断也不允许嵌套中断。),由于同级抢占优先级中断不能相互嵌套,因此只有等到退出USART1中断服务程序后,才可以进入SPI1中断服务程序。
STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)相关推荐
- STM32F103移植FreeRTOS
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.freeROTS是什么? 二.移植FreeRTOS步骤 1.移植工具 2.第一步建立一个工程 3.第二步下载Fre ...
- 基于STM32F103移植FreeRTOS教程
前言 本教程只针对移植实操,关于理论部分请另行百度学习. 本教程移植实操基于正点原子源码.教程手册进程移植. 移植实操 1.将正点原子跑马灯程序源码复制一份,添加一个文件夹对FreeRTOS源码进行管 ...
- STM32系列单片机标准库移植FreeRTOS V10.4.6详解
文中所用到的资料下载地址 https://download.csdn.net/download/qq_20222919/87370679 最近看正点原子新录制了手把手教你学FreeRTOS的视 ...
- 2.STM32F407ZGT6 学习笔记-移植 FreeRTOS
程序移植的代码: https://gitee.com/chejia12/free-rtos_-f407.git 1. 在工程下建议FreeRTOS文件夹 2. 在FreeRTOS文件夹下建立 src ...
- 用通俗易懂的大白话彻底搞明白mysql的数据类型以及mysql中的int(11),这个11到底是啥?
今天抽时间来讲一下mysql里的知识点,之前有不少人问过我,mysql中的int(11),这个11到底是啥意思?是11位的意思吗?你是否也想过这个问题,是否也有这个疑问? ok,今天就展开来讲一下,用 ...
- 这篇能让你搞懂股票买卖系列问题
写在前面 如果觉得写的还不错,有所收获,记得点个关注和点个赞哟,不胜感激. 股票买卖的这个系列问题早在之前就在LeetCode就刷了一遍了,不过当时因为一些原因,没有总结成一篇博文.后面又陆陆续续遇到 ...
- 飞思卡尔 k60/k64 移植FreeRTOS+USB
每年七八月份是智能车大赛的比赛时间,前段时间,学校车队的学弟问我嵌入式系统的问题,于是笔者拿起多年未碰的K60/K64芯片,搭建了一个FreeRTOS+USB的系统框架.文章结尾提供源 ...
- stm32f429igt6跑linux,TouchGFX在STM32F429IGT6上的移植(FreeRTOS版本)
TouchGFX在STM32F429IGT6上的移植(FreeRTOS版本) TouchGFX在STM32F429IGT6上的移植(FreeRTOS版本) 目录 一.移植环境 二.应用框架 三.Tou ...
- 移植FreeRTOS到STM32
移植FreeRTOS到STM32单片机上 引言 介绍 什么是 RTOS? 为什么嵌入式设备往往使用RTOS? FreeRTOS 具体步骤 总结 引言 本文详细介绍如何移植FreeRTOS到STM32单 ...
最新文章
- 学计算机应用好还是汽车维修好,大学汽车运用与维修专业怎么样_学什么_前景好吗-520吉他网...
- [zz]lxc使用tc+tbf限制网速
- 黄冈师范计算机考研,2019年黄冈师范学院计算机基础复试自命题考试大纲
- [零基础学JAVA]Java SE面向对象部分-08.面向对象基础(03)
- 代码实现:键盘录入任意一个年份,判断该年是闰年还是平年
- js 的 math 函数
- 数据库MySQL/mariadb知识点——日志记录(2)二进制日志
- 一个事物两个方面的对比举例_顶管施工也有讲究,两个方面一个个来
- JS你可能还不知道的一些知识点(一)
- 循环队列(循环数组)中元素个数的计算
- 自如CEO熊林接任董事长
- Linux下10 个最酷的 Linux 单行命令(转载)
- 高通收购恩智浦为什么要中国批准?
- 表必须要有主键吗_玄关隔断什么材质好?玄关隔断必须要做吗
- 数据结构上机实践第四周项目2 - 建设“单链表”算法库
- DNF怎么查看服务器状态,dnf显示服务器读取中进不去怎么办 dnf显示服务器读取中进不去解决方法...
- fiddler视频分析
- c罩杯尺码_B、C罩杯有多大?
- netty源码分析7-NioEventLoop-run方法疑难点
- 互联网行业应届生年薪35W,倒挂老员工,这是逼老人离职吗?
热门文章
- ICP经营许可证办理流程有哪些?
- Android音视频开发之ExoPlayer(一):快速入门ExoPlayer
- 禅道 mysql 错误
- 用坚果云同步mysql_使用技巧 | 什么?坚果云还可以同步这些App?
- 什么是阿里云服务器ECS?阿里云服务器的用途
- Spring Boot 2.2.x Junit4 升级为Junit5 后的变化、对比 找不到 org.junit.jupiter.api.Test
- mac升级python版本_Mac上python如何升级?
- GD32F4(2): 用keil5打开官方评估版demo,编译报错找不到core_cm4.h文件
- qq邮箱服务器密码,QQ邮箱授权码如何获取?
- 开发3D游戏建模都需要哪些软件?软件繁多,如何从中挑选学习?