FreeRTOS( 任务与中断优先级,临界保护)

资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理)

目录

一、中断优先级

1、NVIC基础知识

2、FreeRTOS配置NVIC

3、SVC、PendSV、Systick中断

4、不受FreeRTOS管理的中断

5、STM32CubeMX配置

二、任务优先级

1、任务优先级说明

2、任务优先级分配方案

3、中断优先级与任务优先级区别

4、任务优先级修改与获取

三、开关中断与临界段函数

1、临界段概念

2、开关中断函数

3、任务代码临界段处理函数

4、中断代码临界段处理函数

四、优先级与临界代码编程测试

一、中断优先级

1、NVIC基础知识

NVIC即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。STM32的中有一个强大而方便的NVIC,它是属于CM4内核的器件。NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对CM4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32 的NVIC是 CM4 的NVIC的一个子集

2、FreeRTOS配置NVIC

官方强烈建议将中断优先级分组设置为4,即抢占优先级可配置范围是0-15,数值越小,抢占优先级越高。

3、SVC、PendSV、Systick中断

SVC 中断:

在 FreeRTOS 的移植文件 ports.c 中有用到 SVC 中断的 0 号系统服务,即 SVC 0。此中断在 FreeRTOS中仅执行一次,用于启动第一个要执行的任务。另外,由于 FreeRTOS 没有配置 SVC 的中断优先级,默认没有配置的情况下,SVC 中断的优先级就是最高的 0。

4、不受FreeRTOS管理的中断

FreeRTOS 内核源码中有多处开关全局中断的地方,这些开关全局中断会加大中断延迟时间。比如在源码的某个地方关闭了全局中断,但是此时有外部中断触发,这个中断的服务程序就需要等到再次开启全局中断后才可以得到执行。开关中断之间的时间越长,中断延迟时间就越大,这样极其影响系统的实时性。如果这是一个紧急的中断事件,得不到及时执行的话,后果是可想而知的。针对这种情况,FreeRTOS 就专门做了一种新的开关中断实现机制。关闭中断时仅关闭受 FreeRTOS管理的中断,不受 FreeRTOS 管理的中断不关闭,这些不受管理的中断都是高优先级的中断,用户可以在这些中断里面加入需要实时响应的程序。

二、任务优先级

1、任务优先级说明

① FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的 configMAX_PRIORITIES 进行配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1。比如我们配置此宏定义为 5,那么用户可以使用的优先级号是 0,1,2,3,4,不包含 5,对于这一点,初学者要特别的注意。

② 用户配置任务的优先级数值越小,那么此任务的优先级越低,空闲任务的优先级是 0。

③ 建议用户配置宏定义 configMAX_PRIORITIES 的最大值不要超过 32,即用户任务可以使用的优先级范围是0到31。因为对于CM内核的移植文件,用户任务的优先级不是大于等于32的话,portmacro.h文件中的宏定义configUSE_PORT_OPTIMISED_TASK_SELECTION会优化优先级列表中要执行的最高优先级任务的获取算法(对于 CM 内核的移植文件,此宏定义默认是使能的,当然,用户也可以在FreeRTOSConfig.h 文件中进行配置)。

④ 如果用户在 FreeRTOSConfig.h 文件中配置宏定义 configUSE_TIME_SLICING 为 1,或者没有配置此宏定义,时间片调度都是使能的。另外,只要芯片资源允许,可以配置任意多个同优先级任务。

⑤ FreeRTOS 中处于运行状态的任务永远是当前能够运行的最高优先级任务。

2、任务优先级分配方案

任务优先级设置推荐方式如下图:

① IRQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的。② 高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类任务。③ 低优先级的时间片调度任务:比如 emWin 的界面显示,LED 数码管的显示等不需要实时执行的都可以归为这一类任务。④ 空闲任务:空闲任务是系统任务。⑤ 特别注意:IRQ 任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数即可),只有这样,高优先级任务才会释放 CPU 的使用权,,从而低优先级任务才有机会得到执行。

3、中断优先级与任务优先级区别

中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。对于 STM32,中断优先级的数值越小,优先级越高。而 FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低。

4、任务优先级修改与获取

①优先级获取:UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ); 

函数描述:函数 vTaskPriorityGet 用于获取 FreeRTOS 任务优先级。

使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1

#define INCLUDE_vTaskPriorityGet    1

如果第二个参数里面填的是 NULL,即数值 0 的话,那么获取的优先级就是当前正在执行的任务

②优先级修改:void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ); 

函数描述:函数 vTaskPrioritySet 用于实现 FreeRTOS 任务优先级的修改。 

 第 1 个参数是任务句柄,用于区分不同的任务。 

 第 2 个参数是给任务配置的新优先级。

