【FreeRTOS】【STM32】中断详细介绍

文章目录

  • 一、三种优先级的概念辨析
    • 1. 先理清楚两个概念:CPU 和 MPU
    • 2. Cortex-M3 内核与 STM32F1XX 控制器有什么关系
    • 3. 优先级的概念辨析
      • ① Cortex-M3 内核和 STM32F1XX 的中断优先级
      • ② FreeRTOS 的任务的优先级
  • 二、 Cortex-M3 内核的中断优先级
    • 1. 中断编号
    • 2. 优先级与编号的关系
    • 3. 优先级配置寄存器
  • 三、STM32F1XX 的中断优先级
    • 1. 中断数量和编号
    • 2. 中断优先级配置
  • 三、SVC 和 PendSV 详解
    • 1. SVC
      • ① SVC 是什么
      • ② SVC 的中断优先级
      • ③ 使用 SVC 的好处
    • 2. PendSV
      • ① PendSV 是什么
      • ② PendSV 的应用
  • 四、运行在 STM32 上的 FreeRTOS 中断优先级的配置
    • 1. 中断优先级分组
    • 2. FreeRTOS 内核优先级
      • ① 定义
      • ② 内核优先级的作用范围
    • 3. 临界段保护的中断优先级
      • ① 临界段保护就是关中断
      • ② 如何关中断
  • 后记

一、三种优先级的概念辨析

本篇文章将对下面三种优先级进行概念辨析:

  • Cortex-M3 内核的中断优先级
  • STM32F1XX 控制器的中断优先级
  • FreeRTOS 的任务的优先级

1. 先理清楚两个概念:CPU 和 MPU

  • “CPU”:“Central Processing Unit”,即中央处理器。它是计算机系统中的主要组件,负责执行指令并进行数据处理和计算。CPU通常由控制单元、算术逻辑单元(ALU)和寄存器等部分组成。

  • “MPU:”“Microprocessor Unit”,微处理器单元。MPU通常用来指代一种单芯片的微处理器,它集成了处理器核心、内存、接口和其他外设等功能,常用于嵌入式系统和嵌入式设备。MPU可以被视为一种较小规模的计算机系统。

2. Cortex-M3 内核与 STM32F1XX 控制器有什么关系

先看看较为官方的解释:

Cortex-M3内核是一种由Arm公司设计的低功耗、高性能的32位RISC处理器内核。它具有较高的执行效率和能效,专门针对嵌入式系统设计。

STMicroelectronics的STM32F1系列是十分流行的Cortex-M3微控制器系列,提供了多个型号和配置选项,包括STM32F103、STM32F107等

简而言之,Cortex-M3 内核是 ARM 这个公司设计的一种 CPU 架构,而 STM32F1XX 控制器是 ST 公司在 CPU 上连接了片上外设、存储器、接口的一种 MPU,也就是 Cortex-M3 芯片
在这里插入图片描述
此图片来自《CM3 权威指南》一书。

3. 优先级的概念辨析

① Cortex-M3 内核和 STM32F1XX 的中断优先级

由于芯片制造商可以对 Cortex-M3 内核进行裁剪(只使用 Cortex-M3 的一部分),所以在内核方面, STM32F1XX 芯片实际上使用了完整的 Cortex-M3 内核的一部分。

所以这两者的优先级是相通的。(注意我使用的是“相通”,而不是“相同”,这意味着 STM32F1XX 芯片的各种设置可以在 Cortex-M3 架构的规定下由芯片厂商灵活自行设计)

② FreeRTOS 的任务的优先级

FreeRTOS 是运行于 STM32 芯片上的操作系统,其任务的优先级决定了设置的各类任务的执行顺序,是任务之间的优先级。

任务之间的优先级限制于 FreeRTOS 框架内,而 FreeRTOS 内核又被限制于 STM32 框架上。

二、 Cortex-M3 内核的中断优先级

(注:以下混合使用“中断”和“异常”这俩个术语,意思一致)

1. 中断编号

  • ARM 为 Cortex-M3 内核 一共设计了 255 个中断,编号为 1~255,而 0 表示没有异常
  • 这里的编号单纯只是这些中断的一个序号,而不是优先级
  • 编号 1-15 是内核中产生的、而 16-255 属于来自内核外

2. 优先级与编号的关系

  • 对于编号为 1-3 的中断,其优先级是固定的,从 -3 到 -1
  • 编号为 4-255 的中断,其优先级都是可以编程的
    在这里插入图片描述
    在这里插入图片描述

