【FreeRTOS】小白进阶之如何使用FreeRTOS互斥信号量(三)

简析互斥信号量的使用基础。

1、头文件声明

#include 
#include 
#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 );
	}
}

 

你可能感兴趣的:(FreeRTOS系统开发)