嵌入式面试——FreeRTOS篇(四) 信号量

news2024/11/25 20:40:18

本篇为:FreeRTOS信号量篇

信号量

1、什么是信号量

答:信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。

2、信号量简介

答:

  • 当计数值大于0,表示有信号量资源。
  • 当释放信号量,信号量计数值(资源数)加一。
  • 当获取信号量,信号量计数值(资源数)减一。
  • 信号量的计数值都是有限的:限定最大值。
  • 如果最大值被限定为1,那么它就是二值信号量。
  • 如果最大值不是1,它就是计数型信号量。

注意:信号量用于传递状态。

3、队列与信号量的对比

答:

二值信号量

1、二值信号量介绍

答:二值信号量的本质是一个队列长度为1的队列,该队列就只有空和满两种情况。这就是二值信号量。

注意:二值信号量通常用于互斥访问或任务同步,与互斥信号量比较类似,但是二值信号量有可能会导致优先级翻转的问题,所以二值信号量更适合用于同步!!!

2、使用二值信号量的过程:

答:创建二值信号量 -> 释放二值信号量 -> 获取二值信号量

计数型信号量

1、计数型信号量介绍

答:计数型信号量相当于队列长度为1的队列,因此计数型信号量能够容纳多个资源,这在计数型信号量被创建的时候确定的。

计数型信号量适用场合:

  • 事件计数 : 当每次事件发生后,在事件处理函数中释放计数型信号量(计数值+1),其他任务会获取计数型信号量(计数值-1),这种场合一般在创建时将初始化计数值设置为0.
  • 资源管理 : 信号量表示有效资源数量。任务必须先获取信号量(信号计数值-1)才能获取资源控制权。当计数值减为0时表示没有资源。当任务使用完资源后,必须释放信号量(信号量计数值+1)。信号量创建时计数值应等于最大资源数目。

2、使用计数型信号量的过程:

答:创建计数型信号量 -> 释放信号量 -> 获取信号量

优先级翻转介绍

1、优先级翻转简介

答:优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行。

优先级翻转在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未知的严重后果。

在使用二值信号量的时候,经常会遇到优先级翻转的问题。

2、优先级翻转的例子

答:

高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。从现象上看,就像是中等优先级的任务比高优先级任务具有更高的优先权(即优先级翻转)。

互斥信号量

1、互斥信号量介绍

答:互斥信号量其实就是一个 拥有优先级翻转的二值信号量。

  • 二值信号量更适用于同步的应用。
  • 互斥信号量更适合那些需要互斥访问的应用(资源紧缺,需要资源保护)。

2、什么是优先级继承

答:当一个互斥信号量正在被一个低优先级的任务持有时,如果此时有一个高优先级的任务也尝试获取这个互斥信号量,那么这个高优先级的任务就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级。

3、优先级继承示例

答:

此时任务H的阻塞时间仅仅是任务L的执行时间,将优先级翻转的危害降低到了最低。

4、互斥信号量的注意事项

答:优先级继承并不能完全的消除优先级翻转的问题,它只是尽可能的降低优先级翻转带来的影响。

注意:互斥信号量不能用于中断服务函数中,原因如下:

  1. 互斥信号量有优先级继承的机制,但是中断不是任务,没有任务优先级,所以互斥信号量只能用于任务中,不能用于中断服务函数中。
  2. 中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。

5、互斥信号量相关API函数

答:使用互斥信号量:首先将宏configUSE_MUTEXES置1.

使用流程:创建互斥信号量 -> (task)获取信号量 -> (give)释放信号量

创建互斥信号量函数:

互斥信号量的释放和获取函数与二值信号量相同!!!只不过互斥信号量不支持中断中调用。

注意:创建互斥信号量时,会主动释放一次信号量。

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

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

相关文章

探索利用人工智能追踪逃犯的新技术

介绍 论文地址:https://arxiv.org/abs/2404.12626 近年来,"追逃游戏 "引起了人们的广泛关注。"追逃游戏 "模拟了多组追捕者与单个逃犯之间的追捕游戏。这种博弈发生在城市道路网等图上,有效地找到这种博弈的策略具有多种…

10月9-10日,优阅达邀您参与 2024 新加坡科技周,一站式体验亚洲前沿技术!

