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打印信息如下:

 

posted @ 2019-08-29 16:47  M&D  阅读(3373)  评论(0编辑  收藏  举报