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

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.mfbz.cn/a/776703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程、程序、应用程序之间的关系

文章目录 进程和程序进程和应用程序总结参考资料 进程和程序 程序:程序是存放在硬盘中的可执行文件,主要包括代码指令和数据。程序本身是一个静态的文件,只有在被操作系统加载到内存中并执行时才会变成进程。 进程:进程是程序在…

QoS-基于queue-profile部署流量整形

拓扑图 配置 完成前面的配置QoS-基于queue-profile拥塞避免-CSDN博客 为查看实验效果,cir设置为1KB qos queue-profile queue_pro1queue 0 gts cir 8 # 在AR1上ping 3.3.3.3,10个包,大小600字节,间隔0.1s AR2查看丢弃情况&…

redis 如何使用 scan, go语言

建议用方案乙 文章目录 场景方案方案甲方案乙 拓展 场景 redis 中存在大量 key。 其中有一部分是用户登陆的 session_id, 结构是 : session_id:1session_id:2session_id:3需求: 有多少用户在线 方案 方案甲 keys session_id:*这种方式简…

白牌产品的数字化品牌蜕变之路

​在如今这个竞争白热化的市场中,品牌就是企业克敌制胜的法宝。而白牌产品,因缺少响亮的品牌名号和独特的品牌形象,常常在市场的角逐中处于下风。 不过,数字化时代的来临,却为白牌产品带来了新的曙光! 蚓链…

学习笔记——动态路由——OSPF链路状态通告(LSA)

十、OSPF链路状态通告(LSA) 1、链路状态通告简介 (1)LAS概述 链路状态通告(Link State Advertisement,LSA)是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位,LSDB由一条条LSA构成的。是OSPF中计算路由的重要依据。 LSA用于向其它邻接OSPF路…

# Sharding-JDBC从入门到精通(6)-- Sharding-JDBC 水平分库 和 垂直分库。

Sharding-JDBC从入门到精通&#xff08;6&#xff09;-- Sharding-JDBC 水平分库 和 垂直分库。 一、Sharding-JDBC 水平分库-分片策略配置 1、分库策略定义方式如下 # 分库策略&#xff0c;如何将一个逻辑表映射到多个数据源 spring.shardingsphere.sharding.tables.<逻…

用MySQL+node+vue做一个学生信息管理系统(二):创建MySQL数据表、创建HTML用户列表页面

MySQL代码 CREATE DATABASE students;USE students;CREATE TABLE student( id INT COMMENT 学号, name VARCHAR(32) COMMENT 姓名, sex VARCHAR(8) COMMENT 性别, class VARCHAR(64) COMMENT 班级 )SHOW TABLES;下面介绍一下Vue框架的element-ui的使用方法&#xff0c;这里就不…

【第21章】MyBatis-Plus多数据源支持

文章目录 前言一、dynamic-datasource1. 特性2. 约定3. 使用方法3.1 引入依赖3.2 配置数据源3.3 使用 DS 切换数据源 二、mybatis-mate1.特性2.使用方法2.1 配置数据源2.2 使用 Sharding 切换数据源2.3 切换指定数据库节点 三、实战1. 引入库2. 配置3. 使用 DS 切换数据源4. 测…

秋招突击——7/5——复习{}——新作{跳跃游戏II、划分字母区间、数组中的第K个大的元素(模板题,重要)、前K个高频元素}

文章目录 引言正文贪心——45 跳跃游戏II个人实现参考实现 划分字母区间个人实现 参考实现数组中的第K个最大元素个人实现参考做法 前K个高频元素个人实现参考实现 总结 引言 今天就开始的蛮早的&#xff0c;现在是九点多&#xff0c;刚好开始做算法&#xff0c;今天有希望能够…

封锁-封锁模式(共享锁、排他锁)、封锁协议(两阶段封锁协议)

一、引言 1、封锁技术是目前大多数商用DBMS采用的并发控制技术&#xff0c;封锁技术通过在数据库对象上维护锁来实现并发事务非串行调度的冲突可串行化 2、基于锁的并发控制的基本思想是&#xff1a; 当一个事务对需要访问的数据库对象&#xff0c;例如关系、元组等进行操作…

