UCOSIII信号量详解

news2024/9/21 14:35:35

目录

​编辑

前言

一、信号量的类型

二、信号量的使用方法

2.1创建信号量

2.2请求信号量:

2.3释放信号量:

三、信号量的作用

四、注意事项

五、信号量的API函数

六、代码实现

6.1 创建信号量

6.2 使用信号量


前言

UCOSIII信号量是UCOSIII操作系统中用于任务同步和互斥访问共享资源的一种重要机制。下面我将详细解释UCOSIII信号量的类型、使用方法,以及它在UCOSIII操作系统中的作用。

一、信号量的类型

UCOSIII中的信号量主要分为两种类型:

二进制信号量:

1.只有0和1两个值

2.当信号量为1时,表示资源可用;当信号量为0时,表示资源不可用。

3.一次只能有一个任务使用这个资源。

计数型信号量

1.可以有多个值,表示资源的数量

2.允许多个任务同时访问资源,但数量受信号量当前值的限制。

二、信号量的使用方法

在UCOSIII中,信号量的使用通常包括以下几个步骤:

2.1创建信号量

使用系统提供的函数(如OSSemCreate)来创建信号量,并指定信号量的类型和初始值。

2.2请求信号量:

当任务需要访问共享资源时,会请求(或等待)信号量。

如果信号量有效(对于二进制信号量,即值为1;对于计数型信号量,即值大于0),则任务获取信号量并继续执行。

如果信号量无效,则任务会被阻塞,直到其他任务释放信号量或超时。

2.3释放信号量:

当任务完成对共享资源的访问后,必须释放信号量。

释放信号量(如使用OSSemPost函数)会使信号量的值增加,并可能唤醒等待该信号量的任务。

三、信号量的作用

信号量在UCOSIII操作系统中扮演着重要的角色,主要用于以下几个方面:

1. 任务同步:信号量可以用于实现任务之间的同步。例如,一个任务可能需要等待另一个任务完成某个操作后才能继续执行。

2. 互斥访问共享资源: 通过信号量,可以确保同一时刻只有一个任务能够访问共享资源,从而避免数据竞争和冲突。

3. 中断与任务同步: 在中断服务程序中释放信号量,可以通知任务中断已发生,并允许任务继续执行。

四、注意事项

1.在使用信号量时,需要确保正确管理信号量的创建、使用和删除,以避免资源泄露或死锁等问题。

2.应注意信号量的使用场景,合理选择二进制信号量或计数型信号量。

五、信号量的API函数

UCOSIII提供了几个关键的API函数来管理信号量,包括创建信号量、删除信号量、等待信号量和释放信号量等:

  • 创建信号量OSSemCreate(),用于创建一个信号量。
  • 删除信号量OSSemDel(),用于删除一个信号量。如果信号量正在被任务等待,则不能删除。
  • 等待信号量OSSemPend(),任务通过这个函数等待信号量变为可用。
  • 释放信号量OSSemPost(),任务在访问完共享资源后释放信号量,使其他等待该信号量的任务可以继续执行。

六、代码实现

下面写一个关于使用信号量访问共享资源的代码,给大家展示信号量的简单使用。

6.1 创建信号量

OS_SEM	MY_SEM;		    //定义一个信号量,用于访问共享资源
OS_ERR err;
u8 share_resource[30];  //共享资源区

//创建一个信号量
	OSSemCreate ((OS_SEM*	)&MY_SEM,
                 (CPU_CHAR*	)"MY_SEM",
                 (OS_SEM_CTR)1,		
                 (OS_ERR*	)&err);

6.2 使用信号量

//任务1的任务函数
void task1_task(void *p_arg)
{
	OS_ERR err;
	u8 task1_str[]="First task Running!";
	while(1)
	{
		printf("\r\n任务1:\r\n");
		OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); 	//请求信号量
		memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
		delay_ms(200);
		printf("%s\r\n",share_resource);	//串口输出共享资源区数据	
		OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);				//发送信号量
		LED0=!LED0;
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
	}
}

//任务2的任务函数
void task2_task(void *p_arg)
{	
	OS_ERR err;
	u8 task2_str[]="Second task Running!";
	while(1)
	{
		printf("\r\n任务2:\r\n");
		OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); 	//请求信号量
		memcpy(share_resource,task2_str,sizeof(task2_str));	//向共享资源区拷贝数据
		delay_ms(200);
		printf("%s\r\n",share_resource);	//串口输出共享资源区数据		
		OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);				//发送信号量
		LED1=!LED1;
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
	}
}

上面是两个任务,分别对资源数据share_resource进行访问,为避免两个任务同时操作共享资源区造成混乱,给他们加了信号量,只有一个任务发送了信号量,另外一个任务才能对共享资源区进行操作。

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

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

相关文章

【Vue3】路由基础

【Vue3】路由基础 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本…

如何用Python求素数之和

计算两个正整数x&#xff0c;y(x<y&#xff0c;包括x&#xff0c;y)素数和。首先通过isPrime函数来判断一个数是否为素数&#xff0c;再使用primeSum函数来返回素数和。 以下为源码&#xff1a; def isPrime(n) :for i in range(2,n):if n % i 0:return 0breakelse:return…

在VB.net中,SortedList有什么方法与属性

标题 在VB.net中&#xff0c;SortedList有什么方法与属性 正文 在VB.NET中&#xff0c;SortedList 类是一个基于键值对的集合&#xff0c;它允许元素按照键的顺序进行排序&#xff0c;并可以通过键或索引来访问元素。SortedList 类是 System.Collections.Generic 命名空间中的一…

物流快递外卖管理平台系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

python绘制蕨菜叶分形

