使用互斥体有什么问题?显然,您需要某种方法来防止这三个任务同时访问UART,互斥体是实现这一点的明显方法。
最简单的方法是将所有UART功能(包括互斥)移动到一个函数中,从而从单个任务中消除这种“复杂性”:
static StaticSemaphore_t uart_mutex;
static SemaphoreHandle_t h_uart_mutex = NULL;
void init_mutex(void) // Called before tasks are created
{
h_uart_mutex = xSemaphoreCreateMutexStatic ( &uart_mutex );
}
void send_string(const char *str)
{
xSemaphoreTake(h_uart_mutex, ( TickType_t ) 1000);
HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen(str), 100);
xSemaphoreGive(h_uart_mutex);
}
void StartTask02(void const * argument)
{
/* Infinite loop */
for(;;)
{
send_string("T2\r\n");
osDelay(1000);
}
}
另一种方法是有一个消息队列,你的任务将字符串输入其中,另一个任务将字符串读出并发送到UART。但在我看来,这甚至更复杂,在内部,它可能无论如何都在使用互斥体来保护队列。