RocketMQ-订阅一致及解决方案

背景 这里借用Rocketmq官方的一句话来描述订阅关系一致: 订阅关系一致指的是同一个消费者分组Group ID下&#xff0c;所有Consumer实例所订阅的Topic和Tag必须完全一致。如果订阅关系不一致&#xff0c;可能导致消息消费逻辑混乱&#xff0c;消息被重复消费或遗漏。 具体的问题…

BS结构的毕业设计题目管理系统-计算机毕业设计源码92342

目 录 摘要 1 绪论 1.1 研究背景 1.2目的及意义 1.3论文结构与章节安排 2 毕业设计题目管理系统设计分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分…

3D打印推动透气钢革命

在科技日新月异的今天&#xff0c;3D打印技术如同一股强劲的潮流&#xff0c;正悄然改变着制造业。从简单的塑料玩具到复杂的工业部件&#xff0c;再到高精尖的医疗器械&#xff0c;3D打印技术凭借其独特的优势&#xff0c;不断拓宽着应用的边界。今天&#xff0c;我们一起深度…

Linux-DNS

DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。…

MySQL/SqlServer 跨服务器 增删改查(CRUD) 的一种方法

前言&#xff1a;主要是利用SqlServer 的链接服务器功能 1.准备一台 SqlServer Server&#xff0c;服务如下图&#xff1a; 这台服务器专门用于 链接服务器 IP&#xff1a;10.x.x.3 和数据源服务器&#xff08;10.x.x.5&#xff09; 在一个局域网 1.1 版本 是 2017 2.在 10.…

算法体系-26 第二十六节:第26节:单调栈结构 (5节)

一 单调栈知识讲解 1.1描述 一个数组里面想的到每个位置与他最近的左边和右边比他小的最近的信息 1.2 分析 通过单调栈的特点&#xff0c;for遍历数组中的每个数&#xff0c;当前数来的时候对比单调栈中的数进行每个数的左右判断完满足条件的进行更新到当前i种的 int[][] re…

MySQL索引教程(01):创建索引

文章目录 MySQL 创建索引索引介绍MySQL CREATE INDEX 语法MySQL 索引类型MySQL CREATE INDEX 实例结论 MySQL 创建索引 对于一个具有大量数据行的表&#xff0c;如果你根据某个查询条件检索数据时很慢&#xff0c;可能是因为你没有在检索条件相关的列上创建索引。 索引类似于…

平价猫粮新选择!福派斯鲜肉猫粮,让猫咪享受美味大餐!

福派斯鲜肉猫粮&#xff0c;作为一款备受铲屎官们青睐的猫粮品牌&#xff0c;凭借其卓越的品质和高性价比&#xff0c;为众多猫主带来了健康与美味的双重享受。接下来&#xff0c;我们将从多个维度对这款猫粮进行解析&#xff0c;让各位铲屎官更加全面地了解它的魅力所在。 1️…

查看电脑显卡(NVIDIA)应该匹配什么版本的CUDA Toolkit

被串行计算逼到要吐时&#xff0c;决定重拾CUDa了&#xff0c;想想那光速般的处理感觉&#xff08;夸张了&#xff09;不要太爽&#xff0c;记下我的闯关记录。正好我的电脑配了NVIDIA独显&#xff0c;GTX1650&#xff0c;有菜可以炒呀&#xff0c;没有英伟达的要绕道了。回到正…

详细分析SQL语句中的硬解析、软解析、软软解析基本知识

目录 前言1. 基本知识2. Demo 前言 从实战中探索 图为全局搜索且在高并发下&#xff0c;会引发硬解析&#xff0c;导致CPU崩溃 1. 基本知识 解析 (parsing) 是数据库在处理 SQL 语句时必不可少的一步&#xff0c;它将 SQL 语句转换为数据库可以执行的低级指令 硬解析 (Hard…