【小黑嵌入式系统第十四课】μC/OS-III程序设计基础(三)——信号量(任务同步资源同步)、事件标记组(与或多个任务)

上一课:
【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验



前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能



文章目录

    • 1 信号量
      • 1.1 简介
      • 1.2 任务间同步
      • 1.3 ISR与任务同步
      • 1.4 资源同步
        • 例:银行柜台
      • 1.5 任务信号量
    • 2 事件标志组
      • 2.1 简介
      • 2.2 标志“与”
      • 2.3 标志“或”
      • 2.4 同步多个任务


1 信号量

1.1 简介

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

在这里插入图片描述
N为信号量值,表示发布信号量的次数累计值。
信号量用于任务-任务(或任务-ISR)间同步时,N表示事件已发生了多少次。
信号量用于资源共享时,N表示资源还可被多少个任务同时使用。


当任务(或ISR)调用OSSemPost()函数发送信号量时:
在这里插入图片描述
任务(或ISR)可以多次调用OSSemPost()函数发送信号量。


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

在这里插入图片描述


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

在这里插入图片描述

注意:μC/OS-III不允许在中断服务程序中等待信号量。


前面章节我们学习了互斥信号量,下面对计数型信号量与互斥信号量做一个对比。

在这里插入图片描述


1.2 任务间同步

在实际的应用中,常用信号量实现任务间的同步,OSSemPend()OSSemPost()会出现在不同任务中,但不一定成对出现。

在这里插入图片描述

注意:在实际的应用中,还有多对多、一对多信号量操作的情况,但很不常见,建议不要设计出这样的操作方式,这样会带来很多的麻烦。


用来实现任务间同步的信号量在创建时赋给初始值,一般为0,表示事件还未发生,初始值在OSSemCreate()函数中指定。

在这里插入图片描述


让一个LED以0.5Hz的频率闪烁,每按键一次,LED闪烁一次。

我们通过此例来说明如何使用信号量实现任务间同步,两个任务处理流程如下。

在这里插入图片描述


TaskKEY任务主要代码如下。

在这里插入图片描述


TaskLED任务主要代码如下。

在这里插入图片描述


1.3 ISR与任务同步

下面以示例来说明如何现实ISR与任务间同步。假设定时器1中断服务程序发送信号量,任务完成了信号量的创建并在接收到信号量后让蜂鸣器响一声。处理流程如下。

在这里插入图片描述


中断服务程序ISR示例代码如下。

在这里插入图片描述


蜂鸣器报警任务示例代码如下。

在这里插入图片描述


1.4 资源同步

在嵌入式系统中,可以使用信号量访问共享资源来实现资源同步。在使用时,注意发送信号量函数OSSemPost()与等待信号量函数OSSemPend()必须成对出现在同一个任务调用的函数中,才能实现资源同步(这与互斥信号量使用方式一致)。

在使用信号量做资源共享时,只有任务才能使用信号量,而中断服务程序则不可以。(注意对照前面所述,在使用信号量做ISR与任务间同步时,ISR可以给任务发送信号量,但不能做其它的信号量操作)

计数型信号量用于某共享资源可以同时为几个任务所用时,这是互斥型信号量不能处理的(互斥信号量是二值的)。


例:银行柜台

某银行有N个柜台可以为客户服务,设置信号量值为N(或者银行同时可以为N个用户服务)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


为了说明使用信号量访问共享资源实现资源同步,设计两个任务,它们以不同的频率让LED点亮30个时钟节拍,然后熄灭60个时钟节拍,要求这两个任务不会互相干扰。下面是两个任务的处理流程。

在这里插入图片描述

为了实现资源同步,我们需要保证OSSemPost()OSSemPend()成对在同一个任务函数中调用,所以我们可以编写一个函数LED()供两个任务调用,代码如下。

在这里插入图片描述


下面给出两个LED任务的主要处理代码。

在这里插入图片描述


1.5 任务信号量

在μC/OS-III中,每个任务都有它自己的内嵌信号量,称为任务信号量。任务信号量是在任务创建OSTaskCreate()时创建的,因此任务创建之后便可以直接使用。

任务信号量使用起来更方便,且速度比一般信号量要快。

当事件发生时,用户若明确知道该给哪个任务发信号,此时就可以使用任务信号量。

在这里插入图片描述

μC/OS-III中的任务信号量服务函数以OSTaskSem???()命名。

在这里插入图片描述

  • OSTaskSemPend(),它在任务信号量所属任务中调用。(无任务控制块参数需传递)

在这里插入图片描述

  • 如OSTaskSemPost(),它在另一任务或ISR中调用。(需指定任务信号量所属任务的任务控制块参数,即发送(给)哪个任务的任务信号量)

