本帖最后由 Superusrss 于 2024-10-7 23:09 编辑
发现一个信号量无法发生阻塞的问题,直接运行打印会发生后来数据覆盖为发送数据的问题,表现为乱码
创建信号量
[C] 纯文本查看 复制代码 TX_MUTEX uart2_mutex;
tx_mutex_create(&uart2_mutex, "uart2_mutex", TX_INHERIT);
使用信号量
[C] 纯文本查看 复制代码 void print_uart2(const char *format, ...)
{
uint16_t len;
va_list args;
va_start(args, format);
// 若使用串口自带标志阻塞就没有问题
// while (huart2.gState != HAL_UART_STATE_READY)
// ;
// len = vsnprintf((char*)UartTxBuf,sizeof(UartTxBuf)-1,(char*)format,args);
// 若使用信号量,则即使没有mutexput, 也不会阻塞
ret = tx_mutex_get(&uart2_mutex, TX_WAIT_FOREVER);
xsnprintf((char *)&UartTxBuf[0], RX_BUFFER_SIZE_UART1, (const char *)format, args);
len = strlen((char *)UartTxBuf);
va_end(args);
HAL_UART_Transmit_IT(&huart2, UartTxBuf, len);
}
中断回调函数中释放信号量
[C] 纯文本查看 复制代码 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
return;
}
else if (huart->Instance == USART2)
{
if (_tx_thread_system_state == TX_INITIALIZE_IS_FINISHED)
{
// 我把下面释放信号量注释掉,上面就没有信号量了,理论上应该发生阻塞
// ret = tx_mutex_put(&uart2_mutex);
}
}
}
|