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



  • 相关阅读:
    【Java集合】-- LinkedList源码解析
    【Java集合】--ConcurrentHashMap源码解析
    【Java集合】--ConcurrentHashMap源码解析
    【Java集合】-- CopyOnWriteArrayList源码解析
    【Java集合】-- CopyOnWriteArrayList源码解析
    【Java集合】-- ArrayList源码解析
    【Java集合】-- ArrayList源码解析
    【Java集合】-- HashMap源码解析
    工厂模式和抽象工厂模式
    常见的排序算法整理
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10572744.html
Copyright © 2020-2023  润新知