uCOS-II信号量OSSemCreate(0)和OSSemCreate(1)详解

2023-10-30

ucos-II中,为了实现任务之间的同步,用到的同步机制有:信号量,邮箱和消息队列。其中这里我主要说下对信号量的使用经验。

信号量在创建时,调用OSSemCreate(INT16U cnt)函数。

cnt为信号量的初始值。对cnt赋予不同的值,所起到的作用不同。如果Semp = OSSemCreate(0), 该信号量表示等待一个事件或者多个事件的发生。

如果我们想对一个公共资源进行互斥访问,例如:

如果我们想让两个任务Task1和Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp = OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求此信号量,如果可用,则调用Fun(),然后再调用OSSemPost(Semp)释放该信号量。这里就实现了一个资源的互斥访问。(注:初始化OSSemCreate(1),那么一个任务中有OSSemPend,那么可以执行,执行之后cnt==0,其他任务的OSSemPend无法获得sem,只能等待,除非任务一有OSSemPost,使其cnt++,这样其他任务的Pend可以执行。)

同理,如果一个任务要等待n个事件发生后才能执行,则应定义为Semp = OSSemCreate(n)。然后在这n个任务分别运行时调用OSSemPost(Semp),直到这n个事件均发生后,这个任务才能运行。
OSSemCreate(cnt)赋初始值cnt,OSSemPend一次,cnt-- 一次,OSSemPost一次,cnt++一次。


1、OSSemCreate (0);
......
OS_EVENT *Fun_Semp;
......
Fun_Semp = OSSemCreate (0);
......
void  MyTask (void *pdata)
{
.....
    for (;;) 
    {                                           
        OSSemPend(Fun_Semp,0,&err); //请求信号量
   PC_DispStr(0,++y,  s1,  DISP_BGND_BLACK+DISP_FGND_WHITE );
        OSTimeDlyHMSM(0, 0, 1, 0);    //等待1秒
    }
}
......
void  YouTask (void *pdata)
{
......
    for (;;) 
    {           
     PC_DispStr(0,++y,  s2,  DISP_BGND_BLACK+DISP_FGND_WHITE );
     if(YouTaskRun==5)
           OSSemPost(Fun_Semp);  //发送信号量
     YouTaskRun++;            
       OSTimeDlyHMSM(0, 0, 2, 0);    //等待2秒
    }
}
在上例中,MyTask 一直在等待信号量,在信号量没有到来之前无法执行。只有在YouTask 运行了5次,YouTaskRun==5之后,OSSemPost(Fun_Semp);  //发送信号量,MyTask 才得以执行。如果按上例所示,MyTask 只能执行一次,因为YouTask 以后再也不可能使得YouTaskRun==5了。MyTask 也就因为无法得到信号量而不能运行。


2、OSSemCreate (1);
.....
OS_EVENT *Fun_Semp;
.....
Fun_Semp = OSSemCreate (1);
.....
void  MyTask (void *pdata)
{
..... 
    for (;;) 
    {                                           
        OSSemPend(Fun_Semp,0,&err); //请求信号量
   PC_DispStr(0,++y,  s1,  DISP_BGND_BLACK+DISP_FGND_WHITE );
   OSSemPost(Fun_Semp);  //发送信号量
        OSTimeDlyHMSM(0, 0, 1, 0);    //等待1秒
    }
}
void  YouTask (void *pdata)
{
    for (;;) 
    {                                           
        OSSemPend(Fun_Semp,0,&err); //请求信号量
   PC_DispStr(0,++y,  s2,  DISP_BGND_BLACK+DISP_FGND_WHITE );
   OSSemPost(Fun_Semp);  //发送信号量            
        OSTimeDlyHMSM(0, 0, 2, 0);    //等待2秒
    }
}
在上例中,MyTask、YouTask 都在 等待信号量,由于MyTask优先级高,首先得到信号量开始执行。此时YouTask 还在等待信号量。MyTask 执行完毕,OSSemPost(Fun_Semp);  //发送信号量。YouTask 得到信号量运行后发送信号量,如此反复。

