uart1_printf函数的作用是把数据发送到队列中,然后开中断。中断函数从队列中接收消息,接受完最后一个消息后后关闭中断。
假设当任务A在正在向对队列发送数据时被打断,进入任务B,也向同一对列发送数据,那么对列中的数据顺序就是乱的。这个函数是所谓的不可重入函数。但是通过增加二值信号量,给对列上一把锁,就可以成为可重入函数。注意获取信号的方式是阻塞式的。
void uart1_printf(const char *format, ...)
{
va_list args;
uint32_t str_cnt;
uint8_t* tmp=0;
if(osKernelRunning())
{
/*osWaitForever阻塞任务,解决不可重入问题*/
if (osOK != osSemaphoreWait (uart1_tx_semaphore, osWaitForever))
{
Error_Handler();
}
va_start(args, format);
str_cnt = vsprintf( (char *)USART1_TxBuffer, format, args);
tmp=USART1_TxBuffer;
while(str_cnt--)
{
uart1_send_byte(*(tmp++));
}
osSemaphoreRelease (uart1_tx_semaphore);
}
else
{
str_cnt = vsprintf( (char *)USART1_TxBuffer, format, args);
while(HAL_UART_Transmit_IT(&Uart1_Handle, (uint8_t*)USART1_TxBuffer, str_cnt)!= HAL_OK)
{
//Error_Handler();
}
}
}