μ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.\r\n"));
		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.\r\n"));
		OSTimeDly(50);
		OSSemPend(SemSync, INFINITE, &err);
	}
}

#endif	//_TASK_C

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

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

时间: 2024-10-06 07:17:18

μ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#事件(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不但保存了对此函数入口指针的引用,而且还保存了调用此函数的

【温故知新】c#事件event

从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以通过事件向其他类或对象通知发生的相关事情. 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”. event 关键字用于在发行者类中声明事件. 定义非常明确,通过事件向其他类或对象通知发生的相关事情,用来实现的观察者模式. 还是通过之前的代码例子,看看声明delegate和ev