懒得起名1 发表于 2024-3-24 10:54:20

在FreeRTOS中串口重定向使用HAL库函数中断出现异常

由于需要使用到FreeRTOS 考虑到ISR优先级会比任务优先级高,并且查看`HAL_UART_Transmit`函数实现需要使用到systick 。

!(data/attachment/forum/202403/24/105216mb66n4oppkfb4x44.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "HAL_UART_Transmit.png")

!(data/attachment/forum/202403/24/105225kolo1xoxaye7az58.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "HAL_UARTUntil.png")

所以在重定义时使用了函数`HAL_UART_Transmit_IT`。但结果反而是IT函数出现异常。

!(data/attachment/forum/202403/24/105249q6uus6ooz0uqq8z9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "IT.png")

!(data/attachment/forum/202403/24/105257ccci4a4p4g1iiz12.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "IT_1.png")

而HAL_UART_Transmit正常输出

!(data/attachment/forum/202403/24/105346vkv52nn5rr77z8db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "NotIT.png")

有人遇到过此类情况吗?

不吝赐教。

落花又见流水 发表于 2024-3-24 11:15:27

`HAL_UART_Transmit_IT`函数只是准备在中断中发送,调用完后就退出了,但是数据还没发送出去的。后面要等待发送完成才行。你那没等待肯定数据被冲掉了。在中断回调函数搞个标志,等在标志变化。

HAL_UART_Transmit是调用后会等待发送完成之后才退出的。

xmshao 发表于 2024-3-25 09:40:11

给你两点提醒:


第一点,当我们使用FREERTOS时,SYSTICK定时器一般都是给RTOS使用作为其任务调度滴答时钟,而HAL库函数
使用的滴答时钟往往会换成片内其它定时器外设,比如TIM6 TIM7这些基本定时器;


第二点,中断方式和非中断方式的通信函数的使用,要注意程序逻辑上的差异,一个触发式,一个是死等查询式;

废鱼 发表于 2024-3-24 20:34:51

楼上说的是正解,如果需要用中断的话,建议加发送队列进行数据传输。保证前面的数据不会被覆盖掉。
页: [1]
查看完整版本: 在FreeRTOS中串口重定向使用HAL库函数中断出现异常