FreeRTOS_信号量(二值信号量、计数型信号量、互斥信号量和递归互斥信号量)

原创
09/27 11:22
阅读数 461

一、二值信号量

    (一)创建二值信号量

    函数原型:

SemaphoreHandle_t xSemaphoreCreateBinary( void );

    参数

    返回值:NULL,二值信号量创建失败;

                   其他值,创建成功的二值信号量句柄。

    示例:

SemaphoreHandle_t xSemaphore;
/* 创建一个二值信号量 */
xSemaphore = xSemaphoreCreateBinary();

    (二)释放信号量

    1. 在任务中使用

    函数原型:

BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );

   参数:

    xSemaphore :要释放的信号量句柄;

    返回值:pdPASS,释放信号量成功;

                  errQUEUE_FULL,释放信号量失败。

    示例:

void vATask( void * pvParameters )
{
	for(;;)
	{
		/* 释放二值信号量 */
		xSemaphoreGive( xSemaphore );
		vTaskDelay(1000);
	}
}

    2. 在中断中使用

    函数原型:

BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore,
								  BaseType_t *pxHigherPriorityTaskWoken );

   参数:

    xSemaphore:要释放的信号量句柄;

    pxHigherPriorityTaskWoken:标记退出该函数以后是否进行任务切换,当该值为pdTRUE的时候在退出中断服务函数之前必须进行一次任务切换;

    返回值:pdPASS,释放信号量成功;

                  errQUEUE_FULL,释放信号量失败。

    示例:

void anInterruptHandler( void )
{
	BaseType_t xHigherPriorityTaskWoken = pdFALSE;
	
	xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
	
	portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}

    (三)获取信号量

    1. 在任务中使用

    函数原型:

BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );

   参数:

    xSemaphore:要获取的信号量句柄;

    xTicksToWait :阻塞时间;

    返回值:pdTRUE,获取信号量成功;

                  pdFALSE,超时,获取信号量失败。

    示例:

void vATask( void * pvParameters )
{
	for(;;)
	{
		/* 获取信号量 */
		if(xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE)
		{
			/* 成功获取到信号 */
		}
	}
}

    2. 在中断中使用

    函数原型:

BaseType_t xSemaphoreTakeFromISR( SemaphoreHandle_t xSemaphore,
								  signed BaseType_t *pxHigherPriorityTaskWoken );

    参数:

    xSemaphore:要获取的信号量句柄;

    pxHigherPriorityTaskWoken :标记退出该函数以后是否进行任务切换,当该值为pdTRUE的时候在退出中断服务函数之前必须进行一次任务切换;

    返回值:pdPASS,获取信号量成功;

                   pdFALSE,获取信号量失败。

    示例:

void anInterruptHandler( void )
{
	BaseType_t xResult, xHigherPriorityTaskWoken = pdFALSE;
	
	xResult = xSemaphoreTakeFromISR( xSemaphore, &xHigherPriorityTaskWoken );
	
	if(xHigherPriorityTaskWoken == pdTRUE)
	{
		portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
	}
	if(xResult == pdPASS)
	{
		/* 获取到信号量 */
	}
}

二、互斥信号量

    (一)创建互斥信号量

    函数原型:

SemaphoreHandle_t xSemaphoreCreateMutex( void );

    参数:

    返回值:NULL,互斥信号量创建失败;

                  其他值,创建成功的互斥信号量的句柄。   

    示例:

SemaphoreHandle_t xSemaphore;
xSemaphore = xSemaphoreCreateMutex();

    (二)释放互斥信号量

        同上。

    (三)获取互斥信号量

        同上。

三、递归互斥信号量

    (一)创建递归互斥信号量

    函数原型:

SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void );

    参数:

    返回值:NULL,递归互斥信号量创建失败;

                   其他值,创建成功的递归互斥信号量的句柄。

    示例:

SemaphoreHandle_t xSemaphore;
xSemaphore = xSemaphoreCreateRecursiveMutex();

    (二)释放递归互斥信号量

    函数原型:

BaseType_t xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex );

    参数:

    xMutex :要释放信号的递归互斥信号量的句柄;

    返回值:pdPASS,递归互斥信号释放成功;

                  pdFAIL,递归互斥信号释放失败。

    示例:

void vATask( void * pvParameters )
{
	for(;;)
	{
		/* 释放信号量 */
		xSemaphoreGiveRecursive( xSemaphore );
		vTaskDelay(1000);
	}
}

    (三)获取递归信号量

    函数原型:

BaseType_t xSemaphoreTakeRecursive( SemaphoreHandle_t xMutex,
									TickType_t xTicksToWait );

   参数:

    xMutex:要获取信号的递归互斥信号量的句柄;

    xTicksToWait :阻塞时长;

    返回值:pdPASS,获取成功;

                   pdFAIL,获取失败。            

    示例:

void vATask( void * pvParameters )
{
	for(;;)
	{
		/* 获取信号量 */
		if(xSemaphoreTakeRecursive( xMutex, 10 )== pdTRUE)
		{
			/* 成功获取到信号 */
		}
	}
}

 

 

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部