FreeRTOS学习 --- 中断管理

什么是中断?

        让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断

中断执行机制,可简单概括为三步: 

1,中断请求

        外设产生中断请求(GPIO外部中断、定时器中断等)

2,响应中断

        CPU停止执行当前程序,转而去执行中断处理程序(ISR

3,退出中断

        执行完毕,返回被打断的程序处,继续往下执行

STM32中断是怎么进入到中断服务程序的?

1.中断请求:当外部事件(如外部中断,定时器溢出等)或者内部事件(如ADC转换完成、串口接收完成等)发生时,相应的中断源会向NVIC(嵌套向量中断控制器)发生一个中断请求。

2.中断优先级判断:NVIC会根据中断的优先级来判断是否应该处理该中断。如果当前活动的中断优先级低于新请求的中断,则进行中断嵌套,处理更高优先级的中断。

3.保存上下文:当CPU接收中断并准备跳转到中断程序时,它会自动将当前的程序状态保存到栈中。这是为了在处理完中断后能够恢复中断前的状态继续执行。

4.跳转到中断向量:CPU通过查找中断向量表来确定中断的服务程序入口地址。STM32的中断向量表位于FLASH的开始部分,每个中断都有一个固定的向量地址。

5.执行中断服务程序:一旦确定了入口地址,CPU就会跳转到该地址并开始执行中断服务程序。在中断服务程序中,通常需要先清除中断标志,然后执行响应的处理代码。

6.恢复上下文:中断服务程序执行完成后,CPU会从栈中恢复之前保存的程序状态。

7.返回主程序:恢复上下文后,程序会从原来被中断的地方继续执行。

中断优先级分组设置

        ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器。也就是有256个优先级

        但STM32,只用了中断优先级配置寄存器的高4[7 : 4],所以STM32提供了最大16级的中断优先等级

         STM32 的中断优先级可以分为抢占优先级和子优先级

抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断

子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行

注意:中断优先级数值越小越优先

一共有 5 种分配方式,对应着中断优先级分组的 5 个组

 通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置

HAL_Init中设置

FreeRTOS官网关于中断说明:https://www.freertos.org/RTOS-Cortex-M3-M4.html

特点:

1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数

2、建议将所有优先级位指定为抢占优先级位,方便FreeRTOS管理

(调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)

3、中断优先级数值越小越优先,任务优先级数值越大越优先

 中断相关寄存器

三个系统中断优先级配置寄存器,分别为 SHPR1SHPR2SHPR3

SHPR1寄存器地址:0xE000ED18

SHPR2寄存器地址:0xE000ED1C

SHPR3寄存器地址:0xE000ED20

表出自:《Cortex M3权威指南(中文)》286

 

FreeRTOS如何配置PendSVSystick中断优先级?

 中断相关寄存器

        三个中断屏蔽寄存器,分别为 PRIMASKFAULTMASK BASEPRI

        FreeRTOS所使用的中断管理就是利用的BASEPRI这个寄存器 

        BASEPRI:屏蔽优先级低于某一个阈值的中断

        比如: BASEPRI设置为0x50,代表中断优先级在5~15内的均被屏蔽,0~4的中断优先级正常执行(0x50表示的是优先级小于等于5的中断被屏蔽,至于为什么是0x50,这个0是低四位在STM32中不用来设置中断优先级,STM32只用高四位[7:4]来设置中断优先级)

         BASEPRI屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断

关中断程序示例:

 中断优先级在5 ~ 15的全部被关闭

 BASEPRI设置为0x50时:

在中断服务函数中调度FreeRTOSAPI函数需注意:

        1、中断服务函数的优先级需在FreeRTOS所管理的范围内

        2、在中断服务函数里边需调用FreeRTOSAPI函数,必须使用带“FromISR”后缀的函数

开中断程序示例:

 FreeRTOS中断管理就是利用BASEPRI寄存器实现的

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

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

相关文章

Vue+Echarts 实现青岛自定义样式地图

一、效果 二、代码 <template><div class"chart-box"><chart ref"chartQingdao" style"width: 100%; height: 100%;" :options"options" autoresize></chart></div> </template> <script> …

嵌入式知识点总结 Linux驱动 (七)-Linux驱动常用函数 uboot命令 bootcmd bootargs get_part env_get

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.ioremap 2.open 3.read 4.write 5.copy_to_user 6.copy_from_user 7.总结相关uboot命令以及函数 1.bootcmd 1.1.NAND Flash操作命令 2.bootargs 2.1 root 2.2 rootf…

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器&#xff0c;算是比较的基础容器&#xff0c;也是大家在日常开发中常用到的容器&#xff0c;因为底层用到的数据结构比较简单&#xff0c;笔者就将他们三者放到一起做下对比分析&#xff0c;介绍下基本用法&a…

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…

高精度加法乘法

高精度加法&乘法都是把数字转化成数组进行运算&#xff0c;存储 高精度加法 建议多在纸上画画&#xff0c;梳理思路 代码实现 输入字符串 //初始化数组存储 int a[250]{0}; int b[250]{0}; int c[251]{0}; //定义字符串&#xff0c;输入字符串 string s1,s2; getline(c…

Python 列表思维导图

Python 列表思维导图 腾讯云盘下载连接 https://share.weiyun.com/Ri6bUJed

获取snmp oid的小方法1(随手记)

snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值&#xff0c;找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…

【leetcode练习·二叉树】计算完全二叉树的节点数

本文参考labuladong算法笔记[拓展&#xff1a;如何计算完全二叉树的节点数 | labuladong 的算法笔记] 如果让你数一下一棵普通二叉树有多少个节点&#xff0c;这很简单&#xff0c;只要在二叉树的遍历框架上加一点代码就行了。 但是&#xff0c;力扣第第 222 题「完全二叉树的…

WebStorm安装及配置迁移

一、安装 官方下载安装包 WebStorm&#xff1a;JetBrains 出品的 JavaScript 和 TypeScript IDE 适用于2024版本及以下 按需安装后重启电脑 运行WebStorm,注意不要选择大陆地区&#xff0c;语言不选择中文&#xff0c;运行激活文件 二、配置迁移 根据已有软件导出相关配置…

ARM内核:嵌入式时代的核心引擎

引言 在当今智能设备无处不在的时代&#xff0c;ARM&#xff08;Advanced RISC Machines&#xff09;处理器凭借其高性能、低功耗的特性&#xff0c;成为智能手机、物联网设备、汽车电子等领域的核心引擎。作为精简指令集&#xff08;RISC&#xff09;的典范&#xff0c;ARM核…

离线大模型-通义千问

关部署离线模型的教程就不写了&#xff0c;百度一搜一大堆 Kamailio介绍 1. Kamailio介绍 user: 您了解kamailio吗&#xff1f;assistant: 是的&#xff0c;我了解Kamailio。Kamailio是一个开源的SIP服务器和代理&#xff0c;用于处理VoIP&#xff08;Voice over Internet…

Hypium+python鸿蒙原生自动化安装配置

Hypiumpython自动化搭建 文章目录 Python安装pip源配置HDC安装Hypium安装DevEco Testing Hypium插件安装及使用方法​​​​​插件安装工程创建区域 Python安装 推荐从官网获取3.10版本&#xff0c;其他版本可能出现兼容性问题 Python下载地址 下载64/32bitwindows安装文件&am…

细说机器学习算法之ROC曲线用于模型评估

系列文章目录 第一章&#xff1a;Pyhton机器学习算法之KNN 第二章&#xff1a;Pyhton机器学习算法之K—Means 第三章&#xff1a;Pyhton机器学习算法之随机森林 第四章&#xff1a;Pyhton机器学习算法之线性回归 第五章&#xff1a;Pyhton机器学习算法之有监督学习与无监督…

ROS_noetic-打印hello(√)

笔者创建的路径如下 进入到src&#xff0c; catkin_create_pkg helloworld roscpp rospy std_msgs Helloworld-C hello_C.cpp #include "ros/ros.h" int main(int argc, char *argv[]) { //执行 ros 节点初始化 ros::init(argc,argv,"hello"); //创…

冲刺蓝桥杯之速通vector!!!!!

文章目录 知识点创建增删查改 习题1习题2习题3习题4&#xff1a;习题5&#xff1a; 知识点 C的STL提供已经封装好的容器vector&#xff0c;也可叫做可变长的数组&#xff0c;vector底层就是自动扩容的顺序表&#xff0c;其中的增删查改已经封装好 创建 const int N30; vecto…

Golang 并发机制-2:Golang Goroutine 和竞争条件

在今天的软件开发中&#xff0c;我们正在使用并发的概念&#xff0c;它允许一次执行多个任务。在Go编程中&#xff0c;理解Go例程是至关重要的。本文试图详细解释什么是例程&#xff0c;它们有多轻&#xff0c;通过简单地使用“go”关键字创建它们&#xff0c;以及可能出现的竞…

C++并发编程指南07

文章目录 [TOC]5.1 内存模型5.1.1 对象和内存位置图5.1 分解一个 struct&#xff0c;展示不同对象的内存位置 5.1.2 对象、内存位置和并发5.1.3 修改顺序示例代码 5.2 原子操作和原子类型5.2.1 标准原子类型标准库中的原子类型特殊的原子类型备选名称内存顺序参数 5.2.2 std::a…

智慧园区如何融合五大技术实现全方位智能管理与服务创新

内容概要 在现代社会&#xff0c;智慧园区正逐渐成为管理与服务创新的风向标。以快鲸智慧园区管理系统为例&#xff0c;它为园区的数字化管理提供了一种全新的模式。该系统的核心在于如何充分应用物联网技术&#xff0c;自动化与信息化的结合&#xff0c;使得园区能够实现实时…

JxBrowser 7.41.7 版本发布啦!

JxBrowser 7.41.7 版本发布啦&#xff01; • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 &#x1f517; 点击此处了解更多详情。 &#x1f193; 获取 30 天免费试用。

DeepSeek R1-Zero vs. R1:强化学习推理的技术突破与应用前景

&#x1f4cc; 引言&#xff1a;AI 推理的新时代 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09; 的规模化扩展成为 AI 研究的主流方向。然而&#xff0c;LLM 的扩展是否真的能推动 通用人工智能&#xff08;AGI&#xff09; 的实现&#xff1f;DeepSeek 推出的 R1…