3. 优先级配置寄存器

  • Cortex-M3 内核最多可以使用 8 位来表示优先级,共 256 级( STM32F1 使用了 4 位共 16 级)
  • 抢占优先级最多为 128 级
  • Cortex-M3 内核把这 8 位还分成两半,高位的一半配置抢占优先级,低位的一半配置子优先级
    • 当使用 8 位时,至少有 1 位表示子优先级
      在这里插入图片描述

三、STM32F1XX 的中断优先级

1. 中断数量和编号

  • STM32F1XX 只使用了 Cortex-M3 内核中定义的六十几个中断(深色代表内核中断):
    在这里插入图片描述
    在这里插入图片描述
    等等等等
  • 可以看到,编号 0 及以上的中断的优先级都是可编程的

2. 中断优先级配置

  • STM32F1XX 使用了 4 位来表示中断优先级
    • 不管使用多少位,都是 MSB 对齐的
    • 所以实际上是使用优先级配置寄存器的高 4 位进行中断优先级配置
  • 也有抢占优先级和子优先级之分
抢占优先级子优先级
0 位4 位
1 位3 位
2 位2 位
3 位1 位
4 位0 位

三、SVC 和 PendSV 详解

  • “SVC”:SVC是"Supervisor Call"的缩写,也被称为系统服务调用或简称为系统调用。
  • “PendSV”:PendSV是"Pending Supervisor Call"的缩写,用于可悬起系统调用。

1. SVC

① SVC 是什么

用户程序(基于 FreeRTOS 之上的程序)通过 SVC 使用系统服务函数。

一个例子是当启动任务调度器的时候, FreeRTOS 通过 SVC 启动第一个任务,详见:【学习日记】【FreeRTOS】调度器函数实现详解

② SVC 的中断优先级

实际上,在 FreeRTOS 中并未显式配置 SVC 的中断优先级。

我们可以开启调试查看,可以看到默认优先级是 0:
在这里插入图片描述
在这里插入图片描述

③ 使用 SVC 的好处

  1. 操作系统(OS)负责控制具体的硬件,使用户程序从控制硬件的繁文缛节中解脱出来。
  2. OS的代码经过充分的测试,提高系统的健壮性和可靠性。
  3. 用户程序无需在特权级下执行,避免用户程序误操作导致系统瘫痪的风险。
  4. 通过SVC的机制,使用户程序与硬件无关,简化了开发难度和繁琐度,使应用程序跨硬件平台移植成为可能。
  5. 应用程序只需了解操作系统提供的应用编程接口(API),并使用SVC提出请求,而无需了解硬件的操作细节。

2. PendSV

① PendSV 是什么

可悬起的系统调用,顾名思义,是可以像普通的中断一样被悬起的中断。也就是触发后如果优先级不够,会等到时机合适再执行。

在 FreeRTOS 默认配置为优先级最低的 15。

② PendSV 的应用

在 FreeRTOS 中,被用于任务的切换。

在 FreeRTOS 中,我们在 SysTick 中断中触发 PendSV,在 PendSV 进行任务切换。

如果不使用 PendSV 进行任务切换,那么当 SysTick 的优先级不是最低时:

  • 理想情况下,任务A 执行一段时间后进入 SysTick 中断,在 SysTick 中断中进行上下文切换到任务B
    在这里插入图片描述

  • 糟糕的情况是,任务A 执行一段时间后进入了一个中断,在中断中又进入到 SysTick 中断,并在其中尝试上下文切换,也就是切换到主线程中,但是第一个中断还未执行完毕(这会导致 Usage Fault,因为其使中断执行一半就跳会到主线程,如果允许这样做系统将没有实时性的保证)
    在这里插入图片描述
    如果使用了 PendSV,则可以使上下文切换的动作暂时搁置,先执行完中断再进行上下文的切换。

不过,值得深思的是,在 FreeRTOS 的默认配置中, SysTick 的中断优先级被配置为最低的 15,这意味着其不能打断任何的中断,那么使用 PendSV 可能有其他更充分的理由。

四、运行在 STM32 上的 FreeRTOS 中断优先级的配置

1. 中断优先级分组

使用分组 4,也就是 16 级的抢占优先级、0 级的子优先级:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

2. FreeRTOS 内核优先级

① 定义

FreeRTOSConfig.h中,由 configKERNEL_INTERRUPT_PRIORITY 定义:

  • configPRIO_BITS:使用 4 位来表示优先级
  • configLIBRARY_LOWEST_INTERRUPT_PRIORITY:配置内核优先级为最低级 15 级
  • configKERNEL_INTERRUPT_PRIORITY:将最低优先级左移,使 MSB 对齐
#define configPRIO_BITS       		4//中断最低优先级
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

② 内核优先级的作用范围

那么这个内核优先级究竟是谁在用呢?实际上就是 SysTick 中断和 PendSV 中断在使用。
SysTick 用于时间片轮转、PendSV 用于上下文切换:

