博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
μCOS-II系统之事件(event)的使用规则及Semaphore实例
阅读量:5819 次
发布时间:2019-06-18

本文共 4569 字,大约阅读时间需要 15 分钟。

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

作者: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_PRIOOS_STK	Task1Stack[OS_MAX_STACK];      	// for task1 stack sizeOS_STK	Task2Stack[OS_MAX_STACK];      	// for task2 stack sizeOS_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
代码的意思,自行分析吧,这个博文已经分析的非常清楚了。

你可能感兴趣的文章
win8 关闭防火墙
查看>>
Android实例-录音与回放(播放MP3)(XE8+小米2)
查看>>
CSS——(2)与标准流盒模型
查看>>
MYSQL 基本SQL语句
查看>>
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
shell编程笔记六:实现ll命令
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
[nodejs] nodejs开发个人博客(五)分配数据
查看>>
《Linux内核修炼之道》 之 高效学习Linux内核
查看>>
Java数据持久层框架 MyBatis之API学习九(SQL语句构建器详解)
查看>>
DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾
查看>>
iOS 解决UITabelView刷新闪动
查看>>
让前端小姐姐愉快地开发表单
查看>>
Web前端JQuery入门实战案例
查看>>
shell编程前言(一)
查看>>
JSON前后台简单操作
查看>>
shell中一些常见的文件操作符
查看>>