FreeRTOS资源管理

1.以前临界资源的保护方式

有使用过静态局部变量来保护临界资源,也有用队列,信号量,互斥量来保护临界资源。这些都是在多个任务会共同使用临界资源的情况下我们的保护方式。

问题提出:如果有个传感器在读取数据时有严格的时序,如果在读取数据中途被打断,就会读取错误,为了防止这一过程被打断我们会进行一些管理(关闭中断或调度器)。

1.2队列,信号量/互斥量,事件组,任务通知内部如何实现互斥的? 

核心就是谁跟我抢我就屏蔽谁,中断抢我就屏蔽中断,任务要抢我就进制调度器。什么意思呢?举两个例子。

1.2.1队列例子:

我们可以在中断里去写队列,也可以在任务里写队列,所以在写队列的函数里一定是去关闭中断的。我们要知道调度器切换任务也是基于中断的,我只关闭所有中断就可以达到防止任务和中断抢。因此写队列里一定是去关闭中断的。要注意的是关闭中断前先要记录当前中断的状态,再关闭中断,之后在根据记录的当前状态去恢复中断的状态。

写队列源码分析:

中断写队列

从图中可以看出在中断中写队列先记录当前中断状态,在返回中断状态的函数里执行了关闭中断的操作。在第二张图中是xQueueGenericSendFromISR()函数末尾执行的一个恢复中断的一个函数。 

任务写队列:

 

1.2.2事件组例子:

没有中断参与的我们只需要关闭调度器即可,比如事件组,事件组也有在中断中写事件组的函数为什么是关闭调度器呢?

在写事件组函数内部去写一个Timer队列,然后去守护任务会去唤醒定时器任务,在任务里去写事件值。虽然他是在中断中执行的,但是本质是去唤醒一个任务在任务中进行操作我们只需要停止调度器即可无需关中断。

​​

2.如何去关闭中断,如何去关闭调度器?

关闭中断:

关闭中断就是去操作某个寄存器。

关闭调度器:

设置一个变量,把这个变量++,根据这个变量是否为0,去判断是否要切换任务。

切换上下文, 加了之后这个变量就不等于0,就不进行切换。else才是执行任务切换。

2.1在任务中屏蔽中断

在任务中屏蔽中断的示例代码如下:

/* 在任务中,当前时刻中断是使能的* 执行这句代码后,屏蔽中断*/
taskENTER_CRITICAL();/* 访问临界资源 *//* 重新使能中断 */
taskEXIT_CRITICAL();

在 taskENTER_CRITICA()/taskEXIT_CRITICAL() 之间:

  • 低优先级的中断被屏蔽了:优先级低于、等于 configMAX_SYSCALL_INTERRUPT_PRIORITY
  • 高优先级的中断可以产生:优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY
    • 但是,这些中断ISR里,不允许使用FreeRTOS的API函数
  • 任务调度依赖于中断、依赖于API函数,所以:这两段代码之间,不会有任务调度产生

这套 taskENTER_CRITICA()/taskEXIT_CRITICAL() 宏,是可以递归使用的,它的内部会记录嵌套的深度,只有嵌套深度变为0时,调用 taskEXIT_CRITICAL() 才会重新使能中断。

使用 taskENTER_CRITICA()/taskEXIT_CRITICAL() 来访问临界资源是很粗鲁的方法:

  • 中断无法正常运行
  • 任务调度无法进行
  • 所以,之间的代码要尽可能快速地执行

2.2 在ISR中屏蔽中断

要使用含有"FROM_ISR"后缀的宏,示例代码如下:

void vAnInterruptServiceRoutine( void )
{/* 用来记录当前中断是否使能 */UBaseType_t uxSavedInterruptStatus;/* 在ISR中,当前时刻中断可能是使能的,也可能是禁止的* 所以要记录当前状态, 后面要恢复为原先的状态* 执行这句代码后,屏蔽中断*/uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();/* 访问临界资源 *//* 恢复中断状态 */taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );/* 现在,当前ISR可以被更高优先级的中断打断了 */
}

在 taskENTER_CRITICA_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR() 之间:

  • 低优先级的中断被屏蔽了:优先级低于、等于 configMAX_SYSCALL_INTERRUPT_PRIORITY
  • 高优先级的中断可以产生:优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY
    • 但是,这些中断ISR里,不允许使用FreeRTOS的API函数
  • 任务调度依赖于中断、依赖于API函数,所以:这两段代码之间,不会有任务调度产生

2.3 暂停调度器

如果有别的任务来跟你竞争临界资源,你可以把中断关掉:这当然可以禁止别的任务运行,但是这代价太大了。它会影响到中断的处理。

如果只是禁止别的任务来跟你竞争,不需要关中断,暂停调度器就可以了:在这期间,中断还是可以发生、处理。

使用这2个函数来暂停、恢复调度器:

/* 暂停调度器 */
void vTaskSuspendAll( void );/* 恢复调度器* 返回值: pdTRUE表示在暂定期间有更高优先级的任务就绪了*        可以不理会这个返回值*/
BaseType_t xTaskResumeAll( void );

示例代码如下:

vTaskSuspendScheduler();/* 访问临界资源 */xTaskResumeScheduler();

这套 vTaskSuspendScheduler()/xTaskResumeScheduler() 宏,是可以递归使用的,它的内部会记录嵌套的深度,只有嵌套深度变为0时,调用 taskEXIT_CRITICAL() 才会重新使能中断。

 3.总结

在使用临界资源时,需要严格的读取时序图时我们的管理方式为,在中断中我们就先关闭中断,在任务中我们就暂停调度器,除此之外互斥操作尽可能是使用信号量,互斥量来实现。

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

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

相关文章

前端基础学习html(1)

1.标题标签.h1,h2...h6 2.段落标签p 换行标签br 3.加粗strong(b) /倾斜em(i) /删除 del(s) /下划线ins(u) 4.盒子:div //一行一个 span//一行多个 5.img :src alt title width height border 图片src引用:相对路径 上级/同级/中级 绝对路径&#xff…

触动精灵纯本地离线文字识别插件

目的 触动精灵是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务,节省大量人工操作的时间。但触动精灵的图色功能比较单一,无法识别屏幕上的图像,根据图像的变化自动执行相应的操作。本篇文章主要讲解…

【Java基础】三大特性——多态

多态的前提条件:继承可以简单理解为:把子类看成父类类型(反之是错误的) 优缺点 弊端: 只能使用父类(父接口)中定义的功能好处: 函数的参数定义为父类(父接口)类型,可以…

使用idea编辑器回退git已经push的代码

直接上结果 选择想要回退的那次/多次提交历史, 右击, 选中 revert commit git自动产生一个Revert记录,然后我们会看到git自动将我第三次错误提交代码回退了,这个其实就相当于git帮我们手动回退了代码。 后续,只需要我们将本次改动push到远…

Vue 介绍

【1】前端发展史 前端的发展史可简述为: 从最初的静态页面编写,依赖后端模板渲染逐步演化为通过JavaScript(特别是Ajax技术)实现前后端分离,使得前端能够独立地加载数据和渲染页面随后,Angular、React、Vu…

open 函数到底做了什么

使用设备之前我们通常都需要调用 open 函数,这个函数一般用于设备专有数据的初始化,申请相关资源及进行设备的初始化等工作,对于简单的设备而言,open 函数可以不做具体的工作,你在应用层通过系统调用 open 打开设备…

2024年电化学、可再生能源与绿色发展国际会议(ICERGD2024)

2024年电化学、可再生能源与绿色发展国际会议(ICERGD2024) 会议简介 2024国际电化学、可再生能源与绿色发展大会(ICERGD2024)将在青岛隆重举行。本次会议聚焦电化学、可再生能源和绿色发展领域的最新研究成果和技术趋势,旨在促进相关领域…

OpenNJet:下一代云原生应用引擎

OpenNJet:下一代云原生应用引擎 前言一、技术架构二、新增特性1. 透明流量劫持2. 熔断机制3. 遥测与故障注入 三、Ubuntu 发行版安装 OpentNJet1. 添加gpg 文件2. 添加APT 源3. 安装及启动4. 验证 总结 前言 OpenNJet,是一款基于强大的 NGINX 技术栈构建…

