在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")
有人遇到过此类情况吗?
不吝赐教。
`HAL_UART_Transmit_IT`函数只是准备在中断中发送,调用完后就退出了,但是数据还没发送出去的。后面要等待发送完成才行。你那没等待肯定数据被冲掉了。在中断回调函数搞个标志,等在标志变化。
HAL_UART_Transmit是调用后会等待发送完成之后才退出的。
给你两点提醒:
第一点,当我们使用FREERTOS时,SYSTICK定时器一般都是给RTOS使用作为其任务调度滴答时钟,而HAL库函数
使用的滴答时钟往往会换成片内其它定时器外设,比如TIM6 TIM7这些基本定时器;
第二点,中断方式和非中断方式的通信函数的使用,要注意程序逻辑上的差异,一个触发式,一个是死等查询式; 楼上说的是正解,如果需要用中断的话,建议加发送队列进行数据传输。保证前面的数据不会被覆盖掉。
页:
[1]