【小黑嵌入式系统第十四课】μC OS-III程序设计基础(三)——信号量(任务同步&资源同步)


当信号量值大于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任务主要代码如下。

在这里插入图片描述


最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

…(img-94H9Ejll-1715626757145)]

[外链图片转存中…(img-U1fEhwcV-1715626757146)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值