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

作者: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. Android ShareSDKQQ 第三方登录so easy?

    昨天群里有个群友看到我之前做的那个qq第三方登录怎么做的,于是乎思考了一下,还是决定写一篇博客记录下.事实上都不难的,事实上之前我又写到FaceBook的第三方登录不知道看下这Android集成Fac ...

  2. activemq无法启动且后台管理界面进不去的解决办法

    从官网下载了一个最新的activemq,目前最新版本是5.14.5 我下载的是windows版本,通过执行%activemq home%/bin/win64/InstallService.bat,可以 ...

  3. 在MyEclipse中配置Weblogic10服务器

    MyEclipse中配置Weblogic10服务器 在MyEclipse中配置Weblogic10服务器也是很简单,现在将过程分享给有需要的人. 1.在下方的Server选项卡中,鼠标右键选择“Con ...

  4. TQ2440烧写方法总结

    USB烧写 接线:需要连接串口线.USB下载线和电源线. 软件:USB转串口驱动(因为现在的笔记本上一般都没有串口).USB下载驱动和DNW. 网络烧写 接线:需要连接串口线.网线和电源线. 软件:T ...

  5. [2014.5.13][Ubuntu] Ubuntu 14.04STL 出现NTFS分区无法訪问的问题

    5.12 为了给学生改论文,在UPC上登录了Windows 8.1,晚上正常关机.今日切换登陆Ubuntu 14.04分区,发现原来能够正常訪问的windows下的NTFS分区都被锁死.提演示样例如以 ...

  6. vue 常见报错问题

    情况一:http://eslint.org/docs/rules/no-tabs  Unexpected tab character 解决方案:缩进是4个空格,而不是tab,设置indent 情况二 ...

  7. 在Ubuntu Server是配置iptables防火墙

    iptables 是一个安装在Ubuntu Server上的默认防火墙.在正常的ubuntu安装过程中,iptables是被安装上了的,但是它默认允许所有的流量(不管防火墙是否是无效的) 关于ipta ...

  8. 光驱在资源管理器显示黄色感叹号的解决方法BIOS内有 系统下没有

    1. 点开“开始”-运行regedit.exe,进入注册表编辑器,到左边的项目栏里找到HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control\Clas ...

  9. win7官方下载地址

    win7官方下载地址 http://microsoftstore.me/category/microsoft/windows/

  10. 公钥私钥与SSL的握手协议(转)

    一,公钥私钥1,公钥和私钥成对出现2,公开的密钥叫公钥,只有自己知道的叫私钥3,用公钥加密的数据只有对应的私钥可以解密4,用私钥加密的数据只有对应的公钥可以解密5,如果可以用公钥解密,则必然是对应的私 ...