#define portNVIC_PENDSV_PRI					( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
#define portNVIC_SYSTICK_PRI				( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )/* Make PendSV and SysTick the lowest priority interrupts. */portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;

3. 临界段保护的中断优先级

① 临界段保护就是关中断

  • 之前提到过 FreeRTOS 的临界段保护,进入临界段也就是关中断。
    在这里插入图片描述

② 如何关中断

  • 关中断是通过写 basepri 进行操作的:
    详情见【学习日记】【FreeRTOS】临界段的保护
static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;__asm{/* Set BASEPRI to the max syscall priority to effect a criticalsection. */msr basepri, ulNewBASEPRIdsbisb}
}
  • basepri 是 MSB 对齐(在 STM32F1 中,basepri 是八位的寄存器,可只使用其中某几位,MSB 对齐指最高位对齐,也就是当只使用其中某几位时从最高位开始用,低位不管)用法和优先级配置寄存器类似:
    在这里插入图片描述

  • basepri 设定为大于其值的中断都会被屏蔽(此处的中断优先级指 STM32 的中断优先级而不是 FreeRTOS 我们为任务设定的优先级):
    在这里插入图片描述
    下面是 FreeRTOS 中进入临界段时对 basepri 的设置,设置为 5,也就是 FreeRTOS 进入临界段时,中断优先级 5-15 的中断都被屏蔽:

//系统可管理的最高中断优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

后记

如果您觉得本文写得不错,可以点个赞激励一下作者!
如果您发现本文的问题,欢迎在评论区或者私信共同探讨!
共勉!

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

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

相关文章

Prometheus关于微服务的监控

在微服务架构下随着服务越来越多,定位问题也变得越来越复杂,因此监控服务的运行状态以及针对异常状态及时的发出告警也成为微服务治理不可或缺的一环。服务的监控主要有日志监控、调用链路监控、指标监控等几种类型方式,其中指标监控在整个微服务监控中比重最高,也是实际生…

kafka学习笔记

1、kafka是什么&#xff1f; kafka是一个高吞吐&#xff0c;分布式&#xff0c;基于发布/订阅的消息系统&#xff0c;最大的特性就是可以实时的处理大量的数据以满足各种需求场景&#xff1a;日志收集&#xff0c;离线和在线的消息消费&#xff0c;等等 2、kakfa的基础架构&am…

SMC_TRAFO_GantryCutter2 (FB) 带刀片旋向龙门

裁布机&#xff1a;刀片按XY走向&#xff0c;偏转刀片角度。 pi&#xff1a;目标位置矢量&#xff08;x&#xff0c;y&#xff09;&#xff0c;插值器的输出 v&#xff1a;当前路径切线的矢量&#xff0c;插值器的输出 dOffsetX&#xff1a; x轴的附加偏移 dOffsetY&#xf…

NeRFMeshing - 精确提取NeRF中的3D网格

准确的 3D 场景和对象重建对于机器人、摄影测量和 AR/VR 等各种应用至关重要。 NeRF 在合成新颖视图方面取得了成功&#xff0c;但在准确表示底层几何方面存在不足。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 我们已经看到了最新的进展&#xff0c;例如 NVIDIA 的 …

基于 xhr 实现 axios

基于 xhr 实现 axios 上面我们讲到二次封装 axios &#xff0c;但是现在我们尝试完全脱离 axios&#xff0c;自己实现一个 axios&#xff0c;由于 axios 底层是基于 xhr 做了二次封装&#xff0c;所以我们也可以尝试一下。 xhr 二次封装 src/plugins/xhr.js /*** 请求拦截器…

新能源电驱动总成相关标准简介

新能源电驱动总成相关标准简介 电驱动系统标准体系是电动汽车标准体系中重要的组成部分&#xff0c;其制定和更新对于保障电动汽车的使用性能和安全性能具有非常重要的作用。 随着电动汽车行业的快速发展和普及&#xff0c;电驱动系统的重要性也越来越凸显。为了确保电动汽车的…

循环神经网络(RNN) | 项目还不成熟 |还在初级阶段

一&#xff0c;定义 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种深度学习神经网络架构&#xff0c;专门设计用于处理序列数据&#xff0c;如时间序列数据、自然语言文本等&#xff08;一般用来解决序列问题&#xff09;。 因为它们具…

ResNet详解:网络结构解读与PyTorch实现教程

目录 一、深度残差网络&#xff08;Deep Residual Networks&#xff09;简介深度学习与网络深度的挑战残差学习的提出为什么ResNet有效&#xff1f; 二、深度学习与梯度消失问题梯度消失问题定义为什么会出现梯度消失&#xff1f;激活函数初始化方法网络深度 如何解决梯度消失问…

