UCOS-III 任务同步机制-信号量

news2025/5/30 12:49:47

1. 信号量类型

1.1  二值信号量(Binary Semaphores)

二值信号量只有两个状态:可用(1)和不可用(0)。它主要用于任务之间的互斥访问或者事件通知。例如,当一个任务完成某个操作后,它可以通过释放信号量来通知其他任务该操作已经完成。

1.2  计数信号量(Counting Semaphores)

计数信号量可以有多个状态,范围从0到一个预定义的最大值。它主要用于控制对资源的访问,允许多个任务同时访问同一资源。例如,在一个生产者-消费者模型中,计数信号量可以用来表示缓冲区中的可用资源数量。

2. 信号量的基本操作

2.1 创建信号量

创建一个信号量,需要调用OSSemCreate()函数。该函数的原型如下:

void OSSemCreate(OS_SEM *p_sem, CPU_CHAR *p_name, OS_SEM_CTR cnt, OS_ERR *p_err);

2.2 等待信号量

任务等待信号量,需要调用OSSemPend()函数。该函数的原型如下:

void OSSemPend(OS_SEM *p_sem, OS_TICK timeout, OS_OPT opt, CPU_TS *p_ts, OS_ERR *p_err);

2.3  释放信号量

任务释放信号量,需要调用OSSemPost()函数。该函数的原型如下:

void OSSemPost(OS_SEM *p_sem, OS_OPT opt, OS_ERR *p_err);

3. 信号量API详解

OSSemCreate()
创建一个信号量

参数
p_sem:指向信号量的指针
p_name:信号量的名称
cnt:初始计数值
p_err:返回错误代码
返回值 无

错误代码
OS_ERR_NONE:成功。
OS_ERR_CREATE_ISR:在ISR中调用。
OS_ERR_ILLEGAL_CREATE_RUN_TIME:非法的创建时间。
OSSemPend()
任务等待信号量

参数
p_sem:指向信号量的指针
timeout:等待时间
opt:选项标志
p_ts:时间戳
p_err:返回错误代码
返回值 无

错误代码
OS_ERR_NONE:成功
OS_ERR_PEND_ISR:在ISR中调用
OS_ERR_OBJ_DEL:对象被删除
OS_ERR_PEND_ABORT:等待被中止
OSSemPost()
任务释放信号量

参数
p_sem:指向信号量的指针
opt:选项标志
p_err:返回错误代码
返回值 无

错误代码
OS_ERR_NONE:成功
OS_ERR_POST_ISR:在ISR中调用
OS_ERR_SEM_OVF:信号量溢出

4. 信号量使用示例

4.1 任务间同步

4.1.1 任务间同步流程图

4.1.2 任务间同步示例

以下示例展示了如何在两个任务之间使用信号量进行同步:

void Task1(void *p_arg) {
    OS_ERR err;
    while (1) {
        OSSemPend(&MySem, 0, OS_OPT_PEND_BLOCKING, 0, &err);
        ......
    }
}

void Task2(void *p_arg) {
    OS_ERR err;
    while (1) {
        // 任务代码
        OSSemPost(&MySem, OS_OPT_POST_1, &err);
    }
}

4.2 任务与ISR同步

4.2.1 任务与ISR同步流程图

4.2.2 任务与ISR间同步示例

以下示例展示了任务与中断服务程序(ISR)之间使用信号量进行同步:

void ISR(void) {
    OS_ERR err;
    OSSemPost(&MySem, OS_OPT_POST_1, &err);
}

void Task(void *p_arg) {
    OS_ERR err;
    while (1) {
        OSSemPend(&MySem, 0, OS_OPT_PEND_BLOCKING, 0, &err);
        // 处理ISR信号
    }
}

5. 注意事项

避免死锁:确保任务获取信号量的顺序一致,防止循环等待

合理设置优先级:避免高优先级任务长时间占用信号量,影响低优先级任务

使用超时机制:在获取信号量时,设置合理的超时时间,避免任务永久等待

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

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

相关文章

浏览器打不开网页、但是电脑有网络,解决办法(win11)

2023.07.06测试有效 华为电脑拿去免费拆机保养后,发现浏览器连接不上网了,但是!微信又能登录得上,也就是说电脑还是有网的。 原文链接 一、问题截图 二、解决方法 1.右键打开“网络和Internet设置” 2.打开“代理” 3.将该选项设…

匠心传承 筑梦大兴 大兴区餐饮行业职工职业技能竞赛完美收官

隆重举行,北京市商务局二级调研员林英杰,大兴区商务局党组书记、局长王丽娜,区总工会二级调研员侯月海,区商务局副局长、工会主席兰莉及各区县餐饮行业协会相关负责人、获奖单位、参赛职工等160余人参加大会。 此次竞赛通过前期调…

东莞惠州数据中心机房搬迁方案流程

进入21世纪以来,数据中心如雨后春笋般在各行各业兴建起来,经过近20年的投产运行,大量的数据中心机房存在容量不足、机房陈旧、设备老化无法支撑业务发展的情况,产生机房改造、搬迁需求。为安全、可靠地完成机房搬迁,减…

Unity中使用VectorGraphics插件时,VectorUtils.RenderSpriteToTexture2D方法返回结果错误的解决方法

