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

版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/wavemcu/article/details/27798493

***************************************************************************************************************************
作者: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.
",__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.
",__FUNCTION__));
		OSSemPend(SemMutex, INFINITE, &err);
		if(Critical1 != Critical2)
		{
			TASK_DEBUG(DrvSIO_printf("Mutex error
"));
			while(TRUE);
		}
		else
		{
			TASK_DEBUG(DrvSIO_printf("Mutex Works Well.
"));
		}
		Critical1 ++;
		Critical2 ++;
		OSSemPost(SemMutex);
	}
}



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



原文地址:https://www.cnblogs.com/mqxnongmin/p/10572744.html