FreeRTOS 遇坑(1)
FreeRTOS 遇坑(1)
转载标明出处!
文章目录
- FreeRTOS 遇坑(1)
- 1. 问题
- 1.1 原理方案
- 2. 报错结果
- 3. 解决方案
- 4. 原理性问题
- 4.1 NVIC 中断控制器
- 4.2 FreeRTOS 中断级别配置
1. 问题
1.1 原理方案
STM32F04
系列上增加了 FreeRTOS
实时系统,创建了二值信号量,功能为通过 USART2
发送数据给 MCU
,MCU
通过 DMA
接收数据,在 DMA
中断服务函数内用到了 FreeRTOS API
函数,然后在 USART1
上打印出系统出结果。
这里
USART1
做了重定向。
2. 报错结果
- 通过系统报错信息
Error: ...\FreeRTOS\portable\RVDS\ARM_CM4F\port.c, 768
,也就此路径的 768 行。
3. 解决方案
NVIC_InitTypeDef NVIC_InitStr;NVIC_InitStr.NVIC_IRQChannel = DMA1_Stream5_IRQn;NVIC_InitStr.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStr.NVIC_IRQChannelSubPriority = 0;NVIC_InitStr.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStr);
- 把
UART2
的DMA
中断优先级更改大于FreeRTOSConfig.h
里所设定的宏定义configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
。
NVIC_InitTypeDef NVIC_InitStr;NVIC_InitStr.NVIC_IRQChannel = DMA1_Stream5_IRQn;NVIC_InitStr.NVIC_IRQChannelPreemptionPriority = 6;NVIC_InitStr.NVIC_IRQChannelSubPriority = 0;NVIC_InitStr.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStr);
修改完之后,重新编译烧录,就会发现不会报错了。
4. 原理性问题
如上图报错结果,追踪到此函数出现问题,大概率能够判断是因为当前优先级大于系统最大优先级,导致报错。
configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
能够追踪到 port.c
里,从注释可得知,这是一个 Interrupt priority
的问题:
也就是说,我们对 FreeRTOSConfig.h
中的与 FreeRTOS
中断配置有关的选项,要有一定的了解:
/* 根据 MCU 架构设置 */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15/* 此用于设置 FreeRTOS 系统可管理的最大优先级 */
#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.1 NVIC 中断控制器
在 FreeRTOSConfig.h
配置之前,我们要来讲一下,STM32
的 Cortex-M
处理器的中断优先级,这个是非常重要的,只有清除了解之后,才能懂得为何我们要这么去配置。
这里以 STM32F407
的 Cortex-M4
处理器为例,它拥有 4
位优先级,也就是 16
个优先级数。
这 16
个优先级在使用 FreeRTOS
系统时,全部设置为抢占优先级,那怎么设置呢?调用下面的函数,就可以实现。那为什么要把 4
位优先级全部设置成抢占优先级呢?主要是我们使用了 FreeRTOS
系统,它的中断配置没有处理亚优先级的这种情况。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
此函数放在 main 函数内部第一行中,最先开始就要告诉 RTOS 系统。
那优先级级数等级是怎么设定的?
首先它拥有 16
个优先级数,有一个优先级级别为 2
和 优先级级别为 5
的进行比较,优先级别为 2
的优先级比较高。所说的优先级别 为 n
的我们称之为数字级别,那么得出结果我们称之为逻辑级别,这点大家一定要清楚。接下来说明的,都以逻辑级别来说明。
4.2 FreeRTOS 中断级别配置
/* 根据 MCU 架构设置 */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
此宏定义是用来设置 MCU
架构的最小优先级,由于 STM32
只拥有 16
级的优先级,所以我们设置为 15
,也就是 0 ~ 15
的优先级号。
/* 此用于设置 FreeRTOS 系统可管理的最大优先级数 */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
此宏定义是用来设置 FreeRTOS
系统可管理的最大优先级数,那么我们从上一个宏定义可知,我们拥有 16
级优先级。那么可以简单理解为,0 ~ 4
归 FreeRTOS
系统管理, 而 5 ~ 15 归我们用户去管理,这说明,权限肯定就有差别了。那有什么用的差别呢?
所说的 FreeRTOS API 函数是以 “FromISR” 结尾的 API 的函数。
/* 内核中断优先级 */
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
那最后这个 FreeRTOSConfig.h
的配置,其实简单来理解,它就是对我们所设置好的内核架构及 FreeRTOS
可管理的最大优先级数进行移位,移位到我们用户可用的优先级位置上,也就是 Bit4 ~ Bit7
位。
总结:所以,我们每次使用到中断服务函数的时候,就要设置 NVIC
中断控制器,也就是中断号。那这个中断号要设置到用户管理还是系统管理的位置,就需要根据我们实际的情况去设置。如果你设置到系统管理位置,记住一件事情,绝对不允许中断当中使用 FreeRTOS API
提供的函数,也就是以 ”FromISR“
结尾的。
FreeRTOS 遇坑(1)相关推荐
- 学后端,一步一坑,遇坑就跳,跳完再爬---之mysql与mysql可视化工具
学后端,一步一坑,遇坑就跳,跳完再爬–mysql Mac book pro,安装mysql 要改密码总不能用mysql创建时候的密码吧,首先,难记也记不住 对于Mac 而言初始密码 遇坑 怎么改都报错 ...
- SpringCache实战遇坑
1. SpringCache实战遇坑 1.1. pom 主要是以下两个 <dependency><groupId>org.springframework.boot</gr ...
- 钉钉OA审批事件回调遇坑梳理-如何注册多个事件回调
项目场景: 问题:使用钉钉http调用事件回调注册,遇坑 本项目有两套服务. 当 600 服务,在使用钉钉注册回调的接口后,再次注册800回调服务,800 回调会覆盖掉600服务 测试服务 600 正 ...
- Kali安装Fluxion详细步骤(附加遇坑解决办法)
Kali安装Fluxion详细步骤(附加遇坑解决办法) 本文只是作者在安装Fluxion遇到的坑,作者kali2020,希望为相同经历的同志提供一个正确安装途径 安装Fluxion 使用这种镜像源可能 ...
- unity 2d 游戏优化之路 遇坑记录
情景说明: unity 出的Android包,在目前一些主流机型跑都没有问题,但是在 小米3 这种比较老的机器上跑,报如下错误 GLSL compilation failed, no infolog ...
- SDWebImage 在Swift中遇坑解决
首先SDWebImag的优点自行百度,大家都是懒人. 至于为啥不用swift的库.我怕swift升级后又是一堆红.不过如果你要使用Swift库Kingfisher是不错的选择 SDWebImage地址 ...
- phalcon安装-遇坑php-config is not installed 解决方法
通过源码编译安装php环境,按照phalcon官方文档安装扩展,会遇到php-config is not installed的坑. 尝试通过下列命令可以解决: 1 cd /opt/cphalcon-3 ...
- 登录页跳转时保存用户信息-遇坑记
项目中遇到的问题,重新建前端界面,遇到了这个问题. 项目中使用Angular JS + admin LTE + bootstrap3 保存用户信息,我有两种思路,一个是使用Angular JS-ser ...
- mpvue返回上一个页面_Mpvue+Vant-Weapp开发小程序遇坑之解决系列
嗨,我是Kit,我来分享Mpvue小程序的踩坑问题,以及如何引入Vant-Weapp,下面开始我的表演,如有问题,可以写在下面的评论里面,只接受建议不接受评论,我很骄傲的~哈哈 相比很多时候我们写东西 ...
最新文章
- Oracle DBMS_STATS 包 和 Analyze 命令的区别
- 从比特大陆AI芯片入局智慧城市看阿里腾讯的城市“攻坚战”...
- 将数组中的值按逆序重新存放
- 使用DelayExchange
- 关于memcpy和memmove两函数的区别
- c语言中如何确保一个程序是单例的_c++单例模式
- 【Java】Java字符串拼接的五种方法,哪种性能最好?
- shell php文件是否存在字符串中,shell 判断字符串是否存在数组中的实现示例
- Java连接数据库导致连接数占满
- 使用opencv和python进行智能图像处理pdf_OpenCV图像处理编程实例 PDF 高清版
- 基于php的实验室设备管理系统
- 常见14种手机传感器
- EN 12101-8:2011烟雾和热量控制系统防烟挡板—CE认证
- Spring的ioc控制反转
- Android6.0运行时权限处理
- MySQL分配内存多少合适_mysql 如何分配内存
- 数字化名词解释—数字化
- 华为正式发布鸿蒙开源是什么意思,重磅!狙击所有操作系统,华为正式发布鸿蒙OS,并宣布全面开源...
- Autofac之类型注册
- C primer plus编程练习-第7章