首页 > 代码库 > μ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代码的意思,自行分析吧,这个博文已经分析的很清楚了。