http://www.zhixinrui.com/thread-1323-1-1.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uCOS-II信号量OSSemCreate(0)和OSSemCreate(1)详解 的相关文章

  • 电阻的精度和温漂

    转载自 http blog sina com cn s blog 68b345970100jc2h html 电阻的精度和温漂 1 电阻温度系数 TCR 表示电阻当温度改变1度时 电阻值的相对变化 当温度每升高1 时 导体电阻的增加值与原来
  • python 字符串去除 等等转义空格换行字符

    python去除html特殊转义字符 下面这些是一些我在网上找的一些 好像都不管用 网络上面的一些方法好像都不管用 比如 str text replace str text replace u xa0 等等一些 我使用的时候好像都不管用 下
  • 匿名内部类方式实现线程创建的三种方式

    小demo package demo04 author wh date 2021年08月30日15 57 匿名内部类方式实现线程创建的三种方式 public class demo02 public static void main Stri
  • 企业级springboot项目架构模板V4.0,开箱即用

    此次 4 0 更新点 1 添加线程池的使用 2 Springboot版本更新2 7 0 解决部分冲突的依赖 3 所有表结构去除 ID 字段 不在使用ID作为主键 主键直接使用算法生成 4 解决过滤器 引起Druid监控无法访问的问题 5 F
  • 3.4 流式操作

    1 简介 1 概念 Stream是数据渠道 用于操作数据源所生成的元素序列 它可以实现对集合的复杂操作 例如过滤 排序和映射等 集合是一种静态的数据结构 存储在内存中 而Stream是通过CPU来实现计算的 并不会存储数据 Stream不会
  • linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案

    1 问题描述 最近搭建的一个linux最小系统在运行到241秒时在控制台自动打印如下图信息 并且以后每隔120秒打印一次 仔细阅读打印信息发现关键信息是 hung task timeout secs 第一次遇到这样的问题 首先百度 通过翻看
  • 在 Java 中,读取 resources 下的文件方式(四种)

    1 测试文件具体位置 2 方式一 项目内路径 使用项目内路径读取 该路径只在开发工具中显示 所以只能在开发工具中使用 项目部署之后无法读取 不通用 SpringBootTest public class ResourcesFIleTest
  • 爱快路由器设置上网

    进入以太网络设置里面查看详细信息 也可cmdipconfig 找出网管 打开电脑的浏览器 地址栏输入 10 100 10 1 在登录界面爱快路由器帐号和密码 默认帐号 admin 默认密码 admin 点击登录 忘记密码可长按路由器重置键
  • rust入门材料清单

    rust book rustbook 配套视频教程 cargo 文档 crate io 标准库api 官方资料索引 rust 编程规范
  • js实现Math.sqrt()方法

    之前面试的时候 面试有一道题 要记算10的平方根 并且精确到0 01 我也是想了一会才想到了一种简单粗暴的方法 也算是完成了 squareRoot num gt let s 1 d 0 1 x 0 01 while s s
  • MyEclipse 8.0 中vssplugin的安装

    今天试用了myeclipse8 0 多了很多新特性 挺不错的 由于本司用的是vss库 所以vssplugin是必装项 可是安装的时候发布目录结构有所变动与myeclipse6 0有所区别 具体安装详见如下步骤 1 下载vss plugin
  • Python画爱心——谁能拒绝用代码敲出来会跳动的爱心呢~

    还不快把这份浪漫拿走 节日就快到来了 给Ta一个惊喜吧 今天给大家分享一个浪漫小技巧 利用Python中的 HTML 制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心 从里到外形成一个立体状 给人视觉上的冲击感 浪漫极了 V hw
  • div页面垂直居中方法方法

    基本思路 1 首们需要position absolute 绝对定位 而层的定位点 使用外补丁margin负值的方法 负值的大小为层自身宽度高度除以二 例子 一个层宽度是400 高度是300 使用绝对定位距离上部与左部都设置成50 而marg
  • 带你详细了解ADSS光缆

    ADSS 全介质自承式光缆 光缆是一种自支撑架空光缆 专为架空安装和部署而设计 适用于各种户外应用 本文将提供ADSS光缆的一些知识 什么是ADSS光缆 ADSS 光缆是一种光缆 其强度足以在结构之间支撑自身 而无需使用导电金属元件 该光缆