一花一叶一世界,一草一木一浮生. 使用了四个不同的线性变换&#xff0c;根据概率选择其中一个变换并更新 x 和 y 坐标。然后将生成的绿色点绘制出来&#xff0c;形成一片蕨菜叶。 import numpy as np import matplotlib.pyplot as pltdef fern_fractal(num_points):# 初始化坐…

手把手教你接口性能测试之JMeter性能测试篇

一、Jmeter 简介 Jmeter是由Apache公司开发的一个纯Java开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试&#xff0c;具备高移植性和扩展性&#xff0c;可以实现跨平台运行&#xff0c;可以实现分布式负载。 采用多线程&#xff0c;允许通过多个线程并发取样或…

【c++】 C语言的输入与输出C++的IO流STL空间配置器

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.C语言的输入与输出 2.流是什么 3.CIO流 3.1 C标准IO流 3.2 C文件IO流 4.stringstream的简单介绍 5.什么是空间配置器 6.为什么需要…

RAG系统优化思路

图片来源&#xff1a;https://huggingface.co/learn/cookbook/zh-CN/rag_evaluation 该图展示了可以从哪些部分去优化RAG。 先摘录一些比较好的思路&#xff1a; https://zhuanlan.zhihu.com/p/681421145 https://www.zhihu.com/question/643138720/answer/3495870046 http…

Spring-data-redis

一、spring-data-redis 介绍 spring-data-jpa spring-data-jdbc spring-data-redis 说明&#xff1a; 在 SpringBoot2.x 之后&#xff0c;原来使用的jedis 被替换为了 lettuce jedis : 采用的直连&#xff0c;多个线程操作的话&#xff0c;是不安全的&#xff0c;如果想要…

vue前后端交互学习问题记录2

1.在使用定时任务时报如下错误&#xff1a;No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration. 看报错是ThreadContext未绑定Secur…

Java调用Python的简单运用

这里提供两种调用方法&#xff1a; 1、通过Jython来实现Java调用Python (目前只支持Python2) 2、通过ProcessBuilder来实现Java执行Python脚本&#xff08;既支持Python2也支持Python3&#xff09; 通过Jython来实现Java调用Python Jython目前只支持Python2 一、准备好Pytho…

如何高效记录并整理编程学习笔记

目录 1.概述 1.1. 选择合适的工具 1.2. 分类整理 1.3. 制定标准格式 1.4. 定期复习和更新 1.5. 利用图形和视觉辅助 1.6. 记录问题和解决过程 1.7. 使用版本控制 1.8. 与他人分享和讨论 2.笔记工具选择 2.1. 印象笔记 2.2. 语雀 2.3. 有道云笔记 2.4. 腾讯文档 …

基于Spring Boot的企业员工薪酬关系系统的设计

TOC springboot229基于Spring Boot的企业员工薪酬关系系统的设计 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#…

Spring好坑!为什么代理对象的属性没有值?

先看代码&#xff1a; Service Transactional public class ZhouyuService {private String name "zhouyu";public final void test() {System.out.println(name);} }关键点&#xff1a; 加了Transactional&#xff0c;所以ZhouyuService会生成代理对象作为Bean对…

HAProxy理论+实验

目录 一、基于cookie的会话保持 1、配置选项 2、配置示例 3、验证cookie信息 二、IP透传 1、layer4 与 layer7 &#xff08;1&#xff09;四层:IPPORT转发 &#xff08;2&#xff09;七层:协议内容交换 三、haproxy的ACL应用 1、ACL配置选项 &#xff08;1&#xf…

应用案例:劳易测传感器助力宝马集团莱比锡工厂锂电池生产

位于德国萨克森州的宝马集团莱比锡工厂&#xff0c;是全球领先的汽车制造基地之一&#xff0c;不仅生产燃油车&#xff0c;也致力于电动汽车的生产。随着电动汽车及混合动力车辆的普及&#xff0c;锂电池的需求日益增长&#xff0c;宝马集团在莱比锡工厂内部设立了锂电池生产线…

Python之简单了解pylab绘图工具和汇编语言

《Python入门经典以解决计算问题为导向的Python编程实践》89-93页的笔记。 用pylab对数据绘图最小的通用计算 用pylab对数据绘图 PyLab是Matplotlib面向对象绘图库的过程界面。Matplotlib是整个软件包&#xff1b; matplotlib.pyplot是Matplotlib中的一个模块&#xff1b;而P…

能够清理浮毛的宠物空气净化器哪家好用?希喂、安德迈测评分享

虽然已经立秋了&#xff0c;但是现在这个天气还是很热&#xff0c;尤其是还处在南方城市就更加了&#xff0c;天气热空气中的水含量还高&#xff0c;这就代表着即使下雨天能降温但身体还是会有黏黏的感觉。家里养有猫和狗&#xff0c;大汗淋漓的到家&#xff0c;一进门就被我家…

17位著名妈妈和女儿在电影中合作 包括斯特里普、黛米摩尔、安吉丽娜朱莉等

好莱坞母女二人组正在占领大银幕。如今&#xff0c;你不会只在头条新闻中看到她们的名字。这些强大的女性正在联手&#xff0c;创造电影奇迹&#xff0c;并为她们家喻户晓的名字增添更多的明星影响力。 虽然像戈尔迪霍恩和凯特哈德森这样的母女组合更喜欢分开工作&#xff0c;…

Python进阶之3D图形

Python进阶之3D图形 在数据可视化中&#xff0c;2D图形通常可以满足大多数需求。然而&#xff0c;对于一些复杂的数据或分析&#xff0c;3D图形可以提供更多的视角和洞察。在Python中&#xff0c;使用 Matplotlib 和 Plotly 等库可以轻松创建各种3D图形。本文将介绍如何使用这…