FreeRTOS---互斥量在printf的使用
1 #ifdef __GNUC__
2 #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
3 #else
4 #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
5 #endif
6
7 /*retargets the C library printf function to the USART*/
8 PUTCHAR_PROTOTYPE
9 {
10 HAL_UART_Transmit(&huart1,(uint8_t*)&ch, 1, 0xFFFF);
11 return ch;
12 }
1 void Debug_Printf(char *format, ...)
2 {
3 char buf_str[128];
4 va_list v_args;
5
6
7 va_start(v_args, format);
8 (void)vsnprintf((char *)&buf_str[0],
9 (size_t ) sizeof(buf_str),
10 (char const *) format,
11 v_args);
12 va_end(v_args);
13
14 /* 互斥信号量 */
15 osMutexWait(Mutex_printfHandle,osWaitForever);
16 printf("%s", buf_str);
17 osMutexRelease(Mutex_printfHandle);
18 }
1 /* definition and creation of vTask1 */
2 osThreadDef(vTask1, Task1, osPriorityNormal, 0, 256);
3 vTask1Handle = osThreadCreate(osThread(vTask1), NULL);
4
5 /* definition and creation of vTask2 */
6 osThreadDef(vTask2, Task2, osPriorityNormal, 0, 256);
7 vTask2Handle = osThreadCreate(osThread(vTask2), NULL);
8
9 void Task1(void const * argument)
10 {
11
12 /* USER CODE BEGIN Task1 */
13 /* Infinite loop */
14 for(;;)
15 {
16 Debug_Printf("Task1 is running,will be in the ready state!\n");
17 //printf("Task1 is running,will be in the ready state!\n");
18 osDelay(50);
19 }
20 /* USER CODE END Task1 */
21 }
22
23 /* Task2 function */
24 void Task2(void const * argument)
25 {
26 /* USER CODE BEGIN Task2 */
27 /* Infinite loop */
28 for(;;)
29 {
30 Debug_Printf("Task2 is running!\n");
31 //printf("Task2 is running!\n");
32 osDelay(50);
33 }
34 /* USER CODE END Task2 */
35 }
直接使用printf输出不做临界保护输出的打印信息如下,有时出现输出打印信息不完整。
使用Debug_Printf打印信息如下: