当前位置: 首页 > news >正文

【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) )

后记

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

相关文章:

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

文章目录 一、三种优先级的概念辨析1. 先理清楚两个概念&#xff1a;CPU 和 MPU2. Cortex-M3 内核与 STM32F1XX 控制器有什么关系3. 优先级的概念辨析① Cortex-M3 内核和 STM32F1XX 的中断优先级② FreeRTOS 的任务的优先级 二、 Cortex-M3 内核的中断优先级1. 中断编号2. 优先…...

stm32串口通信(PC--stm32;中断接收方式;附proteus电路图;开发方式:cubeMX)

单片机型号STM32F103R6: 最后实现的效果是&#xff0c;开机后PC内要求输入1或0&#xff0c;输入1则打开灯泡&#xff0c;输入0则关闭灯泡&#xff0c;输入其他内容则显示错误&#xff0c;值得注意的是这个模拟的东西只能输入英文 之所以用2个LED灯是因为LED电阻粗略一算就是1…...

计算机毕设 基于机器学习与大数据的糖尿病预测

文章目录 1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE&#xff08;递归特征消除法&#xff09;4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重新进行…...

【数据结构】——查找、散列表的相关习题

目录 一、选择填空判断题题型一&#xff08;顺序、二分查找的概念&#xff09;题型二&#xff08;分块查找的概念&#xff09;题型三&#xff08;关键字比较次数&#xff09; 二、应用题题型一&#xff08;二分查找判定树&#xff09; 一、选择填空判断题 题型一&#xff08;顺…...

提升Java开发效率:掌握HashMap的常见方法与基本原理

文章目录 前言一、概述1. 认识HashMap2. HashMap 的作用和重要性3. 简要讲解 HashMap 的基本原理和实现方式 二、了解 HashMap 创建及其的常见操作方法1. HashMap的创建2. 添加元素 put()3. 访问元素 get()4. 删除元素 remove()5. 计算大小 size()6. 迭代 HashMap for-each7.判…...

PostgreSQL系统概述

目录 写在前面 1.简介 1.1何为关系型数据库 1.2何为对象型数据库 2.特性 3.代码结构 3.1数据库集簇 3.2Parser查询分析流程 3.3内部查询树组成部分 3.3.1目标列表 3.4Optimizer查询优化流程 3.4.1查询计划 3.5非计划查询的SQL命令 写在前面 如有错误请指正&#xf…...

掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「中篇」

文章目录 掌握AI助手的魔法工具&#xff1a;解密Prompt&#xff08;提示&#xff09;在AIGC时代的应用「中篇」一、指南原则1: 使用明确和具体的指令原则2: 给模型思考的时间 二、迭代三、总结与提取四、局限与改善五、总结 掌握AI助手的魔法工具&#xff1a;解密Prompt&#x…...

git svn:使用 git 命令来管理 svn 仓库

git-svn 使用教程 参考以下&#xff1a; https://cloud.tencent.com/developer/article/1415892 # 在SVN仓库上使用Git 源 https://blog.csdn.net/jiejie11080/article/details/106917116 # git svn clone速度慢的解决办法 http://blog.chinaunix.net/uid-11639156-id-30774…...

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现 一、分布式数据库相关知识点二、摘要三、正文四、总结一、分布式数据库相关知识点 软考高级系统架构设计师系列之:分布式存储技术...

GeoHash之存储篇

前言&#xff1a; 在上一篇文章GeoHash——滴滴打车如何找出方圆一千米内的乘客主要介绍了GeoHash的应用是如何的&#xff0c;本篇文章我想要带大家探索一下使用什么样的数据结构去存储这些Base32编码的经纬度能够节省内存并且提高查询的效率。 前缀树、跳表介绍&#xff1a; …...

后端项目开发:集成接口文档(swagger-ui)

swagger集成文档具有功能丰富、及时更新、整合简单&#xff0c;内嵌于应用的特点。 由于后台管理和前台接口均需要接口文档&#xff0c;所以在工具包构建BaseSwaggerConfig基类。 1.引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>…...

代码随想录训练营29天|●* 491.递增子序列 * 46.全排列 * 47.全排列 II

class Solution {vector<vector<int>>res;vector<int>vec;void backing(vector<int>& nums,int index){if(vec.size()>2&&is(vec)){res.push_back(vec);}unordered_set<int> uset; // 使用set对本层元素进行去重for(int iindex;i…...

uniapp日期选择组件优化

<uni-forms-item label="出生年月" name="birthDate"><view style="display: flex;flex-direction: row;align-items: center;height: 100%;"><view class="" v-...

AI驱动的大数据创新:探索软件开发中的机会和挑战

文章目录 机会数据驱动的决策自动化和效率提升智能预测和优化个性化体验 挑战数据隐私与安全技术复杂性数据质量和清洗伦理和社会问题 案例&#xff1a;智能代码生成工具总结 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &…...

国产化-银河麒麟V10系统及docker的安装

一、最近在研究国产化操作系统&#xff0c;“银河麒麟V10”&#xff0c; 在我电脑本机vmware 15的虚拟机中进行安装测试&#xff1b; 1.点击这里提交产品试用申请&#xff0c;不过只需要随便输入&#xff0c;手机号验证码验证后方可跳转至下载地址产品试用申请国产操作系统、银…...

计算机毕设 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 今天学长向大家介绍一个机器视觉的毕设项目&#xff0c;二维码 / 条形码检测与识别 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 1 二维码检测 物体检…...

Redis原理剖析

一、Redis简介 Redis是一个开源的&#xff0c;基于网络的&#xff0c;高性能的key-value数据库&#xff0c;弥补了memcached这类key-value存储的不足&#xff0c;在部分场合可以对关系数据库起到很好的补充作用&#xff0c;满足实时的高并发需求。 Redis跟memcached类似&#…...

【送书活动】AI时代,程序员需要焦虑吗?

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

什么是 JSON:理解和运用 JSON 的基本概念

现在程序员还有谁不知道 JSON 吗&#xff1f;无论对于前端还是后端&#xff0c;JSON 都是一种常见的数据格式。那么 JSON 到底是什么呢&#xff1f; JSON 的定义 JSON &#xff08;JavaScript Object Notation&#xff09; &#xff0c;是一种轻量级的数据交换格式。它的使用…...

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27 一、题目名称&#xff1a;异或和二、题目名称&#xff1a;生命进化书三、题目名称&#xff1a;熊孩子拜访 一、题目名称&#xff1a;异或和 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...