当前位置: 代码迷 >> 综合 >> 从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(二十八)中断管理 NO.1 基本概念
  详细解决方案

从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(二十八)中断管理 NO.1 基本概念

热度:43   发布时间:2023-12-16 14:06:59.0

从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(二十八)中断管理 NO.1 基本概念

目录

一、异常与中断的基本概念:

二、中断管理的运作机制:

三、中断延迟的概念;

四、中断管理讲解:


一、异常与中断的基本概念:

       异常是指任何打断处理器正常执行,并且迫使处理器进入一个由有特权的特殊指令执行的事件。 异常通常可以分成两类:同步异常异步异常。由内部事件(像处理器指令运行产生的事件)引起的异常称为同步异常。异步异常主要是指由于外部异常源产生的异常,是一个由外部硬件装置产生的事件引起的异步异常。

       同步异常不同于异步异常的地方是事件的来源,同步异常事件是由于执行某些指令而从处理器内部产生的, 而异步异常事件的来源是外部硬件装置。

       FreeRTOS 源码中有许多处临界段的地方,临界段虽然保护了关键代码的执行不被打断,但也会影响系统的实时,任何使用了操作系统的中断响应都不会比裸机快。如果屏蔽中断时间超过了紧急中断能够容忍的限度,危害是可想而知的。

       FreeRTOS 的中断管理支持:

  • 开/关中断。
  • 恢复中断。
  • 中断使能。
  • 中断屏蔽。
  • 可选择系统管理的中断优先级。

(1)中断的介绍:

        与中断相关的硬件可以划分为三类:外设、中断控制器、 CPU 本身
        外设:当外设需要请求 CPU 时,产生一个中断信号,该信号连接至中断控制器。
        中断控制器:中断控制器是 CPU 众多外设中的一个,它一方面接收其他外设中断信号的输入,另一方面,它会发出中断信号给 CPU。可以通过对中断控制器编程实现对中断源的优先级、触发方式、打开和关闭源等设置操作。在 Cortex-M 系列控制器中常用的中断控制器是 NVIC(内嵌向量中断控制器 Nested Vectored Interrupt Controller) 。
        CPU: CPU 会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序。NVIC 最多支持 240 个中断,每个中断最多 256 个优先级。

(2)和中断相关的名词解释:

  • 中断号:每个中断请求信号都会有特定的标志,使得计算机能够判断是哪个设备提出的中断请求,这个标志就是中断号。
  • 中断请求:“紧急事件”需向 CPU 提出申请,要求 CPU 暂停当前执行的任务,转而处理该“紧急事件”,这一申请过程称为中断请求。
  • 中断优先级:为使系统能够及时响应并处理所有中断,系统根据中断时间的重要性和紧迫程度,将中断源分为若干个级别,称作中断优先级。
  • 中断处理程序:当外设产生中断请求后, CPU 暂停当前的任务,转而响应中断申请,即执行中断处理程序。
  • 中断触发:中断源发出并送给 CPU 控制信号,将中断触发器置“1”,表明该中断源产生了中断,要求 CPU 去响应该中断, CPU 暂停当前任务,执行相应的中断处理程序。
  • 中断触发类型:外部中断申请通过一个物理信号发送到 NVIC,可以是电平触发或边沿触发。
  • 中断向量:中断服务程序的入口地址。
  • 中断向量表:存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储。
  • 临界段:代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。

二、中断管理的运作机制:

当中断产生时,处理机将按如下的顺序执行

  1. 保存当前处理机状态信息
  2. 载入中断处理函数到PC寄存器
  3. 把控制权转交给处理函数并开始执行
  4. 当处理函数执行完成时,恢复处理器状态信息
  5. 从异常或中断中返回到前一个程序执行

(1)、 (3):在任务运行的时候发生了中断,那么中断会打断任务的运行, 那么操作系统将先保存当前任务的上下文环境,转而去处理中断服务函数。
(2)、 (4):当且仅当中断服务函数处理完的时候才恢复任务的上下文环境,继续运行任务。

(1):当中断 1 的服务函数在处理的时候发生了中断 2,由于中断 2 的优先级比中断 1 更高,所以发生了中断嵌套, 那么操作系统将先保存当前中断服务函数的上下文环境,并且转向处理中断 2,当且仅当中断 2 执行完的时候(2),才能继续执行中断 1。

三、中断延迟的概念;

中断延迟是指从硬件中断发生开始执行中断处理程序第一条指令之间的这段时间。

  1. 识别中断时间
  2. 等待中断打开时间
  3. 关闭中断时间

中断延迟 = 识别中断时间 + [等待中断打开时间] + [关闭中断时间]      

注意:“[ ]”的时间是不一定都存在的,此处为最大可能的中断延迟时间。

四、中断管理讲解:

        ARM Cortex-M 系列内核的中断是由硬件管理的, 而 FreeRTOS 是软件,它并不接管由硬件管理的相关中断(接管简单来说就是,所有的中断都由 RTOS 的软件管理,硬件来了中断时,由软件决定是否响应,可以挂起中断,延迟响应或者不响应) ,只支持简单的开关中断等,所以 FreeRTOS 中的中断使用其实跟裸机差不多的,需要我们自己配置中断,并且使能中断,编写中断服务函数,在中断服务函数中使用内核 IPC 通信机制,一般建议使用信号量、消息或事件标志组等标志事件的发生,将事件发布给处理任务,等退出中断后再由相关处理任务具体处理中断。
        用户可以自定义配置系统可管理的最高中断优先级的宏定义configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,它是用于配置内核中的basepri寄存器的,当basepri设置为某个值的时候,NVIC不会响应比该优先级低的中断,而优先级比之更高的中断则不受影响。就是说当这个宏定义配置为5的时候,中断优先级数值在0、1、2、3、4的这些中断是不受FreeRTOS屏蔽的,也就是说即使在系统进入临界段的时候,这些中断也能被触发而不是等到退出临界段的时候才被触发,当然,这些中断服务函数中也不能调用FreeRTOS提供的API函数接口,而中断优先级在5到15的这些中断是可以被屏蔽的,也能安全调用FreeRTOS提供的API函数接口。
        FreeRTOS 在 Cortex-M 系列处理器上也遵循与裸机中断一致的方法,当用户需要使用自定义的中断服务例程时,只需要定义相同名称的函数覆盖弱化符号即可。所以,FreeRTOS 在 Cortex-M 系列处理器的中断控制其实与裸机没什么差别。