FreeRTOS 遇坑(1)

转载标明出处!

文章目录

  • FreeRTOS 遇坑(1)
    • 1. 问题
      • 1.1 原理方案
    • 2. 报错结果
    • 3. 解决方案
    • 4. 原理性问题
      • 4.1 NVIC 中断控制器
      • 4.2 FreeRTOS 中断级别配置

1. 问题

1.1 原理方案

STM32F04 系列上增加了 FreeRTOS 实时系统,创建了二值信号量,功能为通过 USART2 发送数据给 MCUMCU 通过 DMA 接收数据,在 DMA 中断服务函数内用到了 FreeRTOS API 函数,然后在 USART1 上打印出系统出结果。

这里 USART1 做了重定向。

2. 报错结果

  1. 通过系统报错信息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);
  1. UART2DMA 中断优先级更改大于 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 配置之前,我们要来讲一下,STM32Cortex-M 处理器的中断优先级,这个是非常重要的,只有清除了解之后,才能懂得为何我们要这么去配置。

这里以 STM32F407Cortex-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 ~ 4FreeRTOS系统管理, 而 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)相关推荐

  1. 学后端,一步一坑,遇坑就跳,跳完再爬---之mysql与mysql可视化工具

    学后端,一步一坑,遇坑就跳,跳完再爬–mysql Mac book pro,安装mysql 要改密码总不能用mysql创建时候的密码吧,首先,难记也记不住 对于Mac 而言初始密码 遇坑 怎么改都报错 ...

  2. SpringCache实战遇坑

    1. SpringCache实战遇坑 1.1. pom 主要是以下两个 <dependency><groupId>org.springframework.boot</gr ...

  3. 钉钉OA审批事件回调遇坑梳理-如何注册多个事件回调

    项目场景: 问题:使用钉钉http调用事件回调注册,遇坑 本项目有两套服务. 当 600 服务,在使用钉钉注册回调的接口后,再次注册800回调服务,800 回调会覆盖掉600服务 测试服务 600 正 ...

  4. Kali安装Fluxion详细步骤(附加遇坑解决办法)

    Kali安装Fluxion详细步骤(附加遇坑解决办法) 本文只是作者在安装Fluxion遇到的坑,作者kali2020,希望为相同经历的同志提供一个正确安装途径 安装Fluxion 使用这种镜像源可能 ...

  5. unity 2d 游戏优化之路 遇坑记录

    情景说明:  unity 出的Android包,在目前一些主流机型跑都没有问题,但是在 小米3 这种比较老的机器上跑,报如下错误 GLSL compilation failed, no infolog ...

  6. SDWebImage 在Swift中遇坑解决

    首先SDWebImag的优点自行百度,大家都是懒人. 至于为啥不用swift的库.我怕swift升级后又是一堆红.不过如果你要使用Swift库Kingfisher是不错的选择 SDWebImage地址 ...

  7. phalcon安装-遇坑php-config is not installed 解决方法

    通过源码编译安装php环境,按照phalcon官方文档安装扩展,会遇到php-config is not installed的坑. 尝试通过下列命令可以解决: 1 cd /opt/cphalcon-3 ...

  8. 登录页跳转时保存用户信息-遇坑记

    项目中遇到的问题,重新建前端界面,遇到了这个问题. 项目中使用Angular JS + admin LTE + bootstrap3 保存用户信息,我有两种思路,一个是使用Angular JS-ser ...

  9. mpvue返回上一个页面_Mpvue+Vant-Weapp开发小程序遇坑之解决系列

    嗨,我是Kit,我来分享Mpvue小程序的踩坑问题,以及如何引入Vant-Weapp,下面开始我的表演,如有问题,可以写在下面的评论里面,只接受建议不接受评论,我很骄傲的~哈哈 相比很多时候我们写东西 ...

最新文章

  1. Oracle DBMS_STATS 包 和 Analyze 命令的区别
  2. 从比特大陆AI芯片入局智慧城市看阿里腾讯的城市“攻坚战”...
  3. 将数组中的值按逆序重新存放
  4. 使用DelayExchange
  5. 关于memcpy和memmove两函数的区别
  6. c语言中如何确保一个程序是单例的_c++单例模式
  7. 【Java】Java字符串拼接的五种方法,哪种性能最好?
  8. shell php文件是否存在字符串中,shell 判断字符串是否存在数组中的实现示例
  9. Java连接数据库导致连接数占满
  10. 使用opencv和python进行智能图像处理pdf_OpenCV图像处理编程实例 PDF 高清版
  11. 基于php的实验室设备管理系统
  12. 常见14种手机传感器
  13. EN 12101-8:2011烟雾和热量控制系统防烟挡板—CE认证
  14. Spring的ioc控制反转
  15. Android6.0运行时权限处理
  16. MySQL分配内存多少合适_mysql 如何分配内存
  17. 数字化名词解释—数字化
  18. 华为正式发布鸿蒙开源是什么意思,重磅!狙击所有操作系统,华为正式发布鸿蒙OS,并宣布全面开源...
  19. Autofac之类型注册
  20. C primer plus编程练习-第7章

热门文章

  1. 【2019年03月29日】股票的滚动市盈率PE最低排名
  2. 循环神经网络RNN——利用LSTM对脑电波信号进行分类,Keras实现
  3. EXCEL 小tips
  4. Xorg屏幕旋转实现方式
  5. C++和java的异同点总结
  6. PHPWIND7.3.2设置伪静态方法
  7. XXL-Job Docker部署
  8. 亚马逊云科技软件开发工程师团队
  9. 微信小程序根据不同用户切换不同`TabBar`,简单易懂
  10. 计算机提高游戏运行速度的方法,怎么提高游戏运行速度