在这里插入图片描述


2 事件标志组

2.1 简介

当任务要与多个事件的发生同步时,可以使用事件标志组。一个事件标志就是一个二值信号,事件标志组是若干二值信号的组合。

用事件标志组来做任务同步分为独立型同步(“或”同步)和关联型同步(“与”同步)。设一个任务与3个事件标志有关,如下图。

在这里插入图片描述
在这里插入图片描述

可以用多个事件的组合,发信号给多个任务,典型的有8个、16个或32个事件可以组合在一起(由os_type.h中的OS_FLAGS数据类型定义事件标志位数)。

在这里插入图片描述

注意:系统在一组新事件发生后判断是否有任务接收到需求的标志,在收到标志后进行任务状态切换。


2.2 标志“与”

为了说明如何使用标志事件组实现任务与若干个事件同步,我们设计一个系统,当时间到且独立按健被按下后,让LED1闪烁一下。三个任务的处理流程如图。

在这里插入图片描述


TaskKEY任务主要代码如下。

在这里插入图片描述


TaskDly任务主要代码如下。

在这里插入图片描述


TaskLED任务主要代码如下。

在这里插入图片描述


2.3 标志“或”

为了说明如何使用标志事件组实现任务与任何事件之一同步,我们设计一个系统,当时间到或独立按健被按下后,让LED1闪烁一下。三个任务的处理流程如图。

在这里插入图片描述

注意:标志“或”和标志“与”操作只在等待标志的LED任务有所不同,其余都相同。

由于发送标志的两个任务代码和标志“与”操作的相同,这里不做重复。标志“或”中的 TaskLED任务主要代码如下。

在这里插入图片描述


2.4 同步多个任务

有些时候需要使多个任务“同时”开始执行(将它们执行的起点同步到同一时刻),通过广播信号量来同步多个任务是一种常用的技术。

但当进行广播操作时,一些要同步的任务可能没有在等待信号量,解决该问题的方法是将信号量和事件标志组联合起来使用。

在这里插入图片描述
(1) 每个待同步的任务都需要先将一个事件标志位置位;
(2) 然后等待信号量的发布。
(3) 进行信号量广播的任务必须在所有事件标志位都被置位后,
(4) 才能发布信号量。

该方法要求左边任务优先级比右边任务优先级都低。否则对于右边的最后一个执行OSFlagPost()的任务,在它尚未执行OSSemPend()之前,左边任务就将发送信号量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/613301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记之——3D Gaussian Splatting源码解读

之前博客对3DGS进行了学习与调研 学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研-CSDN博客文章浏览阅读450次。论文主页3D Gaussian Splatting是最近NeRF方面的突破性工作,它的特点在于重建质量高的情况下还能接入传统光栅化,优…

探索大模型时代下的文档识别与分析【GPT4-V带来的挑战与机遇】

中国图象图形学学会青年科学家会议是由中国图象图形学学会青年工作委员会发起的学术会议。本会议面向国际学术前沿与国家战略需求,致力于支持图象图形领域的优秀青年学者,为青年学者们提供学术交流与研讨的平台,促进学者之间的交流与合作。会…

深入理解C#中的引用类型、引用赋值以及 `ref` 关键字

深入理解C#中的引用类型、引用赋值以及 ref 关键字 在C#编程中,理解引用类型、引用赋值以及 ref 关键字的使用对于编写高效、可靠的代码至关重要。本文将深入探讨这些概念,帮助您更好地理解C#的工作原理。 引用类型简介 在C#中,所有的类型都…

MySQL的事务机制

一、事务机制简述 事务机制,避免写入直接操作数据文件;利用日志来实现间接写入,与事务有关的, redo日志与undo日志;sql语句操作记录复制到undo日志然后增删改查操作的结果会记录在redo日志,如果操作没有什么问题就把数据同步到数…

综合指南:理解气体检测仪的关键功能和单位换算

随着科技的飞速发展,气体检测仪在各行各业中的应用已十分普遍,其主要用途是检测环境中的气体浓度。 1、检测气体纯度 主要用于气体储罐、管道等储运设备中检测气体的纯度,一般都是专门针对高纯气体的浓度值进行检测,常见的如氩气…

C语言数组基础知识

目录 一维数组: 一维数组的创建: 一维数组的访问: 一维数组在内存中的存储: 二维数组: 二维数组的创建: 二维数组的初始化: 二维数组的使用: 二维数组在内存中的存储&#x…

上海晋名室外暂存柜助力石墨烯材料行业气瓶储存安全

