版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liwei16611/article/details/82596706
简析互斥信号量的使用基础。
1、头文件声明
#include <stdio.h>
#include <conio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "supporting_functions.h"
static void prvPrintTask( void *pvParameters );
// 使用互斥信号量保护 stdout 输出
static void prvNewPrintString( const char *pcString );
SemaphoreHandle_t xMutex;
// 用于随机延时 0ms - 0x20ms
const TickType_t xMaxBlockTimeTicks = 0x20;
2、启动任务
int main( void )
{
// 创建互斥信号量
xMutex = xSemaphoreCreateMutex();
if( xMutex != NULL )
{
// 创建任务
xTaskCreate( prvPrintTask, "Print1", 1000, "Task 1 ******************************************\r\n", 1, NULL );
xTaskCreate( prvPrintTask, "Print2", 1000, "Task 2 ------------------------------------------\r\n", 2, NULL );
vTaskStartScheduler();
}
for( ;; );
return 0;
}
3、任务函数和互斥信号量使用
// stdout 打印函数
static void prvNewPrintString( const char *pcString )
{
xSemaphoreTake( xMutex, portMAX_DELAY );
{
printf( "%s", pcString );
fflush( stdout );
}
xSemaphoreGive( xMutex );
if( _kbhit() != 0 )
{
vTaskEndScheduler();
}
}
static void prvPrintTask( void *pvParameters )
{
char *pcStringToPrint;
const TickType_t xSlowDownDelay = pdMS_TO_TICKS( 5UL );
pcStringToPrint = ( char * ) pvParameters;
for( ;; )
{
prvNewPrintString( pcStringToPrint );
// 随机延时
vTaskDelay( rand() % xMaxBlockTimeTicks );
vTaskDelay( xSlowDownDelay );
}
}