嵌入式操作系统FreeRTOS(资源管理)

一、资源管理

        (1)基本临界区

        基本临界区是指宏taskENTER_CRITICAL()与taskEXIT_CRITICAL()之间的代码区间

        #define taskENTER_CRITICAL()        portENTER_CRITICAL()

        #define taskEXIT_CRITICAL()          portEXIT_CRITICAL()

        临界区是提供互斥功能的一种非常原始的实现方法。临界区的工作仅仅是简单地把中断全部关掉,或是关掉优先级在configMAX_SYSCAL_INTERRUPT_PRIORITY及以下的中断——依赖于具体使用的 FreeRTOS 移植。

0:任务切换时关闭所有中断   1:任务切换时关闭中断优先级为1、2、3的中断  2:任务切换时关闭中断优先级为2、3的中断  3:任务切换时关闭中断优先级为3的中断

        #define configMAX_SYSCALL_INTERRUPT_PRIORITY    0

临界区嵌套是安全的,因为内核有维护一个嵌套深度计数。临界区只会在嵌套深度为0时才会真正退出——即在为每个之前调用的taskENTER_CRITICAL()都配套调用了taskEXIT_CRITICAL()之后。

         (2)挂起(锁定)调度器

        也可以通过挂起调度器来创建临界区。挂起调度器有些时候也被称为锁定调度器。基本临界区保护一段代码区间不被其它任务或中断打断。由挂起调度器实现的临界区只可以保护一段代码区间不被其它任务打断,因为这种方式下,中断是使能的。如果一个临界区太长而不适合简单地关中断来实现,可以考虑采用挂起调度器的方式。但是唤醒(resuming, or un-suspending)调度器却是一个相对较长的操作。所以评估哪种是最佳方式需要结合实际情况。

        vTaskSuspendAll() API 函数

        void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION;

        通过调用vTaskSuspendAll()来挂起调度器。挂起调度器可以停止上下文切换而不用关中断。如果某个中断在调度器挂起过程中要求进行上下文切换,则个这请求也会被挂起,直到调度器被唤醒后才会得到执行。在调度器处于挂起状态时,不能调用FreeRTOS API函数。

        xTaskResumeAll() API 函数

        BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION;

        嵌套调用vTaskSuspendAll()和 xTaskResumeAll()是安全的,因为内核有维护一个嵌套深度计数。调度器只会在嵌套深度计数为0时才会被唤醒——即在为每个之前调用的vTaskSuspendAll()都配套调用了xTaskResumAll()之后。

        (3)互斥量(及二值信号量)

        互斥量是一种特殊的二值信号量,用于控制在两个或多个任务间访问共享资源。单词MUTEX(互斥量)源于“MUTual EXclusion”

        在用于互斥的场合,互斥量从概念上可看作是与共享资源关联的令牌。一个任务想要合法地访问资源,其必须先成功地得到(Take)该资源对应的令牌(成为令牌持有者)。 当令牌持有者完成资源使用,其必须马上归还(Give)令牌。只有归还了令牌,其它任务才可能成功持有,也才可能安全地访问该共享资源。一个任务除非持有了令牌,否则不允许访问共享资源。

        用于互斥的信号量必须归还。

        用于同步的信号量通常是完成同步之后便丢弃,不再归还。

        xSemaphoreCreateMutex() API函数

#define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )

        互斥量是一种信号量。FreeRTOS 中所有种类的信号量句柄都保存在类型为xSemaphore

Handle的变量中。

        互斥量在使用前必须先创建。创建一个互斥量类型的信号量需要使用xSemaphoreCreate

Mutex() API函数。

返回值:

        如果返回NULL表示互斥量创建失败。原因是内存堆空间不足导致FreeRTOS无法为互斥量分配结构数据空间。第五章提供更多关于内存管理方面的信息。

        返回非NULL值表示互斥量创建成功。返回值应当保存起来作为该互斥量的句柄。

        (4)优先级反转