随机推荐

  • 创建qml自定义视频源(Qt5.15.2+设备帧)

    前言 若是看过笔者之前的文档 应该会注意到 笔者显示自定义视频 使用的是QQuickImageProvider和Image类型实现 本次笔者记录另一种显示方式 创建视频源 然后使用VideoOutput显示 因为Qt5和Qt6多媒体模块发生
  • QML自定义模块及qmldir的使用

    前言 在开发QtQuick项目中 当项目文件很多的情况下 可能会分成多级文件夹来进行分类 还有一些通用类型文件 如公共组件 通用配置等等 需要在各个不同的文件中进行调用 这种情况下 一种方式是在当前需要引用的文件中通过关键字import 加
  • TCP-三次握手

    文章目录 三次握手 简单示意图 详细分析 一些思考 为什么是三次握手 SYN 攻击 什么是SYN 攻击 如何防止SYN 攻击 数据包丢失了该怎么办 初始序列号为什么随机产生 为什么 SYN 段不携带数据却要消耗一个序列号呢 每次握手可以确定
  • 数据库驱动和数据库连接(MySQL)

    数据库驱动和数据库连接 MySQL 一 数据库驱动 什么是数据库驱动 二 数据库连接 jdbc连接的方式以及区别 1 通过DriverManager 驱动管理类 的静态方法获取 2 通过DataSource 数据源 对象获取 3 两种创建连
  • SpringBoot常用注解和原理简介说明

    转自 SpringBoot常用注解和原理简介说明 下文笔者讲述SpringBoot常见注解的简介说明 如下所示 启动注解 SpringBootApplication Target ElementType TYPE Retention Ret
  • C++——QT之信号与槽

    通俗的理解信号与槽 信号与槽 Signal Slot 是 Qt 编程的基础 也是 Qt 的一大创新 因为有了信号与槽的编程机制 在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单 信号 Signal 就是在特定情况下被发射的事件 例
  • 设计模式:快照模式

    快照模式也叫做备忘录模式 但是我觉得如果是了解快照的话 我觉得比备忘录更形象一点 毕竟现在快照有各种 有页面快照 有系统快照等 相当于是一个备份 备忘录其实也是备份的意思 我觉得快照更贴切一点现在的描述 快照模式是一种行为模式 行为模式可以
  • Python利用Opencv读取图片

    首先 要先确认PyCharm里面有没有装opencv python 如果没有 点右侧 号搜索添加 确认有opencv之后 便可以使用cv2读取图片了 import cv2 image path C Desktop image jpg 图片路
  • 数字化时代-23:中国人工智能企业100强排行榜

    综合实力TOP100 成长能力TOP100 创新能力TOP100
  • React组件卸载、路由跳转、页面关闭(刷新)之前进行提示

    React组件卸载生命周期 路由跳转和页面关闭三者看起来有些类似的地方 比如都是当前组件即将从视口消失 但实际上所触发的事件均不相同 以一个实际案例出发 某单页应用的 文章编辑页用户正在编辑文章 此时尚未保存 当用户不小心要跳转到另外一个路
  • SpringBoot——内置数据源

    简单介绍 在之前我们介绍SpringBoot的数据层解决方案的时候 曾说到过在数据层是由数据源 持久化技术和数据库组成的 之前我们一直使用的都是Druid MyBatis MySQL组合的解决方案 这三种方案在之前我们都介绍过如何整合以及基
  • 进阶:变量 1.系统变量 说明:变量由系统定义,不是用户定义,属于服务器层面。 注意:(1) 全局变量需要添加global关键字 (2) 会话变量需要添加session键字 (3)

    进阶 变量 1 系统变量 说明 变量由系统定义 不是用户定义 属于服务器层面 注意 1 全局变量需要添加global关键字 2 会话变量需要添加session关键字 3 如果不写 默认session会话级别 使用步骤 1 查看所有系统变量
  • 大话西游2人数最多服务器,大话2大话各个服务器狂人榜排名 看大话如今服务器...

    大话2大话各个服务器狂人榜排名 看大话如今服务器 给大家带来各个服务器的练功排行等等 以下图均为服务器练功排行榜目前前三名 有些错误之处还望指正 冠希会及时修改 大话精灵有时候也问不到了 52 根据以下数据分析得出 1 目前超过3年以上没合
  • DM@数理逻辑@命题和联结词@形式化命题

    文章目录 abstract 命题和联结词基本概念 命题 陈述句 命题真值 真假记号 原子命题 命题分解 复合命题 联结词命题 例 半形式化命题和形式化语言 形式逻辑的抽象性 联结词形式化 否定 合取 析取 相容或的表示 排斥或的表示 蕴含
  • GPIO八种工作模式

    GPIO8种工作模式 一 输出模式 1 推挽输出 Out PP 推挽输出模式下 单片机输出高电平直接接到VDD 3 3V 输出低电平直接接到VSS 0V 具有强的驱动能力 2 开漏输出 Out OD 开漏输出模式下 单片机输出低电平也是接到
  • yolov5在plotting labels时停止并显示Process finished with exit code 1

    最近在训练yolov5模型 但在执行train py时 执行到plotting labels停止 显示错误 解决办法 报错信息里traceback里第二行 把这个注释掉就可以进入训练了
  • 用好GPT关键诀窍之上下文学习

    大家好 我是herosunly 985院校硕士毕业 现担任算法研究员一职 热衷于机器学习算法研究与应用 曾获得阿里云天池比赛第一名 CCF比赛第二名 科大讯飞比赛第三名 拥有多项发明专利 对机器学习和深度学习拥有自己独到的见解 曾经辅导过若
  • Spring AOP无法调用自身方法的原因

    this是当前对象 调用当前对象因为不是从IOC托管对象中 获取所以自然也是不能被AOP捕获 所有AOP的必须用代理对象执行 在同一个类中使用 Transaction Async并不能实现事务和异步 道理就是这样的 新建一个类 Compon
  • 深圳大学第三期“飞鹰计划”正式开班

    金秋九月 丹桂飘香 在这个充满着收获的季节里 迎来了期待已久的深圳大学机电与控制工程学院飞鹰计划2022级第三期开班典礼 受疫情影响 虽然典礼只能在线上举行 但是丝毫不影响电巢专家及学生们的热情 9月17日下午 百余位同学通过线上参加了此次
  • uCOS-II信号量OSSemCreate(0)和OSSemCreate(1)详解

    在ucos II中 为了实现任务之间的同步 用到的同步机制有 信号量 邮箱和消息队列 其中这里我主要说下对信号量的使用经验 信号量在创建时 调用OSSemCreate INT16U cnt 函数 cnt为信号量的初始值 对cnt赋予不同的值