STM32H7串口中断调用FreeRTOS API,导致程序卡死【杂记】

一、前言

在网络上搜寻了相关的问题,看一下其他人有没有碰到这个问题。实际上有较多CSDN的博主都碰到这个问题,但能把问题说清楚的博主真的很少。这篇CSDN博文解决了我的问题,只是中断的类型跟我不一样(我使用的是串口中断)。

二、串口中断调用xQueueSendFromISR

我计划将串口中断接收到的字节存放到FreeRTOS的消息队列里,代替裸机系统下的ringbuffer。

在这里插入图片描述

2.1、串口中断回调函数(usart.c)

在串口中断回调函数里,需要调用xQueueSendFromISR而不是xQueueSend。
在这里插入图片描述

2.2、stm32h7xx_it.c

将函数放进STM32系统中断的回调函数USART3_IRQHandler里,当串口3产生中断时,程序就会进入这个函数里面。
在这里插入图片描述

三、调试

3.1、串口中断后,程序卡死

进入MDK调试模式,找到程序卡死的位置。
在这里插入图片描述

3.2、卡死原因

FreeRTOS源码的注释里,对产生这个问题的原因进行了描述。
在这里插入图片描述
从上面的注释看来,大概的问题应该比较清楚了,就是因为中断优先级造成的

四、NIVC中断优先级

4.1、串口中断优先级

在这里插入图片描述

4.2、FreeRTOS配置文件的MAX_SYSCALL_INTERRUPT_PRIORITY

在这里插入图片描述

程序卡死的根本原因是串口的中断优先级比FreeRTOS配置文件上的MAX_SYSCALL_INTERRUPT_PRIORITY要高。在明白问题的本质后,就有解决问题的解决方案:

  1. 串口中断的中断优先级设置2(比MAX_SYSCALL_INTERRUPT_PRIORITY大一级)。
  2. 在不修改中断优先级的情况下,串口中断回调函数里不要调用FreeRTOS的API函数。
    在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 在STM32H7中,串口中断是通过配置中断优先级和编写中断处理函数来实现的。根据引用\[1\]和引用\[2\]的内容,程序卡的根本原因是串口中断优先级比FreeRTOS配置文件上的MAX_SYSCALL_INTERRUPT_PRIORITY要高。解决这个问题的方法是将串口中断中断优先级设置为比MAX_SYSCALL_INTERRUPT_PRIORITY低一级,并且在串口中断回调函数中避免调用FreeRTOSAPI函数。此外,根据引用\[3\]的内容,由于STM32的HAL库自动生成的中断处理函数UART_IRQHandler()没有对空闲中断进行处理,需要用户自行编写处理空闲中断的代码。 #### 引用[.reference_title] - *1* *2* [FreeRTOS | STM32H7串口中断调用FreeRTOS API导致程序卡](https://blog.csdn.net/wallace89/article/details/117754540)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [(End)STM32H7串口空闲中断接收+DMA调试(HAL库)](https://blog.csdn.net/weixin_42024702/article/details/113096340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值