全部
  • 全部
  • 解决方案
  • 技术问答
  • 视频中心
  • 知识分享
  • 技术资讯
  • SEED产品
400-048-1230
订阅
  • 首页
  • 解决方案
  • 技术问答
  • 视频中心
  • 知识分享
  • 技术资讯
  • SEED产品
NXP S32K 难点解析之 SDK的中断处理机制
来源:Arrow 发布:2022/03/31 浏览量:936

程序在正常执行代码时发生触发事件,打断了正在执行的程序,转到事件处理程序中去执行,完成后返回事件触发时运行的程序处。

中断的基础知识

 

 什么是中断 
程序在正常执行代码时发生触发事件,打断了正在执行的程序,转到事件处理程序中去执行,完成后返回事件触发时运行的程序处。
 中断的意义 
最大的意义是解放主程序,不用循环去查寻触发事件是否发生,使程序更高效。
 中断入口 
芯片中固定了一段地址空间,用来存储中断执行的程序代码,用于存放中断服务函数的地址。发生中断事件,程序自动跳转到该中断的指定入口地址,并执行此地址的代码,一般为跳转到用户中断服务函数。
  
 以51类单片机汇编语言为例说明 
ORG 000BH  ;定时器T0中断指定入口地址
LJMP INT_TIMER0  ;跳转到中断服务函数
 
当程序正常运行时发生定时器T0 中断事件,则程序自动到Flash 指定地址00BH中运行,执行此处存储的LJMP INT_TIMER0 是跳转命令和地址,所以程序会到INT_TIMER0 中执行。

ARM Corex-MX的NVIC

 

ARM Cortex‐MX在内核水平上搭载了一颗中断控制器——嵌套向量中断控制器NVIC (Nested Vectored Interrupt Controller),其与内核是紧耦合的,管理控制着整个芯片中断的相关功能。
 
核心功能包括中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等。
 
 中断向量表IVT 
下表存放的是中断服务函数的入口地址,当发生中断时,CPU来这个表中查询,以此获取中断函数的入口地址。如上文51类早期单片机已固化到Flash 对应地址,ARM Cortex-MX 升级后更灵活,一般位于启动文件中,MCU启动后配置完堆栈后,就会配置中断向量表。同时IVT 地址可以通过NVIC 的Vector Table Offset Register (VTOR) 配置。

 

ARM Corex-MX中断处理过程

 

事件触发
➜ 通过NVIC 的Vector Table Offset Register (VTOR) 找到中断向事表

➜ 中断向量表中相应中断处找到用户中断服务函数地址

➜ 执行用户中断服务函数

 

S32K SDK中断处理

 

S32K 基础上也遵循上述处理过程,经过SDK 程序处理和层层包裹后,过程更为复杂。
 
主要区别在以下几点:
 
  1. 中断向量表被拷贝到RAM中。
  2. 部分外设中断使能后,外设模块在初始化时默认调用INT_SYS_InstallHandler 安装中断服务函数。
  3. 用户需要在模块配置时,配置用户Callback 函数,会生成模块配置结构体参数。在默认中断服务函数中会调用系统Callback,系统Callback再调用用户Callback。
 
以下以串口中断为例:
 
事件触发
➜ VTOR
➜ VECTOR_RAM
➜ INT_SYS_InstallHandler 安装的g_lpuartIsr
➜ 调用内部包裹的 Callback
➜ 用户Callback
 

具体流程详解

 

1.  在Startup.c 中把s_vectors 指向 MCU的NVIC 的Vector Table Offset Register (VTOR)

 

 

2. 从连接文件 S32K1xx_flash.ld 文件中看到VECTOR_TABLE 的定义地址,isr_vector 由启动文件中定义

 

 

3. 在startup.c 中把Flash 中的中断向量表拷贝到  __VECTOR_RAM (在ld文件中定义在m_data)中

 

4. 在startup.c 中再通过s_vectors 把 MCU 的VTOR 指向RAM 中的断向量表



 

当MCU发生指定中断时,在VTOR 即指向的VECTOR_RAM 中查找中断地址
 

5. 中断组件中的InstallHandler 即修改 VECTOR_RAM 中中断地址指向自定义中断处理函数

 

6. 外设模块的 Callback 应用中断,在配置完成后如置配了相关Callback,就会生成包含Callback的配置结构体

 

以下以Uart为例,Uart_pal component 设置

 
配置生成文件中生成以下外设配置结构体
 
位置 Generated_Code -> lpuart1_uart.h 

 

7. 在模块的初始化函数中底层会调用 INT_SYS_InstallHandler 来把 VECTOR_RAM 中中断地址指向SDK定义的 g_lpuartIsr 中 

8. 模块的初始化函数中层层重定义 g_lpuartIsr 直到调用定义的Callback 函数

 
9. 最后出现中断 
VTOR ➜ VECTOR_RAM ➜ INT_SYS_InstallHandler 安装的g_lpuartIsr ➜ 调用内部包裹的 Callback ➜ 用户Callback
汽车电子 NXP
请使用浏览器分享功能 请点击右上角,进行分享