RT-Thread 中断管理

中断管理

什么是中断?简单的解释就是系统正在处理某一个正常事件,忽然被另一个需要马上处理的紧急事件打断,系统转而处理这个紧急事件,待处理完毕,再恢复运行刚才被打断的事件。

生活中,我们经常会遇到这样的场景:
当你正在专心看书的时候,忽然来了一个电话,于是记下书的页码,去接电话,接完电话号接着刚才的页码继续看书,这是一个典型的中断过程。
电话是老师打过来的,让你赶快交作业,你判断交作业的优先级比看书高,于是电话挂断后先做作业,等交完作业后再接着刚才的页码继续看书,这是一个典型的在中断中进行任务调度的过程。

这些场景在嵌入式系统中也很常见,当CPU正在处理内部数据时,外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个异步事件。
处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程被称为中断。
实现这一功能的系统称为中断系统,申请CPU中断的请求源称为中断源。

中断是一种异常,异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果不及时进行处理,轻则系统出错,重则会导致系统毁灭性地瘫痪。所以正确处理异常,避免错误的发生是提高软件鲁棒性非常重要的一环。

在这里插入图片描述

中断处理与CPU架构密切相关。

Cortex-M CPU架构基础

不同于老的经典ARM处理器(例如:ARM7,ARM9),ARM Cortex-M处理器有一个非常不同的架构,Cortex-M是一个家族系列,其中包括Cortex M0/M3/M4/M7 多个不同型号,每个型号之间会有些区别,例如Cortex-M4比Cortex-M3多了浮点计算功能等,但它们的编程模型基本是一致的。

寄存器简介

Cortex-M系列CPU的寄存器组里有R0~R15共16个通用寄存器组和若干特殊功能寄存器。
在这里插入图片描述
通用寄存器组里的R13作为堆栈指针寄存器(Stack Pointer,SP);R14作为链接寄存器(Link Register,LR),用于在调用子程序时,存储返回地址;R15作为程序计数器(Program Counter,PC)。其中堆栈指针寄存器可以是主堆栈指针(MSP),也可以是进程堆栈指针(PSP)。

特殊功能寄存器包括程序状态字寄存器组(PSRs)、中断屏蔽寄存器组(PRIMASK,FAULTMASK,BASEPRI)、控制寄存器(CONTROL),可以通过MSR/MRS指令来访问特殊功能寄存器,例如:

MRS R0,CONTRO ;读取CONTROL到R0中
MSR CONTROL,R0 ;写入R0到CONTROL寄存器中

程序状态字寄存器里保存算术与逻辑,例如负数标志,零结果标志,溢出标志等等。
中断屏蔽寄存器组控制Cortex-M的中断除能。
控制寄存器用来定义特权级别和当前使用哪个堆栈指针。

如果是具有浮点单元的Cortex-M4或者Cortex-M7,控制寄存器也用来指示浮点单元当前是否在使用,浮点单元包含了32个浮点通用寄存器S0~S31和特殊FPSCR寄存器。

操作模式和特权级别

Cortex-M引入了操作模式和特权级别的概念,分别为线程模式和处理模式,如果进入异常或中断处理则进入处理模式,其它情况则为线程模式。

在这里插入图片描述
Cortex-M有两个运行级别,分别为特权级和用户级,线程模式可以工作在特权级或者用户级,而处理模式总工作在特权级,可通过CONTROL特殊寄存器控制。工作模式状态切换情况如上图所示。

Cortex-M的堆栈指针寄存器SP对应两个物理寄存器MSP和PSP,MSP为主堆栈,PSP为进程堆栈,处理模式总是使用MSP作为堆栈,线程模式可以选择使用MSP或PSP作为堆栈,同样通过CONTROL特殊寄存器控制。

复位后,Cortex-M默认进入线程模式、特权级、使用MSP堆栈。

嵌套向量中断控制器

Cortex-M中断控制器名为NVIC(嵌套向量中断控制器),支持中断嵌套功能。
当一个中断触发并且系统进行响应时,处理器硬件会将当前运行位置的上下文寄存器自动压入中断栈中,这部分的寄存器包括PSR、PC、LR、R12、R3-R0寄存器。
在这里插入图片描述
当系统正在服务一个中断时,如果有一个更高优先级的中断触发,那么处理器同样会打断当前运行的中断服务程序,然后把这个中断服务程序上下文的PSR、PC、LR、R12、R3-R0寄存器自动保存到中断栈中。

PendSV系统调用

PendSV称为可悬起的系统调用,它是一种异常,可以像普通的中断一样被挂起,它是专门用来辅助操作系统进行上下文切换的。
PendSV异常会被初始化为最低优先级的异常。
每次需要进行上下文切换的时候,会手动触发PendSV异常,在PendSV异常处理函数中进行上下文切换。

中断向量表

中断向量表是所有中断处理程序的入口,如下图所示是Cortex-M系列的中断处理过程:把一个函数(用户中断服务程序)同一个虚拟中断向量表中的中断向量联系在一起。当中断向量对应中断发生的时候,被挂接的用户中断服务程序就会被调用执行。
在这里插入图片描述
在Cortex-M内核上,所有中断都采用中断向量表的方式进行处理,即当一个中断触发时,处理器直接判定是哪个中断源,然后直接跳转到相应的固定位置进行处理,每个中断服务程序必须排列在一起,放在统一的地址上(这个地址必须要设置到NVIC的中断向量偏移寄存器中)。