Unity中使用VectorGraphics插件时,如果使用VectorUtils.BuildSprite方法创建Sprite,那么得到的Sprite往往是一个三角网格数比较多的Sprite,如果想要得到使用贴图只有两个三角面的方形Sprite,可以使用该插件提供的VectorUtils.Rend…

pandas读取CSV格式文件生成数据发生器iteration

背景 数据集标签为csv文件格式,有三个字段column_hander [‘id’, ‘boneage’, ‘male’],需要自己定义数据集。文件较大,做一个数据发生器迭代更新数据集。 实现模板 在Pandas中,可以使用pandas.read_csv函数读取CSV文件&…

TTS文本转声音:fish-speech 推理、requests访问接口案例

参考: https://hub.docker.com/r/lengyue233/fish-speech https://speech.fish.audio/inference/#http-api 下载 下载模型: HF_ENDPOINT=https://hf-mirror.com huggingface-cli download fishaudio/fish-speech-1.2 --local-dir checkpoints/fish-speech-1.2下载的内容有…

HTML5使用<pre>标签:保留原始排版方式

在网页创作中,一般是通过各种标记对文字进行排版的。但是在实际应用中,往往需要一些特殊的排版效果,这样使用标记控制起来会比较麻烦。解决的方法就是保留文本格式的排版效果,如空格、制表符等。 如果要保留原始的文本排版效果&a…

How to use Solr as retriever in RAG

题意:怎样在 RAG 中使用 Solr 作为检索器 问题背景: I want to build a RAG (Retrieval Augmented Generation) service with LangChain and for the retriever I want to use Solr. There is already a python package eurelis-langchain-solr-vectors…

ABB机器人Socket 通讯相关指令

ABB机器人进行Socket 通讯时,首先需要安装PC Interface选项。以下对Socket 通讯时用到的相关指令做出介绍。 一、指令 1、socketdev Socketdev(socket device),套接字设备是另一台网络计算机通讯链路的处理器。用于同其他网络计…

单链表在Python中的实现技巧

更多Python学习内容:ipengtao.com 链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据域和一个指向下一个节点的指针。链表的优点是插入和删除操作非常高效,特别是在需要频繁修改数据结构的情况下。本文将详细介绍…

【深度学习】-WASB-调试说明

要改这么几个地方: 代码仓库:/Desktop/code/python_project/WASB-SBDT-main/ 篮球数据集xx_xx_11.xml只保留最后一个11.xml 并把11下直接放置11 video: 这里的东西被我改了,要以仓库为准

openssh版本升级实战(修补ssh漏洞)基于RedHat8.4版本测试--已成功升级

升级前具有漏洞的的版本 通过命令查看目前系统的ssh和sshd版本: ssh -V sshd -V 注意:由于ssh是远程连接服务器的功能,在进行下面操作升级openssh前,请打开多个连接会话保持,如升级失败,可通过已连接的会话…

Transform Data with SQL

rm -r dp-203 -f git clone https://github.com/MicrosoftLearning/dp-203-azure-data-engineer dp-203 cd dp-203/Allfiles/labs/01 ./setup.ps1 -- This is auto-generated code SELECTTOP 100 * FROMOPENROWSET(BULK https://datalakexxxxxxx.dfs.core.windows.net/fil…

hive表小练习

-- 将对应的命令写在每个步骤中 -- 1.在hive中创建数据库school create database if not exists school; -- 2.在数据库school中创建如下的表 每张表的列分隔符都是, 存储格式是textfile 创建表名为student_info, 字段为stu_id 类型为string,注释为学生id 字段为stu_name 类…

【Python学习】流程控制、函数与类详解

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 Python作为一门强大而又简洁的编程语言,提供了丰富的工具和结构来帮助开发者编写清晰、高效的代码。在本文中…

解决Linux环境Qt报“cannot find -lgl“问题

今天,在Ubuntu 18.04.6环境下,安装Qt5.14.2之后,运行一个QWidget工程,发现Qt报"cannot find -lgl"错误。     出现这种现象的原因:Qt的Path路径没有配置,缺少libqt4-dev依赖包和一些必要的组件…

算法题-回文子串和最长回文子序列

算法题-回文子串和最长回文子序列 一、647. 回文子串二、516. 最长回文子序列 一、647. 回文子串 中等 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个…

基于SpringBoot的招聘信息管理系统的详细设计和实现(源码+lw+部署文档+讲解等,欢迎咨询我!!)

文章目录 目录 文章目录 详细视频展示: 系统具体实现效果(看看我的实力) 技术栈(详细的描述提供给同学思路参考) 2.1 Java语言介绍 2.2 B/S架构 2.3 MySQL 数据库介绍 2.4 MySQL环境配置 2.5 SpringBoot框…

14-24 剑和侠客 – 预训练模型三部曲1 - 文本

在这个三部曲中,我们旨在从三个部分深入研究预训练模型:文本、图像和机器人。 我们旨在探索它们的概念、出现以及这些模型的工作原理。还将研究预训练模型的不同架构和类型。 探索哪些是最强大的,以及预训练模型和 Transformers 是否是 LLM…

【学术会议征稿】2024年工业自动化与机器人国际学术会议(IAR 2024)

2024年工业自动化与机器人国际学术会议(IAR 2024) 2024 International Conference on Industrial Automation and Robotics 2024年工业自动化与机器人国际学术会议(IAR 2024)将于2024年10月18-20日在新加坡隆重召开。会议将围绕…