近日上海晋名又有一台室外气瓶暂存柜项目通过验收,此次项目主要用于石墨烯材料行业气瓶的室外暂存。 用户单位创立于2017年,是一家从事石墨烯等新材料技术的科技型高新技术企业。 上海晋名作为一家专注工业安全防护领域,危险化学品安全储存…

RocketMQ Dashboard可视化工具

RocketMQ Dashboard 将 RocketMQ的相关指标展示在web页面 ,支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。 官方文档地址:RocketMQ Dashboard | RocketMQ 目录 1.下载安装 1.1 系统要求: 1.2 源码安装 1.3 访问页面 2.功…

如何搭建开源知识库软件AFFiNE并实现公网环境远程协作【内网穿透】

目录 前言 1. 使用Docker安装AFFINE 2. 安装cpolar内网穿透工具 3. 配置AFFINE公网访问地址 4. 实现公网远程访问AFFINE 结语 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊如何搭建开源知识库软件AFFiNE并实现公网环境远程协作【内网穿…

借势API电商数据采集汇总分析

电商数据采集的网页抓取数据、淘宝、天猫、京东等平台的电商数据抓取,网页爬虫、采集网站数据、网页数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么电…

使用python读取yaml文件数据

使用python读取yaml文件: yaml文件数据:data.yaml login_data:url: http://www.baidu.comcase1:user1: password1: 12345errorText: 请输入用户名case2:user2: adminpassword2: errorText: 请输入密码case3:user3: adminpassword3: 123456errorText: 登…

19. 从零用Rust编写正反向代理, 配置数据的热更新原理及实现

wmproxy wmproxy是由Rust编写,已实现http/https代理,socks5代理, 反向代理,静态文件服务器,内网穿透,配置热更新等, 后续将实现websocket代理等,同时会将实现过程分享出来&#xff…

探索 Java 8 中的 Stream 流:构建流的多种方式

目录 前言 什么是 Stream 流? 创建 Stream 流 1. 从集合创建 Stream 2. 从数组创建 Stream 3. 使用 Stream.of 创建 Stream 4. 使用 Stream.generate 创建 Stream 5. 使用 Stream.iterate 创建 Stream Stream 流的操作 1. 过滤数据 2. 映射数据 …

01 ZigBee开发环境IAR搭建

链接:https://pan.baidu.com/s/18l8z9qajPBj2X5WzgjT0TA?pwd41qc 提取码:41qc 注意:安装包和注册机都要右击用管理员权限打开,安装过程中关闭杀毒软件(否则后续程序不行) 安装IAR-8051 以管理员身份运行E…

鸿蒙开发已解决-arkts编译报错-arkts-limited-stdlib错误

文章目录 项目场景:问题描述原因分析:解决方案:适配指导案例此Bug解决方案总结项目场景: arkts编译报错-arkts-limited-stdlib错误。 我用Deveco studio4.0 beta2开发应用,报arkts-limited-stdlib错误 报错内容为: ERROR: ArKTS:ERROR File: D:/prRevivw/3792lapplica…

行列式的计算

1、基本性质: 1)行列式转置相等 2)任意两行(列)成比例,行列式为0 3)对换任意某两行(列),行列式变号 4)某一行(列)乘某…

Ubuntu下VsCode+CMake 交叉编译

参考连接: Ubuntu下VsCodeCMake 交叉编译 VSCode与CMake搭配使用之基本配置 VSCode与CMake搭配使用之交叉编译 step1: CtrlShiftp打开VSCode的指令面板,然后输入cmake:q ; 在窗口搜索:“ >CMake:Edit user-loacl CMake kits ”会打开一个…

SpringBoot集成阿里云短信实现发送短信验证码

SpringBoot集成阿里云短信实现发送短信验证码 一、准备工作1、注册账号2、申请资质3、申请签名4、创建模板 二、springboot集成发送短信1、引入依赖2、编写短信配置文件3、编写短信发送工具类 一、准备工作 在使用springboot集成短信服务之前,需要先注册阿里云的账…

VMware vSphere运维管理手册

适用版本:VMware vSphere 7.0 VMware vSphere 是 VMware 的虚拟化平台,可将数据中心转换为包括 CPU、存储和网络资源的聚合计算基础架构。vSphere 将这些基础架构作为一个统一的运行环境进行管理,并为您提供工具来管理加入该环境的数据中心。 ![[Pasted image 20231212132…

uni-app的学习【第二节】

四 路由配置及页面跳转 (1)路由配置 uni-app页面路由全部交给框架统一管理,需要在pages.json里配置每个路由页面的路径以及页面样式(类似小程序在app.json中配置页面路由) (2)路由跳转 uni-app有两种页面路由跳转方式:使用navigator组件跳转(标签式导航)、调用API跳…