版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/wavemcu/article/details/27798493

***************************************************************************************************************************
作者:EasyWave                                                时间:2014.05.31

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

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

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

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

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

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

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

二:Semaphore用作相互排斥量实例及代码

那么怎样使用Semaphore来用作相互排斥量来使用呢,仅仅须要在建立Semaphore时。设置SemMutex = OSSemCreate(1);,例如以下:

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

以下以Nuvoton的NUC140为例说明Semaphore用作相互排斥量的使用:

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

主函数里面仅仅有做一些简单的初始化和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的相互排斥量使用方法的更多相关文章

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

    **************************************************************************************************** ...

  2. linux系统编程:线程同步-相互排斥量(mutex)

    线程同步-相互排斥量(mutex) 线程同步 多个线程同一时候訪问共享数据时可能会冲突,于是须要实现线程同步. 一个线程冲突的演示样例 #include <stdio.h> #includ ...

  3. C#事件(event)解析

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

  4. 事件[event]_C#

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

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

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

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

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

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

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

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

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

  9. C# 事件 event 【转】

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

随机推荐

  1. maven+tomcat热部署

    1.首先修改tomcat安装目录下的conf文件夹中的tomcat-user.xml文件 <role rolename="manager-gui"/> <role ...

  2. [转]Upgrading to Async with Entity Framework, MVC, OData AsyncEntitySetController, Kendo UI, Glimpse & Generic Unit of Work Repository Framework v2.0

    本文转自:http://www.tuicool.com/articles/BBVr6z Thanks to everyone for allowing us to give back to the . ...

  3. UEditor图片焦点错位,火狐document.body.scrollTop不管用的问题

    转自 http://liyunpeng.iteye.com/blog/2068751 关于 document.body.scrollTop 在火狐浏览器中不管用的问题 看网上有人写通过判断docume ...

  4. Docker学习(四): 操作容器

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  5. [C#]浅谈协变与逆变

    看过几篇说协变与逆变的博客,虽然都是正确无误的,但是感觉都没有说得清晰明了,没有切中要害.那么我也试着从我的理解角度来谈一谈协变与逆变吧. 什么是协变与逆变 MSDN的解释:https://msdn. ...

  6. 五:SpringCloud-Zuul

    九:zuul路由网关 1.概述 1.1 是什么 Zuul包含了对请求的路由和过滤两个最主要的功能: 其中==路由功能==负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础. 而==过 ...

  7. 撩课-MySQL详解1-数据库简介

    学习地址:[撩课-JavaWeb系列1之基础语法-前端基础][撩课-JavaWeb系列2之XML][撩课-JavaWeb系列3之MySQL][撩课-JavaWeb系列4之JDBC][撩课-JavaWe ...

  8. groovy集合

    groovy集合可以直接在语言中使用,因为它默认已经导入包了. 不需要初始化对象,也不需要专门的类. 集合是groovy语言本地成员.Groovy语法提供了本地列表和相应的映射. 每个Groovy集合 ...

  9. 前端动画小记---bilibili ( ゜-゜)つロ客户下载小动画

    逛哔哩哔哩 ( ゜-゜)つロPC版的时候看到一个蛮有意思的动画,指导用户去下载客户端,于是摸索实现了一个. 原动画效果 可以看到,一个静止的小电视人,当鼠标移动到电视人身上时,电视人慢慢变身成为一个小 ...

  10. css 各种常见布局整理

    在学习各种布局之前我们先来认识各个关键词,理解这些关键词,然后由点到面,这样就简单多了. display属性 页面中每个元素都有一个默认的display属性,它的值与该元素的类型有关,默认值通常是 b ...