使用这个函数要注意以下问题:

 使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1

#define INCLUDE_vTaskPrioritySet   1

如果第一个参数里面填的是 NULL,即数值 0 的话,那么配置的就是当前正在执行的任务

 如果被修改的任务的优先级,修改后高于正在执行的任务,将执行任务切换,切换到修改好的高优先级任务。

第二个参数数值不可大于等于 FreeRTOSConfig.h 文件中的宏定义:#define configMAX_PRIORITIES 配置的数值。

三、开关中断与临界段函数

1、临界段概念

①代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许中断打断。为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。

②进入临界段前操作寄存器 basepri 关闭了所有小于等于宏定义 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY所定义的中断优先级,这样临界段代码就不会被中断干扰到,而且实现任务切换功能的 PendSV 中断和滴答定时器中断是最低优先级中断,所以此任务在执行临界段代码期间是不会被其它高优先级任务打断的。退出临界段时重新操作 basepri 寄存器,即打开被关闭的中断(这里我们不考虑不受 FreeRTOS 管理的更高优先级中断)

③除了 FreeRTOS 操作系统源码所带的临界段以外,用户写应用的时候也有临界段的问题,比如以下两种:

 读取或者修改变量(特别是用于任务间通信的全局变量)的代码,一般来说这是最常见的临界代码。

 调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。总之,对于临界段要做到执行时间越短越好,否则会影响系统的实时性。

2、开关中断函数

reeRTOS 提供了一组开关中断函数,比较简单。

具体实现如下:

#define taskDISABLE_INTERRUPTS()    portDISABLE_INTERRUPTS()

#define taskENABLE_INTERRUPTS()     portENABLE_INTERRUPTS()

进一步跟踪宏定义的实现如下:

#define portDISABLE_INTERRUPTS()    vPortRaiseBASEPRI()

#define portENABLE_INTERRUPTS()     vPortSetBASEPRI( 0 )

3、任务代码临界段处理函数

任务代码进入和退出临界段的函数如下:

#define taskENTER_CRITICAL()   portENTER_CRITICAL()

#define taskEXIT_CRITICAL()       portEXIT_CRITICAL()

4、中断代码临界段处理函数

中断代码进入和退出临界段的函数如下:

#define taskENTER_CRITICAL_FROM_ISR()    portSET_INTERRUPT_MASK_FROM_ISR()

#define taskEXIT_CRITICAL_FROM_ISR( x )  portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

四、优先级与临界代码编程测试

①不受操作系统管理的中断设置。如下:0-4不受操作系统控制

 ②获取与设置任务优先级使能

 ③NVIC界面

④任务临界段保护

 ⑤中断临界段保护

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

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

相关文章

数据结构笔记--链表经典高频题

目录 前言 1--反转单向链表 2--反转单向链表-II 3--反转双向链表 4--打印两个有序链表的公共部分 5--回文链表 6--链表调整 7--复制含有随机指针结点的链表 8--两个单链表相交问题 前言 面经: 针对链表的题目,对于笔试可以不太在乎空间复杂度&a…

SD-MTSP:蜘蛛蜂优化算法SWO求解单仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法(Spider wasp optimizer,SWO)由Mohamed Abdel-Basset等人于2023年提出,该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为,具有搜索速度快,求解精度高的优势。蜘蛛蜂优化算…

Spring Gateway+Security+OAuth2+RBAC 实现SSO统一认证平台

背景:新项目准备用SSO来整合之前多个项目的登录和权限,同时引入网关来做后续的服务限流之类的操作,所以搭建了下面这个系统雏形。 关键词:Spring Gateway, Spring Security, JWT, OAuth2, Nacos, Redis, Danymic datasource, Jav…

竞赛项目 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习

文章目录 0 简介1 课题背景🚩 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现数据集 2.4 实现代码2.5 检测效果 3 口罩佩戴检测算法评价指标3.1 准确率(Accuracy)3.2 精确率(Precision)和召回率(Recall)3.3 平均精…

ASP.NET Core中间件记录管道图和内置中间件

管道记录 下图显示了 ASP.NET Core MVC 和 Razor Pages 应用程序的完整请求处理管道 中间件组件在文件中添加的顺序Program.cs定义了请求时调用中间件组件的顺序以及响应的相反顺序。该顺序对于安全性、性能和功能至关重要。 内置中间件记录 内置中间件原文翻译MiddlewareDe…

【容器化】Oceanbase镜像构建及使用

通过该篇文章可以在国产X86-64或ARM架构上构建商业版oceanbase,只需要替换pkg安装包即可。下面截图主要以国产X86-64安装为例,作为操作截图: 镜像构建目录说明 pkg:用来存放安装包及脚本,抛出rpm其他是脚步,这些rpm包…