采用互斥量提供互斥功能的潜在缺陷之一。在这种可能的执行流 程描述中,高优先级的任务2竟然必须等待低优先级的任务1放弃对互斥量的持有权。高优先级任务被低优先级任务阻塞推迟的行为被称为”优先级反转”。这是一种不合理的 行为方式,如果把这种行为再进一步放大,当高优先级任务正等待信号量的时候,一个介于两个任务优先之间的中等优先级任务开始执行——这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法执行!

        (5)优先级继承

        FreeRTOS 中互斥量与二值信号量十分相似——唯一的区别就是互斥量自动提供了一个基本的”优先级继承”机制。优先级继承是最小化优先级反转负面影响的一种方案 ——其并不能修正优先级反转带来的问题,仅仅是减小优先级反转的影响。优先级继承使得系统行为的数学分析更为复杂,所以如果可以避免的话,并不建议系统实现对优先级继承有所依赖。优先级继承暂时地将互斥量持有者的优先级提升至所有等待此互斥量的任务所具 有的最高优先级。持有互斥量的低优先级任务”继承”了等待互斥量的任务的优先级。

        (6)死锁

        死锁是利用互斥量提供互斥功能的另一个潜在缺陷。Deadlock 有时候会被更戏剧 性地称为”deadly embrace(抱死)”。

        当两个任务都在等待被对方持有的资源时,两个任务都无法再继续执行,这种情况就被称为死锁。考虑如下情形,任务A与任务B都需要获得互斥量X与互斥量Y以完 成各自的工作:

  1. 任务A执行,并成功获得了互斥量X。
  2. 任务A被任务B抢占。
  3. 任务B成功获得了互斥量Y,之后又试图获取互斥量X——但互斥量X已经被任务A持有,所以对任务B无效。任务B选择进入阻塞态以等待互斥 量X被释放。
  4. 任务A得以继续执行。其试图获取互斥量Y——但互斥量Y已经被任务B 持有而对

        任务A无效。任务A也选择进入阻塞态以等待互斥量Y被释放。

        这种情形的最终结局是,任务A在等待一个被任务B持有的互斥量,而任务B也在等待一个被任务 A 持有的互斥量。死锁于是发生,因为两个任务都不可能再执行下去了。和优先级反转一样,避免死锁的最好方法就是在设计阶段就考虑到这种潜在风险,这样设计出来的系统就不应该会出现死锁的情况。于实践经验而言,对于一个小型嵌入式系统,死锁并不是一个大问题,因为系统设计者对整个应用程序都非常清楚,所以能够找出发生死锁的代码区域,并消除死锁问题。

        (7)守护任务

        守护任务提供了一种干净利落的方法来实现互斥功能,而不用担心会发生优先级反转和死锁。守护任务是对某个资源具有唯一所有权的任务。只有守护任务才可以直接访问其守护的资源——其它任务要访问该资源只能间接地通过守护任务提供的服务。

 

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

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

相关文章

数据结构中的顺序表的删除和查找

对于顺序表,它包括:初始化,取值,查找,插入,以及删除。接下来就讲一讲删除和查找。 删除:它包括头删和尾删,为什么顺序表中要用到删除呢?按我的理解就是:为插入…

SRIO系列-基本概念及IP核使用

参考:串行RapidIO: 高性能嵌入式互连技术 | 德州仪器 SRIO协议技术分析 - 知乎 PG007 目录 一、SRIO介绍 1.1 概要 1.2 SRIO与传统互联方式的比较 1.3 串行SRIO标准 1.4 SRIO层次结构: 1.4.1 逻辑层 1.4.2 传输层协议 1.4.3 物理层 二、Xilinx…

内网隧道技术总结

隧道技术解决的是网络通信问题,因为在内网环境下,我们不同的内网主机管理员会进行不同的网络配置,我们就需要使用不同的方式去控制我们的内网主机。隧道技术是一个后渗透的过程,是可以是我们已经取得了一定的权限,在这…

【Visual Studio 2012中文版】下载安装以及使用方法

文章目录 前言一、下载安装包二、安装步骤1.双击VS2012_ULT_chs.iso文件打开2.双击vs_ultimate.exe打开安装程序3.选择要安装的功能4.软件正在安装,请耐心等待10分钟5.安装成功,点击“启动”6.激活码(产品密钥) 三、VS2012使用&am…

软考 系统架构设计师系列知识点之大数据设计理论与实践(10)

接前一篇文章:软考 系统架构设计师系列知识点之大数据设计理论与实践(9) 所属章节: 第19章. 大数据架构设计理论与实践 第3节 Lambda架构 19.3.5 Lambda架构优缺点 1. 优点 (1)容错性好 Lambda架构为大数…

HTML:Form表单控件主要标签及属性。name属性,value属性,id属性详解。表单内容的传递流程,get和post数据传递样式。表单数据传递实例

form表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

Vue源码解读学习

Vue源码 观察者模式 & 发布订阅 观察者模式&#xff1a;中心一对多 系统单点间的灵活和拓展&#xff08;广播的方式&#xff09; 发布订阅&#xff1a;将注册列表遍历发布给订阅者 initInject initState initProvide他们挂载顺序为什么这样设计&#xff1f; initstate…

【春秋云镜】CVE-2023-43291 emlog SQL注入

