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

作者:EasyWave                                                时间:2014.05.31

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

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

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

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

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

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

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2F2ZW1jdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

注意:μ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实例的更多相关文章

  1. μCOS-II系统之事件(event)的使用规则及Semaphore的相互排斥量使用方法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wavemcu/article/details/27798493 ****************** ...

  2. C#事件(event)解析

    事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...

  3. 事件[event]_C#

    事件(event): 1.       事件是类在发生其关注的事情时用来提供通知的方式.例如,封装用户界面控件的类可以定义一个在单击该控件时发生的事件.控件类不关心单击按钮时发生了什么,但它需要告知派 ...

  4. JavaScript 获取按键,并屏蔽系统 Window 事件

    // JavaScript 获取按键,并屏蔽系统 Window 事件 window.document.onkeydown = onkeydown; function onkeydown(event) ...

  5. Yii2基本概念之——事件(Event)

    说起事件(event),我们可是一点都不陌生.现实生活当中的事件无处不在,比如你发了一条微博,触发了一条事件,导致关注你的人收到了一条消息,看到你发的内容:比如你通过支付宝买东西,付了款,触发一个事件 ...

  6. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  7. 详解 Solidity 事件Event - 完全搞懂事件的使用

    很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用? 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊. ...

  8. C# 事件 event 【转】

    C#事件(event)解析   事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要, ...

  9. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

随机推荐

  1. 微信小程序 - 生命周期

    生命周期 1.小程序注册完成后,加载页面,触发onLoad方法.(切记,onShow和onLoad的区别,onShow是每当进入这个页面时就会触发,而onload是载入进来时才触发) 2.页面载入后触 ...

  2. nl命令(转)

    原文:http://www.cnblogs.com/peida/archive/2012/11/01/2749048.html nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容 ...

  3. HDU 2883 kebab(最大流)

    HDU 2883 kebab 题目链接 题意:有一个烧烤机,每次最多能烤 m 块肉.如今有 n 个人来买烤肉,每一个人到达时间为 si.离开时间为 ei,点的烤肉数量为 ci,每一个烤肉所需烘烤时间为 ...

  4. U872-结算成本处理步骤及索引处理

    U872每月都须要做月结,对于制造企业来说,结算成本处理是不可缺少的一个处理环节,每次查询出来待暂估记录也比較多(我接触到的有3万左右),暂估时间一般要2-3小时左右,若调用的大表索引碎片多时,会须要 ...

  5. loadrunner运行乱码解决方法

    最近进行项目压力测试,选择用loadrunner来进行测试,当在回放时间,脚本中的中文由乱码.快照,经研究,经过一下3步可以解决,分享一下 第一步:当在进行新建脚本时间,选择选项中-〉高级-〉选择“支 ...

  6. JavaScript 纯粹对象

    JavaScript 纯粹对象 1.定义: 通过 "{}" 或者 "new Object" 创建的对象,像new Date(),new String()都不是纯 ...

  7. grid++ 开发教程

      grid++ 开发教程 CreateTime--2018年4月24日18:43:23 Author:Marydon 1.插入报表头.明细网格.报表尾 右键-->插入-->报表节--&g ...

  8. java开发工具之myeclipse调优

    -vmargs -Xms512m //堆的最小值-Xmx512m //堆的最大值(两者设置相同,避免运行时的自动扩张)-XX:PermSize=256m //永久代的最小值 -XX:MaxPermSi ...

  9. 关于android屏幕适配的问题(drawable-xxxxxxxx,dp,sp,px等等),偶尔看到了android源代码,关于dpi的区分的值

    上一篇博客说了一下.9.png图片http://blog.csdn.net/qq_23195583/article/details/46737419 当然,点九的是指的能够进行拉伸的.那么假设图片不能 ...

  10. 用JSON-server模拟REST API

    来源于: 用JSON-server模拟REST API(一) 安装运行 用JSON-server模拟REST API(二) 动态数据 用JSON-server模拟REST API(三) 进阶使用 在开 ...