中断向量表一般由一个数组定义或在起始代码中给出,默认采用起始代码给出:

__Vectors	DCD		__initial_spDCD 	Reset_HandlerDCD		NMI_HanlderDCD		HardFault_HandlerDCD		MemManage_HandlerDCD		BusFault_HandlerDCD		UsageFault_Handler
DCD     0                        ; 保留DCD     0                        ; 保留DCD     0                        ; 保留DCD     0                        ; 保留DCD     SVC_Handler              ; SVCall 处理函数DCD     DebugMon_Handler         ; Debug Monitor 处理函数DCD     0                        ; 保留DCD     PendSV_Handler           ; PendSV 处理函数DCD     SysTick_Handler          ; SysTick 处理函数… …NMI_Handler             PROCEXPORT NMI_Handler              [WEAK]B       .ENDP
HardFault_Handler       PROCEXPORT HardFault_Handler        [WEAK]B       .ENDP
… …

注意代码后面的[WEAK]标识,它是符号弱化标识,在[WEAK]前面的符号将被执行弱化处理,如果整个代码在链接时遇到了名称相同的符号,那么代码将使用未被弱化定义的符号,而与弱化符号相关的代码将被自动丢弃。

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

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

相关文章

【操作系统】优化MBR程序:让MBR调用显存吧

一.显存、显卡以及显示器的概述 显卡用于连接CPU和显示器,我们调用显示器时,其实就是利用显卡提供的IO接口间接地对显示器进行操作,所以显卡也称之为显示适配器。接下来我们将优化之前写的MBR程序(参考:【操作系统】BI…

【算法】基础算法001之双指针

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.数组分块&#xf…

数字孪生+可视化技术 构建智慧新能源汽车充电站监管平台

前言 充电基础设施为电动汽车提供充换电服务,是重要的交通能源融合类基础设施。近年来,随着新能源汽车产业快速发展,我国充电基础设施持续增长,已建成世界上数量最多、服务范围最广、品种类型最全的充电基础设施体系。着眼未来新…

基于css实现动画效果

介绍 本文将会基于css&#xff0c;实现各种动画效果&#xff0c;接下来会从简单几个例子入手。 案例 三颗球 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><title>React App</title><style>…

Unity编辑器扩展(外挂)

每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/ //添加变量悬浮提示文字 //给数值设定范围&#xff08;最小0&#xff0c;最大150&#xff09; //指定输入框&#xff0c;拥有5行 //默认…

js逆向第15例:猿人学第14题备而后动-勿使有变

文章目录 一、前言二、定位关键参数2.1 mz=如何得到?2.2 m=如何得到?2.3 变量c和e怎么来的?2.4 变量aa和bb怎么来的?2.5 函数E是什么?2.6 函数m5和函数gee是什么?三、代码实现四、参考文献一、前言 任务十四:抓取这5页的数字,计算加和并提交结果 此题难度还是很大,整…

工程送样!手把手教你用好广和通RedCap模组FG131FG132系列

2024年1月&#xff0c;广和通RedCap模组FG131&FG132系列已进入工程送样阶段&#xff0c;可为终端客户提供样片。广和通RedCap模组系列满足不同终端对5G速率、功耗、尺寸、成本的需求&#xff0c;全面助力RedCap技术的行业应用。 FG131&FG132系列基于骁龙X35 5G调制解调…

网络传输(TCP)

前言 我们tcpdump抓包时会看到除报文数据外&#xff0c;前面还有一段其他的数据&#xff0c;这段数据分为两部分&#xff0c;ip包头&#xff08;一般20字节&#xff09;和tcp包头&#xff08;一般20字节&#xff09;&#xff0c;一般这两个头长度和为40&#xff0c;我们直接跳…

一些很实用的技巧提高自动化测试覆盖率

自动化测试一直是测试人员的核心技能&#xff0c;也是测试的重要手段之一。尤其是在今年所谓的互联网寒冬的行情下&#xff0c;各大企业对测试人员的技术水平要求的很高&#xff0c;而测试人员的技术水平主要集中在三大自动化测试领域&#xff0c;再加测试辅助脚本的编写&#…

零样本学习研究方向sci四区期刊总结

APPLIED OPTICS sci 四区 非OA 出版商:OPTICA 期刊官方网站: http://www.opticsinfobase.org/ao/home.cfm 期刊投稿网址: http://www.opticsinfobase.org/ao/journal/ao/author.cfm#submit 虽然有zsl的名字但是这是全息图像专刊&#xff0c;跟我的方向应该不是太相关。 MO…

对git中tag, branch的重新理解

1. 问题背景 项目中之前一个tag&#xff08;v1.0&#xff09;打错了&#xff0c;想删除它&#xff0c;但我们从此tag v1.0中迁出新建分支Branch_v1.0,在此分支下修复了bug&#xff0c;想重新打一个tag v1.0&#xff0c;原来的tag v1.0可以删除掉吗&#xff1f; 错误的理解&am…

基于Python的影视数据智能分析系统开发

1. 前言 数据分析与可视化是当今数据分析的发展方向&#xff0c;大数据时代&#xff0c;数据资源具有海量特征&#xff0c;数据分析和可视化主要通过Python数据分析来实现。 基于Python的数据分析可视化和技术实现是目前Python数据分析的主要目的&#xff0c;Python可以为数据…