• μCOS-II系统之事件(event)的使用规则及Semaphore实例


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

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

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

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

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

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

    当任务调用OSSemPost()函数发送信号量时:


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


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


    注意:μC/OS-II不同意在中断服务程序中等待信号量。

    1):任务间同步
    在实际的应用中。 经常使用信号量实现任务间的同步,OSSemPend()和OSSemPost()会出如今不同任务的不同函数中。但不一定成对出现。


    注意:在实际的应用中。还有多对多、一对多信号量操作的情况,但非常不常见。建议读者不要设计出这种操作方式,由于这样会带来非常多的麻烦。


    2): 资源同步
    在嵌入式系统中。常常使用信号量訪问共享资源来实现资源同步。在使用时,注意发送信号量函数OSSemPost()与等待信号量函数OSSemPend()必须成对出如今同一个任务调用的函数中。才干实现资源同步。


    二:Semaphore实例及代码


    以下以演示样例来说明怎样现实ISR与任务间同步。如果定时器1中断服务程序发送信号量,任务完毕了信号量的创建并在接收到信号量后让蜂鸣器响一声。

    处理流程例如以下:


    中断服务程序ISR演示样例代码例如以下:


    以下以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	*SemSync;;
    
    /* *************************************************************************************** */
    /* 					 	         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 );
    }
    
    //===========================================================================================
    // Function		: MainTask1
    // Purpose		: None
    // Input		: None
    // Rteurn		: None
    // External		: None
    // History		: EasyWave 2011-11-16 Create
    //
    // Modify		: None
    //===========================================================================================
    VOID MainTask1(VOID *pdata)
    {
    	SemSync = OSSemCreate(0);		//Create semaphore with Zero tokens
    
    	while(TRUE)
    	{
    		OSTimeDly(50);
    		TASK_DEBUG(DrvSIO_printf("Semaphore Release.
    "));
    		OSSemPost(SemSync);		
    	}
    }
    
    //===========================================================================================
    // Function		: MainTask2
    // Purpose		: None
    // Input		: None
    // Rteurn		: None
    // External		: None
    // History		: EasyWave 2011-11-16 Create
    //
    // Modify		: None
    //===========================================================================================
    VOID MainTask2(VOID *pdata)
    {
    	INT8U	err;
    	
    	while(TRUE)
    	{
    		TASK_DEBUG(DrvSIO_printf("Semaphore Get.
    "));
    		OSTimeDly(50);
    		OSSemPend(SemSync, INFINITE, &err);
    	}
    }
    
    
    
    #endif	//_TASK_C
    

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

  • 相关阅读:
    leecode 91. 解码方法
    leecode 166. 分数到小数
    剑指 Offer 31. 栈的压入、弹出序列
    leecode 386. 字典序排数
    LeetCode 311 稀疏矩阵的乘法
    leecode 89. 格雷编码
    leecode 79. 单词搜索
    leecode 207. 课程表
    QT -- 解决:Error: Could not decode "*.cpp" with "UTF-8"
    VS+QT -- 没有PRO文件的问题
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7352340.html
Copyright © 2020-2023  润新知