靶场介绍 emlog是一款轻量级博客及CMS建站系统&#xff0c;在emlog pro v.2.1.15及更早版本中的不受信任数据反序列化允许远程攻击者通过cache.php组件执行SQL语句。 不感兴趣的可以直接拉到最后面&#xff0c;直接获取flag 备注&#xff1a;没有通过sql注入获取到flag&…

C语言 【基础语法】

一、编程环境搭建 编译器&#xff1a;gcc 集成开发环境&#xff1a;vscode 1.1 安装vscode 1.2 设置中文包 插件 1.3 设置C/C扩展 安装 C/C Compile Run extension 和 C/C Extension Pack 扩展 二、基础语法 2.1 第一个c语言程序 2.2 数据类型 2.2.1 变量的语法(重点) …

RK3588 Android13 TvSetting 中增加 Usb 模式 Host/OTG 切换

前言 电视产品,客户要求在设置中设备偏好设置子菜单下增加一个USB模式切换菜单,一开始准备直接开整。但发现在开发者选项里就已经包含了一个USB模式 菜单了,只是没有 OTG HOST 这两选项,那就把这个菜单挪出来再增加一下就完事了,开整。 客户提供对比机图 效果图 framew…

OpenCV从入门到精通实战(六)——多目标追踪

基于原生的追踪 使用OpenCV库实现基于视频的对象追踪。通过以下步骤和Python代码&#xff0c;您将能够选择不同的追踪器&#xff0c;并对视频中的对象进行实时追踪。 步骤 1: 导入必要的库 首先&#xff0c;我们需要导入一些必要的Python库&#xff0c;包括argparse、time、…

Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录 前言5.3 Redis哨兵5.3.1 哨兵原理5.3.1.1 集群的结构和作用5.3.1.2 集群监控原理5.3.1.3 集群故障恢复原理 5.3.2 搭建哨兵集群5.3.3 RedisTemplate5.3.3.1 搭建测试项目5.3.3.2 场景测试 前言 Redis分布式缓存系列文章&#xff1a; Redis从入门到精通(十三)Redis分…

回文链表题解

题目&#xff1a;回文链表 分析 这道题目标签为简单题&#xff0c;但是如果要实现下面的进阶过程不是很简单。 拿到题目一般来说就是赶时间&#xff0c;没有要求的情况下直接使用一个列表存储所有的数值&#xff0c;然后判断这个列表是否满足回文&#xff0c;这个思路是比较简…

【1524】java投票管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 投票管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

IO引脚服用和映射

什么是端口复用 STM32F4 有很多的内置外设&#xff0c;这些外设的外部引脚都是与 GPIO 复用的。也就是说&#xff0c;一个 GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个 GPIO 作为内置外设使用的时候&#xff0c;就叫做复用。在芯片数据手册或STM32F4XX参考手…

传感器融合 | 适用于自动驾驶场景的激光雷达传感器融合项目_将激光雷达的高分辨率成像+测量物体速度的能力相结合

项目应用场景 面向自动驾驶场景的激光雷达传感器融合&#xff0c;将激光雷达的高分辨率成像测量物体速度的能力相结合&#xff0c;项目是一个从多个传感器获取数据并将其组合起来的过程&#xff0c;可以更加好地进行环境感知。项目支持 ubuntu、mac 和 windows 平台。 项目效果…

ASP.NET基于TCP协议的简单即时通信软件的设计与实现

摘 要 即时通信(Instant Message)&#xff0c;由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。即时通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微…

Android --- Activity

官方文档-activity Activity 提供窗口&#xff0c;供应在其中多个界面。此窗口通常会填满屏幕&#xff0c;但也可能小于屏幕并浮动在其他窗口之上。 大多数应用包含多个屏幕&#xff0c;这意味着它们包含多个 Activity。通常&#xff0c;应用中的一个 Activity 会被指定主 Ac…

Linux数据库自动备份 - 定时任务发到百度云盘、坚果云、邮箱附件

前言 1. 坚果云的webdav云盘最好&#xff01; &#xff08;免费账号每月1G上传流量&#xff09; 2. 不建议数据库备份文件发送到SMTP邮箱&#xff0c;因为对方服务器非常容易当做垃圾邮件处理&#xff0c;而且发信的SMTP账号会被封禁&#xff08;实测163发到QQ邮箱被封&…

lambda捕获列表

lambda是C11新特性之一&#xff0c;优点是&#xff1a; 1.可以直接匿名定义目标函数或函数对象&#xff0c;不需要额外写一个函数 2.lambda是一个匿名的内联函数 捕获列表 总结&#xff1a;【】为值捕获&#xff0c;只读 【&】为引用捕获&#xff0c;可读可写