首 页 » 程序开发 » HAL_UART_Receive_IT使用时的死锁问题

HAL_UART_Receive_IT使用时的死锁问题

[ 2017-05-04 14:02 | 浏览次数: 2,230次 | 1条评论 ]

STM32的HAL库是非常好的一个库, 用了会加快开发速度, 然而也会有很多意想不到的问题,
比如我遇到的HAL_UART_Receive_IT函数死锁问题

首先我的目的是在接收到串口的每一个字节时保存到缓存里并通知程序缓存有新东西了,
赶紧来取吧

代码如下

//在初始化中开启接受1个字节的中断
HAL_UART_Receive_IT(&huart1, (T_U8*)&g_uart_receive_byte, 1);


//在收到的callback函数中读取此字节,然后重新开启接受1个字节的中断
/**
  * @brief  Rx Transfer completed callbacks.
  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &huart1)
    {
        //get the byte
        DrvUartOnReceiveOneByteAtInterupt(g_uart_receive_byte);  
        //receive next byte
        HAL_UART_Receive_IT(huart, &g_uart_receive_byte, 1);        
    }
}

然而在以下这种情况下会发生HAL_UART_Receive_IT无效的情况

假设当前在使用HAL_UART_Transmit传输数据,其中在HAL_UART_Transmit里会进行加锁

/* Process Locked */
__HAL_LOCK(huart);

此时来了数据,进入了中断HAL_UART_RxCpltCallback,在中断里又继续调用
HAL_UART_Receive_IT来开启下一个数据接受中断,而在HAL_UART_Receive_IT里也会先进行加锁,
此时发现锁已经被HAL_UART_Transmit占用了,所以函数调用失败了,
结果以后就再也不会接受数据了

建议不要在中断里调用HAL_UART_Receive_IT,直接在中断里获取数据

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */
  if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE))
  {
    DrvUartOnReceiveOneByteAtInterupt(__HAL_UART_FLUSH_DRREGISTER(&huart1));
  }
}
您可以任意转载本文,但转载时请勿删除作者信息。
作者:hgyxbll,原文链接:http://shashanzhao.com/archives/1193.html
上一篇: | 下一篇:

沙发已经被占,赶紧抢板凳吧![点此发言]

  1. xkb
    2018-01-11 10:44

    do
    {
    ret = HAL_UART_Receive_IT(huart,(uint8_t *)&hlpuart1_buf.buffer[hlpuart1_buf.write&(hlpuart1_buf.size-1)],1);
    }
    while(ret != HAL_OK);
    这样设置会好一些

取消回复