中断管理学习

2023-12-13 09:43:25

中断管理

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

当你正在专心看书的时候,忽然来了一个电话,于是记下书的页码,去接电话,接完电话后接着刚才的页码继续看书,这是一个典型的中断的过程。

电话是老师打过来的,让你赶快交作业,你判断交作业的优先级比看书高,于是电话挂断后先做作业,等交完作业后再接着刚才的页码继续看书,这是一个典型的在中断中进行任务调度的过程。

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

实现这一功能的系统称为中断系统,申请CPU中断的请求源称为中断源。中断是一种异常,异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果不及时进行处理,轻则系统出错,重则导致系统毁灭性瘫痪。

所以正常地处理异常,避免错误的发生是提高软件鲁棒性非常重要的一环。

在这里插入图片描述

Cortex-M CPU架构基础

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

寄存器简介

Cortex-M系列CPU的寄存器组里有R0~R15共16个通用寄存器和若干特殊功能寄存器。

通用寄存器组里的R13作为堆栈指针寄存器(Stack Pointer,SP),其中堆栈指针寄存器可以是主堆栈指针(MSP),也可以是进程堆栈指针(PSP)。
R14作为连接寄存器(Link Register,LR),用于在调用子程序时,存储返回地址。
R15作为程序计数器(Program Counter,PC)。
在这里插入图片描述
特殊功能寄存器包括程序状态字寄存器组(PSRs)、中断屏蔽寄存器组(PRIMASK,FAULTMASK,BASEPRI)、控制寄存器(CONTROL),可以通过MSR/MRS指令来访问特殊功能寄存器,例如、

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

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

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

操作模式和特权级别

操作模式:分别为线程模式和处理模式。
如果进入异常或中断处理则进入处理模式,其它情况则为线程模式。

Cortex-M有两个运行级别,分别为特权级和用户级,线程模式可以工作在特权级或者用户级,而处理模式总工作在特权级,可通过CONTROL特殊寄存器控制。

嵌套向量中断控制块

Cortex-M中断控制器名为NVIC(嵌套向量中断控制器),支持中断嵌套功能。

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

PendSV系统调用

PendSV称为可悬起的系统调用,它是一种异常,可以像普通的中断一样被挂起,它是专门用来辅助操作系统进行上下文切换的。

PendSV异常会被初始化为最低优先级的异常。每次需要进行上下文切换的时候,会手动触发PendSV异常,在PendSV异常处理函数中进行上下文切换。

中断向量表

中断向量表是所有中断处理程序的入口,把用户中断服务程序与中断向量表中的中断向量联系在一起。当中断向量对应中断发生的时候,被挂接的用户中断服务程序就会被调用执行。

在这里插入图片描述
在Cortex-M内核上,所有中断都采用中断向量表的方式进行处理,即当一个中断触发时,处理器将直接判定是哪个中断源,然后直接跳转到相应的固定位置进行处理,每个中断服务程序必须排列在一起放在统一的地址上。

  __Vectors     DCD     __initial_sp             ; Top of Stack
                DCD     Reset_Handler            ; Reset 处理函数
                DCD     NMI_Handler              ; NMI 处理函数
                DCD     HardFault_Handler        ; Hard Fault 处理函数
                DCD     MemManage_Handler        ; MPU Fault 处理函数
                DCD     BusFault_Handler         ; Bus Fault 处理函数
                DCD     UsageFault_Handler       ; Usage Fault 处理函数
                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             PROC
                EXPORT NMI_Handler              [WEAK]
                B       .
                ENDP
HardFault_Handler       PROC
                EXPORT HardFault_Handler        [WEAK]
                B       .
                ENDP
… …

[WEAK]标识,是符号弱化标识,如果整个代码在链接时遇到了名称相同的符号,那么代码将使用未被弱化定义的符号。

中断处理过程

RT-Thread中断管理中,将中断处理程序分为中断前导程序、用户中断服务程序、中断后继程序三部分。
在这里插入图片描述
中断前导程序
保存CPU中断现场,这部分跟CPU架构相关,不同CPU架构的实现方式有差异。

对于Cortex-M来说,该工作由硬件自动完成。当一个中断触发并且系统进行响应时,处理器硬件会将当前运行部分的上下文寄存器自动压入中断栈中,这部分的寄存器包括PSR、PC、LR、R12、R3-R0寄存器。

通知内核进入中断状态,调用rt_interrupt_enter()函数,把全局变量rt_interrupt_nest加1,用来记录中断嵌套的层数。

void rt_interrupt_enter(void)
{
	rt_base_t level;
	level = rt_hw_interrupt_disable();
	rt_interrupt_nest++;
	rt_hw_interrupt_enable(level);
}

用户中断服务程序

在用户中断服务程序(ISR)中,分为两种情况,第一种情况是不进行线程切换,这种情况下用户中断服务程序和中断后续程序运行完毕后,退出中断模式,返回被中断的线程。

另一种情况是,在中断处理过程中需要进行线程切换,这种情况会调用rt_hw_context_switch_interrupt()函数进行上下文切换,该函数跟CPU架构相关,不同CPU架构的实现方式有差异。

在Cortex-M架构中,rt_hw_context_switch_interrupt()的函数实现流程如图所示
在这里插入图片描述

文章来源:https://blog.csdn.net/Caramel_biscuit/article/details/134829081
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。