typescript类型基础

typescript类型基础 枚举类型 enum Season {Spring,Summer,Fall,Winter }数值型枚举 enum Direction {Up,Down,Left,Right } const direction:Direction Direction.up每个数值型枚举成员都表示一个具体的数字,如果在定义一个枚举的时候没有设置枚举成员的值&…

Excel利用数据透视表将二维数据转换为一维数据(便于后面的可视化分析)

一维数据:属性值都不可合并,属性值一般在第一列或第一行。 二维数据:行属性或列属性是可以继续合并的,如下数据中行属性可以合并为【月份】 下面利用数据透视表将二维数据转换为一维数据: 1、在原来的数据上插入数据透…

MySQL 社区经理:MySQL 8.4 InnoDB 参数默认值为什么要这么改?

MySQL 8.4 LTS 版本,我们一共修改了 20 个 InnoDB 变量的默认值。 作者:Frederic Descamps,EMEA 和亚太地区的 MySQL 社区经理。于 2016 年 5 月加入 MySQL 社区团队。担任开源和 MySQL 顾问已超过 15 年。最喜欢的主题是高可用和高性能。 本…

解决一个朋友的nbcio-boot的mysql数据库问题

1、原先安装mysql5.7数据库,导入我的项目里的带数据有报错信息 原因不明 2、只能建议用docker进行msyql5.7的安装 如下,可以修改成自己需要的信息 docker run -p 3306:3306 --name mastermysql -v /home/mydata/mysql/data:/var/lib/mysql -e MYSQL_R…

python绘图(pandas)

matplotlib绘图 import pandas as pd abs_path rF:\Python\learn\python附件\pythonCsv\data.csv df pd.read_csv(abs_path, encodinggbk) # apply根据多列生成新的一个列的操作,用apply df[new_score] df.apply(lambda x : x.数学 x.语文, axis1)# 最后几行 …

c#word文档:1.创建空白Word文档及保存/2.添加页内容...

---创建空白Word文档 --- (1)创建一个名为OfficeOperator的类库项目。引用操作Word的.NET类库 (2)定义用于操作Word的类WordOperator1。添加引用Microsoft.Office.Interop.Word命名空间。 (3)为WordOper…

Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)

目录 前言 一、表面着色器的补充介绍 二、案例viewDir详解 1.viewDir是什么 2.viewDir的作用 3.使用viewDir写shader 前言 注意观察的小伙伴会发现,这组教程前半部分我们在编写着色器的时候,用的是顶点着色器和片元着色器的组合。 SubShader{CGPRO…

个股期权是什么,个股期权使用方法?

今天期权懂带你了解个股期权是什么,个股期权使用方法?个股期权作为金融市场的重要工具之一,是指投资者在约定时间内有权而非义务以约定价格买卖特定数量的个股的金融衍生品。 个股期权是什么? 个股期权合约是一种由交易所统一设定的标准化合…

git-新增业务代码分支

需求 使用git作为项目管理工具管理项目,我需要有两个分支,一个分支是日常的主分支,会频繁的推送和修改代码并推送另外一个是新的业务代码分支,是一个长期开发的功能,同时这个业务分支需要频繁的拉取主分支的代码&#…

Python_GUI框架 Pyside6的常用部件介绍

PySide6是一个非常完善的商用级别的GUI框架,涉及的知识点相对比较多,今天我先在这里介绍一下我们在实际应用中最常见的几种部件及其功能: 1. QMainWindow QMainWindow 提供了一个主应用程序窗口的框架,通常包含一个菜单栏、工具…

pytest教程-37-钩子函数-pytest_collection_finish

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_collection_start钩子函数的使用方法,本小节我们讲解一下pytest_collection_finish钩子函数的使用方法。 pytest_collection_finish(session) 是一个 pytest 钩子函数&…

03_Redis

文章目录 Redis介绍安装及使用redis的核心配置数据结构常用命令stringlistsethashzset(sortedset) 内存淘汰策略Redis的Java客户端JedisRedisson Redis 介绍 Redis是一个NoSQL数据库。 NoSQL: not only SQL。表示非关系型数据库(不支持SQL标准语法)。 …