首页 > 代码库 > μCOS-II系统之事件(event)的使用规则及Semaphore的互斥量用法

μCOS-II系统之事件(event)的使用规则及Semaphore的互斥量用法

***************************************************************************************************************************
作者:EasyWave                                                时间:2014.05.31

类别:μC/OS-II-操作系统                                  声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:μC/OS-II系统Semaphore事件简介

在实时多任务系统中,信号量被广泛用于:任务间对共享资源的互斥、任务和中断服务程序之间的同步、任务之间的同步。当任务调用OSSemPost()函数发送信号量时:

当信号量值大于0,任务调用OSSemPend()函数接收信号量时:


当信号量值等于0,任务调用OSSemPend()函数接收信号量时:


二:Semaphore用作互斥量实例及代码

那么如何使用Semaphore来用作互斥量来使用呢,只需要在建立Semaphore时,设置SemMutex = OSSemCreate(1);,如下:


下面以Nuvoton的NUC140为例说明Semaphore用作互斥量的使用:


主函数里面只有做一些简单的初始化和OS环境建立。下面是Semaphore的实例代码:

#ifndef	_TASK_C
#define	_TASK_C

/*-----------------------------------------------------------------------------------------*/
/*                                                                                         */
/* Copyright (c)EasyWave. All rights reserved.                                             */
/*                                                                                         */
/*-----------------------------------------------------------------------------------------*/


//===========================================================================================
// 						INCLUDE FILES														 
//===========================================================================================
#include "SYS_Header.H"
#include "BSP_Header.H"
#include "DRV_Header.H"
#include "UOS_Header.H"
#include "Task.H"

/* *************************************************************************************** */
/* 					 	         PUBLIC VARIABLE                               			   */
/* *************************************************************************************** */
#define	TASK1_PRIO 				1	 	// TASK1_PRIO < OS_LOWEST_PRIO
#define	TASK2_PRIO				2		// TASK2_PRIO < OS_LOWEST_PRIO

OS_STK	Task1Stack[OS_MAX_STACK];      	// for task1 stack size
OS_STK	Task2Stack[OS_MAX_STACK];      	// for task2 stack size
OS_EVENT	*SemMutex;
UINT32	Critical1, Critical2;

/* *************************************************************************************** */
/* 					 	         DEBUG MARCO                                  			   */
/* *************************************************************************************** */
#ifdef ENABLE_DEBUG
    #define	TASK_DEBUG(x)	  x
#else
    #define	TASK_DEBUG(x)
#endif

/*-----------------------------------------------------------------------------------------*/
/*                      PUBLIC FUNCTION                                                    */
/*-----------------------------------------------------------------------------------------*/
//===========================================================================================
// Function		: OSTaskInitial
// Purpose		: None
// Input		: None
// Rteurn		: None
// External		: None
// History		: EasyWave 2011-11-16 Create
//
// Modify		: None
//===========================================================================================
VOID OSTaskInitial(VOID)
{
	OSTaskCreate( MainTask1, (void*)0, &Task1Stack[OS_MAX_STACK-1], TASK1_PRIO );
	OSTaskCreate( MainTask2, (void*)0, &Task2Stack[OS_MAX_STACK-1], TASK2_PRIO );

	Critical1 = 0x00;
	Critical2 = 0x00;
}

//===========================================================================================
// Function		: MainTask1
// Purpose		: None
// Input		: None
// Rteurn		: None
// External		: None
// History		: EasyWave 2011-11-16 Create
//
// Modify		: None
//===========================================================================================
VOID MainTask1(VOID *pdata)
{
	INT8U	err;

	(VOID)pdata; 

	SemMutex = OSSemCreate(1);		//Create semaphore with 1 tokens
 
	while(TRUE)
	{
		OSSemPend(SemMutex, INFINITE, &err);
		TASK_DEBUG(DrvSIO_printf("%s is Running.\r\n",__FUNCTION__));
 		Critical1 ++;
		OSTimeDly(20);
		Critical2 ++;
		OSSemPost(SemMutex);
	}
}

//===========================================================================================
// Function		: MainTask2
// Purpose		: None
// Input		: None
// Rteurn		: None
// External		: None
// History		: EasyWave 2011-11-16 Create
//
// Modify		: None
//===========================================================================================
VOID MainTask2(VOID *pdata)
{
	INT8U	err;

	(VOID)pdata; 

	while(TRUE)
	{
		TASK_DEBUG(DrvSIO_printf("%s is Running.\r\n",__FUNCTION__));
		OSSemPend(SemMutex, INFINITE, &err);
		if(Critical1 != Critical2)
		{
			TASK_DEBUG(DrvSIO_printf("Mutex error\n"));
			while(TRUE);
		}
		else
		{
			TASK_DEBUG(DrvSIO_printf("Mutex Works Well.\r\n"));
		}
		Critical1 ++;
		Critical2 ++;
		OSSemPost(SemMutex);
	}
}



#endif	//_TASK_C
代码的意思,自行分析吧,这个博文已经分析的很清楚了。