线性代数的学习和整理12: 矩阵与行列式,计算上的差别对比

目录 1 行列式和矩阵的比较 2 简单总结矩阵与行列式的不同 3 加减乘除的不同 3.1 加法不同 3.2 减法不同 3.3 标量乘法/数乘 3.3.1 标准的数乘对比 3.3.2 数乘的扩展 3.4 乘法 4 初等线性变换的不同 4.1 对矩阵进行线性变换 4.2 对行列式进行线性变换 1 行列式和…

算法通关村第5关【白银】| 哈希和栈经典算法题

1.两个栈实现队列 思路&#xff1a;两个栈&#xff0c;一个输入栈&#xff0c;一个输出栈。 当需要输入的时候就往inStack中插入&#xff0c;需要输出就往outStack中输出&#xff0c;当输出栈是空就倒出输入栈的数据到输出栈中&#xff0c;这样就保证了后插入的数据从栈顶倒入…

Docker修改容器ulimit的全部方案及各方案的详细步骤

要修改Docker容器的ulimit&#xff08;用户资源限制&#xff09;&#xff0c;有以下三种方案&#xff0c;每个方案的详细步骤如下&#xff1a; 方案一&#xff1a;在Dockerfile中设置ulimit 打开您的Dockerfile。在文件中添加以下命令来修改ulimit&#xff1a;RUN ulimit -n …

他们朝我扔泥巴(scratch)

前言 纯~~~属~~~虚~~~构~~~&#xff08;同学看完短视频要我做&#xff0c;蟹蟹你&#xff09; 用scratch做的&#xff0c;幼稚得嘞(&#xffe3;_&#xffe3;|||)呵呵&#xff08;强颜欢笑&#xff09; 完成视频 视频试了好久&#xff0c;就是传不上来&#xff0c;私信我加我…

LabVIEW开发灭火器机器人

LabVIEW开发灭火器机器人 如今&#xff0c;自主机器人在行业中有着巨大的需求。这是因为它们根据不同情况的适应性。由于消防员很难进入高风险区域&#xff0c;自主机器人出现了。该机器人具有自行检测火灾的能力&#xff0c;并通过自己的决定穿越路径。 由于消防安全是主要问…

开源项目-数据可视化分析平台

哈喽,大家好,今天给大家带来一个开源项目-数据可视化分析平台。项目通过SpringBoot实现 数据可视化分析平台主要有数据源管理,项目管理,数据集管理,图表管理,看板管理等功能 登录 数据源管理 数据源管理功能可以添加MySQL,Oracle,PostgreSQL等类型的数据源信息 项目…

24 WEB漏洞-文件上传之WAF绕过及安全修复

目录 WAF绕过上传参数名解析:明确哪些东西能修改?常见绕过方法&#xff1a;符号变异-防匹配( " ;)数据截断-防匹配(%00 ; 换行)重复数据-防匹配(参数多次)搜索引擎搜索fuzz web字典文件上传安全修复方案 WAF绕过 safedog BT(宝塔) XXX云盾 宝塔过滤的比安全狗厉害一些&a…

LeetCode 热题 100(七):105. 从前序与中序遍历序列构造二叉树、14. 二叉树展开为链表

题目一&#xff1a; 105. 从前序与中序遍历序列构造二叉树https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 思路&#xff1a;依据前序遍历的根左右和中序遍历的左根右&#xff0c; 且根左长度&#xff1d;左根 代码&#xff1a; …

【已解决】pycharm突然双击无法打开,重启电脑也不管用

1.问题&#xff1a; pycharm突然双击无法打开&#xff0c;重启电脑也不管用 2.解决 2.1 方法一&#xff08;修改Roaming&#xff09; 1.找到C盘对应路径下的pycharm版本 2. 用记事本打开文件类型为VMOPTIONS文件 3. 修改或删除最后一行的映射路径 4.保存退出 2.2 方法二…

二级MySQL(二)——编程语言,函数

SQL语言又称为【结构化查询语言】 请使用FLOOR&#xff08;x&#xff09;函数求小于或等于5.6的最大整数 请使用TRUNCATE&#xff08;x&#xff0c;y&#xff09;函数将数字1.98752895保留到小数点后4位 请使用UPPER&#xff08;&#xff09;函数将字符串‘welcome’转化为大写…

Linux重置ROOT密码(CentOS)

解释说明 在CentOS中重置root密码通常需要进入单用户模式&#xff0c;这是一个没有密码限制的特殊模式&#xff0c;允许您以root权限登录系统并更改密码。 重启系统 如果您无法登录到系统&#xff0c;可以通过重启系统来开始这个过程。您可以使用虚拟机控制台、物理服务器控制台…

Leetcode 191.位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…