μ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

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

μCOS-II系统之事件(event)的使用规则及Semaphore的互斥量用法,布布扣,bubuko.com

时间: 2024-10-03 22:54:08

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

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

*************************************************************************************************************************** 作者:EasyWave                                                时间:2014.05.31 类别:μC/OS-II-操作系统                                  声明:

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

*************************************************************************************************************************** 作者:EasyWave                                                时间:2014.05.31 类别:μC/OS-II-操作系统                                  声明:

临界区,互斥量,信号量,事件的区别(线程同步)

(转)临界区,互斥量,信号量,事件的区别(线程同步) (转)临界区,互斥量,信号量,事件的区别(线程同步) . 分类: C++ windows 核心编程 2012-04-10 14:55 3321人阅读 评论(0) 收藏 举报 semaphoremfcnulleventsthreadhttp服务器 四种进程或线程同步互斥的控制方法 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个

C#事件(event)解析

事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来. 先来看看事件编程有哪些好处. 在以往我们编写这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测某些判断变量,而引入事件编程后,大大简化了这种过程: - 使用事件,可以很方

python38 1.线程一堆队列 2.事件Event 3.协程 4.断点续传

复习 1.GIL锁 2.如何避免GIL锁给程序带来的效率影响 3.与自定义锁的区别 4. 线程池进程池 5 同步  异步 6.异步回调 1.GIL锁 ? 全局解释器锁,   用来锁住解释器的互斥锁 ? 为啥加: CPython 中内存管理是非线程安全的,  GIL是为了   保护解释器的数据不被并发修改 ? 加锁后的问题:导致多个线程无法并行执行, 降低了效率 ? 当然 是可以并发的 ? 2.如何避免GIL锁给程序带来的效率影响 ? 什么时候会影响效率 ?  如果是计算密集型任务,开多线程不能提

Nios II 系统从EPCS器件中启动的设置过程

先Reset Vector EPCS Exception Vector Ram工程Program memory ,Read-only data memory...均为RAM.Hardware Image选择 EPCS编译.编译:先把POF文件下载到EPCS中.放到最底层后通过FLASH PROGRAMER 将工程和.SOF文件下载到EPCS中复位启动即可. Nios II 系统从EPCS器件中启动的设置过程,布布扣,bubuko.com

学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcElement(触发事件的事件源对象)和attachEvent("onclick",function(){...}); 2. a. 实现拖放(Drag and Drop): 目前支支持IE, 若定制某对象为可拖放对象, 则必须覆盖目标对象的dragenter和dragover事件, 可以用e

[数据库] Navicat for MySQL事件Event实现数据每日定期操作

在我们操作数据库过程中,通常会遇到一些某个时间点操作数据库的问题,例如:        (1).每天凌晨12点对数据库进行定时备份,结算和汇总:        (2).每天凌晨2点删除数据库前三天的数据:        (3).插入某个数据超过一定时间改变某个值的状态,比如预警系统.        这里就需要通过Event事件进行简单操作,下面将详细处理.你可能会想到通过触发器实现,但是如果是同一张表Insert插入数据后,但是触发器再进行Update更新操作是不行的,所以需要尝试通过Event

重温委托(delegate)和事件(event)

1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作参数传递. 不过delegate和函数指针还是有点区别的,delegate有许多函数指针不具备的优点. 首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数.在引 用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的