一场不容错过的亚洲商业技术盛会将于新加坡滨海湾金沙会展中心盛大开幕。 当全球化的浪潮席卷每一个角落,中国科技企业正站在新的起点,迎接出海的挑战与机遇。 一场不容错过的亚洲商业技术盛会 TECH WEEK SINGAPORE(点击报名新加坡科技周&am…

HyperWorks基于几何投影的网格变形

在Altair(HyperWorks)里,使用本节将演示如何通过 line difference 功能,将已有网格以几何图形为目标进行投影,以生成全新的网格模型。 图 7-5 网格变形模型的状态 Step01:读取模型。 (1) 打开文件 Exerci…

C++入门基础知识106—【关于C++continue 语句】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C continue 语句的相关内容!…

打不死的超强生命力

水熊虫是你可能听说过的小生物,它们能够在极端环境中生存,堪称地球上的“超强幸存者”。数十年来,科学家们试图通过各种极端实验杀死它们,但无论是把它们以900米/秒的速度发射,还是将它们暴露在宇宙辐射下,…

【含开题报告+文档+PPT+源码】基于springBoot+vue超市仓库管理系统的设计与实现

开题报告 随着电子商务的快速发展和物流行业的日益壮大,超市仓库管理系统的重要性也日益凸显。传统的超市仓库管理方式存在许多问题,比如人工操作繁琐、数据统计不准确、管理效率低下等。因此,需要设计和实现一个高效、智能的超市仓库管理系…

c语言中有关指针的题型整理,以及一些详解

(1)应注意其二维数组的书写形式,以及逗号表达式的 (2)要注意数组名表示首元素地址,解引用之后表示元素,&a表示整个数组,1表示指向后面的,ptr-1又指向数组末尾&#x…

鸿蒙架构-系统架构师(七十八)

1信息加密是保证系统机密性的常用手段。使用哈希校验是保证数据完整性的常用方法。可用性保证合法用户对资源的正常访问,不会被不正当的拒绝。()就是破坏系统的可用性。 A 跨站脚本攻击XSS B 拒绝服务攻击DoS C 跨站请求伪造攻击CSRF D 缓…

绘制YOLOv11模型在训练过程中,精准率,召回率,mAP_0.5,mAP_0.5:0.95,以及各种损失的变化曲线

一、本文介绍 本文用于绘制模型在训练过程中,精准率,召回率,mAP_0.5,mAP_0.5:0.95,以及各种损失的变化曲线。用以比较不同算法的收敛速度,最终精度等,并且能够在论文中直观的展示改进效果。支持…

React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性

文章目录 一、初始React1. React的基本认识2. Hello案例2.1 三个依赖2.2 渲染页面2.3 hello案例完整代码 二、类组件1. 封装类组件2. 组件里的数据3. 组件里的函数 (重点)4. 案例练习(1) 展示电影列表 三、JSX语法1. 认识JSX2. JSX书写规范及注释3. JSX嵌入变量作为子元素4. JS…

QT 10.8

Xmind: QT的核心机制 QT对话框

Python Django ORM 的工作原理

在 Web 开发中,处理数据库是非常常见的需求,尤其是在构建动态应用程序时。Django 作为一个流行的 Python Web 框架,提供了一套强大的工具帮助开发者轻松管理数据库。Django 的 ORM(对象关系映射,Object-Relational Map…

【STM32单片机_(HAL库)】4-5-2【定时器TIM】【感应开关盖垃圾桶】HC-SR04超声波模块实验

1.硬件 STM32单片机最小系统HC-SR04超声波模块 2.软件 hcsr04驱动文件添加main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h" #include "hcsr04.h"int main(void) {HAL_Init(); …

k8s微服务

一 、什么是微服务 用控制器来完成集群的工作负载,那么应用如何暴漏出去?需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service,应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…

全网首创Windows Powershell 批量创建、重命名和拷贝文件夹和文件到指定目录

哈喽大家好,欢迎来到虚拟化时代君(XNHCYL)。 “ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…(每天更新不间断,福利…

Redis 完整指南:命令与原理详解

目录 1. Redis 概述什么是 RedisRedis 应用场景 2. 安装与启动Redis 安装步骤源代码安装使用包管理器安装(以 Ubuntu 为例) 编译与启动命令编客户端连接 3. Redis 存储结构KV 存储结构数据结构类型String(字符串)List(…

selenium有多个frame页时的操作方法(5)

之前文章我们提到,在webdriver.WebDriver类有一个switch_to方法,通过switch_to.frame()可以切换到不同的frame页然后才再定位某个元素做一些输入/点击等操作。 比如下面这个测试网站有2个frame页:http://www.sahitest.com/demo/framesTest.h…

支付宝开放平台-开发者社区——AI 日报「10 月 10 日」

1 AI逆向绘画火了!一键重绘梵高《星空》,来自华盛顿大学 量子位|阅读原文 这项魔法来自华盛顿大学,项目名为Inverse Painting,相关论文已入选SIGGRAPH Asia 2024,其中两位作者还是东北大学(Bo…

车载SerDes历史和发展概述

1. 场景起源 1.1 原始时代: 在古老的很久很久以前,摄像头和显示屏等接口是多种多样的,丰富多彩的。大家各凭本事,各显神通,在各种地盘上成立各种帮派。比如CVBS、DVP、AHD、USB。 CVBS,包括后面的AHD&a…

【puppeteer】wvp-puppeteer制作 过程

、 制作 docker build -t dxw-pupet4 -f .\dockerfile2 . docker run -itd --name dxw4 -p 35105:35105 dxw-pupet4 推送到私库 docker tag dxw-pupet4:latest dualvenregistry:5000/wvp-puppeteer:v1.0 docker push dualvenregistry:5000/wvp-puppeteer:v1.0 重启桌面上…