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

时间:2023-03-08 22:33:03
μCOS-II系统之事件(event)的使用规则及Semaphore的相互排斥量使用方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

那么怎样使用Semaphore来用作相互排斥量来使用呢,仅仅须要在建立Semaphore时。设置SemMutex = OSSemCreate(1);,例如以下:

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2F2ZW1jdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2F2ZW1jdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

主函数里面仅仅有做一些简单的初始化和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

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