直接在html中引入Vue.js的cdn来实现Vue3的组合式API

Vue3的组合式API是使用setup函数来编写组件逻辑的。setup函数是Vue3中用于替代Vue2的选项API(如data、methods等)的一种方式。在setup函数中,你可以访问到一些特殊的响应式对象,并且可以返回一些可以在模板中使用的数据、方法等。…

Python编程——谈谈函数的定义、调用与传入参数

作者:Insist-- 个人主页:insist--个人主页 本文专栏:Python专栏 专栏介绍:本专栏为免费专栏,并且会持续更新python基础知识,欢迎各位订阅关注。 目录 一、理解函数 二、函数的定义 1、语法 2、定义一个…

【Linux】内核宏定义解释postcore_initcall,arch_initcall,subsys_initcall

postcore_initcall postcore_initcall(pcibus_class_init) 是一个宏,用于在Linux内核初始化过程中注册一个后期初始化函数。 这个宏的含义如下: postcore_initcall 是一个宏定义,用于指定注册的函数在内核初始化的哪个阶段执行。 pcibus_cl…

deleteDatabase失败处理

准备清理环境时发现deleteDatabase告警,如下图 SYSorcl> startup; ORACLE instance started. Total System Global Area 1.6106E10 bytes Fixed Size 8639712 bytes Variable Size 2449476384 bytes Datab…

CentOS-6.3安装MySQL集群

安装要求 安装环境:CentOS-6.3 安装方式:源码编译安装 软件名称:mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz 下载地址:http://mysql.mirror.kangaroot.net/Downloads/ 软件安装位置:/usr/local/mysql 数据存放位…

HTTP代理授权方式介绍

在网络爬虫过程中,我们经常需要使用HTTP代理来实现IP隐藏、突破限制或提高抓取效率。而为了确保代理的正常使用,并避免被滥用,代理服务商通常会采用授权方式。在本文中,我们将介绍几种常见的HTTP代理授权方式,以帮助你…

Tomcat部署及优化

Tomcat概述 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个 核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。在中小型系统和并发访问用户不是…

自建hexo博客并将原有的文章发布其上

1、保存粘贴到memo9中的博客文章,并将txt转换成word文档 varPowerShellPath, CommandLine: string; // , ScriptPath begin//save to txtMemo9.Lines.SaveToFile(test.txt);memo10.Lines.SaveToFile(txt2word.ps1);//save as docxPowerShellPath : powershell.exe…

企业有VR全景拍摄的需求吗?能带来哪些好处?

在传统图文和平面视频逐渐疲软的当下,企业商家如何做才能让远在千里之外的客户更深入、更直接的详细了解企业品牌和实力呢?千篇一律的纸质材料已经过时了,即使制作的再精美,大家也会审美疲劳;但是你让客户远隔千里&…

uniapp 微信小程序 订阅消息

第一步&#xff0c;需要先去小程序官方挑选一下订阅模板拿到模板id 订阅按钮在头部导航上&#xff0c;所以 <u-navbar :bgColor"bgColor"><view class"u-nav-slot" slot"left" click"goSubscribe"><image :src"g…

需要数电发票接口的,先熟悉下数电发票基本常识

最近有一些技术小伙伴来咨询数电发票接口的时候&#xff0c;对数电发票的一些常识不太了解&#xff0c; 导致沟通起来比较困难。比较典型的这三个问题&#xff1a; 一、开具数电票时&#xff0c;如何设置身份认证频次&#xff1f; 请公司的法定代表人或财务负责人登录江苏省电…

uni-app之app上传pdf类型文件

通过阅读官方文档发现&#xff0c;uni.chooseFile在app端不支持非媒体文件上传&#xff1b; 可以使用这个插件&#xff0c;验证过可以上传pdf&#xff1b;具体使用可以去看文档 插件地址 就是还是会出现相机&#xff0c;这个可能需要自己解决下 实现功能&#xff1a;上传只能上…

ejbca:8443报文跟踪

安装客户端证书后&#xff0c;访问管理员页面 :8443/ejbca/adminweb 同时在wireshark抓包 1、客户端向对端发出Client hello 在Server Hello看到一个颁发给客户端的证书&#xff0c;颁发给5be85c9c1df9&#xff08;客户端node hostname 5be85c9c1df9&#xff09;但没有在Clie…

MySQL索引优化分析

MySQL索引优化分析 为什么你写的sql查询慢&#xff1f;为什么你建的索引常失效&#xff1f;通过本章内容&#xff0c;你将学会MySQL性能下降的原因&#xff0c;索引的简介&#xff0c;索引创建的原则&#xff0c;explain命令的使用&#xff0c;以及explain输出字段的意义。助你…