AUTOSAR 中断处理说明

来源:汽车电子与软件
2024-01-24
1725

中断处理机制详解



基本概念



中断

中断是一种可以异步打断 CPU 正常指令执行流程的机制。当外部事件发生时,CPU 会暂停当前正在运行的任务,转而去执行与该事件相关的另一个任务。中断处理完成后,CPU 会回到先前的执行流程,恢复被中断的任务。

中断处理程序

中断发生后需要执行的代码称为中断处理程序或中断服务程序(ISR)。中断处理程序通常非常短小,主要完成对中断的确认和对相关事件的快速响应。中断服务程序结束后,CPU 会切换回中断前执行的任务。

中断向量表

中断向量表是一个数组结构,包含了每个中断对应的中断服务程序的入口地址。当中断发生时,CPU 根据中断号在向量表中查找到对应的中断服务程序地址,然后跳转到该地址开始执行中断服务程序。

中断优先级

当多个中断源同时请求中断时,中断控制器需要根据中断的优先级来仲裁,优先级高的中断可以打断优先级低的中断。

中断类别

AUTOSAR 把中断分为两类:
Cat1:类别 1 中断,不依赖 OS 的支持,latency 低,只能调用有限的 OS 函数。
Cat2:类别 2 中断,可以利用 OS 提供的中断服务框架,latency 略高,可以调用 OS 的大多数函数。


中断处理概述



AUTOSAR 中的中断处理分为 Cat1 和 Cat2 两种类别,两者在交互方式、latency、OS 支持程度等方面有较大区别:

属性Cat1Cat2
与 OS 的交互不允许访问 OS 的数据结构,只能调用有限的 OS 函数来使能/禁用中断可以调用 OS 的大多数函数
Latency很低略高
OS 支持程度不支持,中断处理程序的移植需要设备驱动自己实现OS 提供可移植的中断服务框架
配置OS 配置包含 Cat1 中断的相关信息,但不一定使用这些信息OS 使用这些配置信息来生成中断向量表和中断处理程序框
中断逻辑控制依赖目标平台由 OS 统一控制
与其他任务的通信通过禁用所有中断实现互斥访使用 OS 的资源管理功能实现互斥访问



当外部设备发起一个中断请求时,整个中断处理流程如下:

1) 外部设备发送中断请求信号
2) CPU 根据优先级判断是否可以接受中断请求
3) CPU 保存当前中断的现场环境
4) 根据中断向量表跳转到对应中断的中断服务程序
5) 执行中断服务程序的用户代码
6) 返回中断,恢复之前保存的执行环境
7) 恢复之前被中断的任务继续执行

对于 Cat1 和 Cat2 中断,中断服务程序的执行和中断返回处理有较大不同。


Cat1 中断处理流程



初始化配置

使用 Cat1 中断需完成以下初始化配置:

- 在中断向量表中设置中断处理程序的入口地址
- 正确定义中断处理程序,编译器可能需要特殊支持
- 配置中断控制器可以产生该中断
- 设备驱动配置中断触发条件

中断处理

当外部设备发起 Cat1 中断请求时,处理流程如下:

1.png


1) 外部设备发送中断请求
2) CPU 判断中断优先级,可能需要等待
3) CPU 允许中断请求打断当前执行流程
4) CPU 自动保存中断现场
5) 根据中断向量表,跳转到中断处理程序入口执行
6) 执行中断处理程序的用户代码
7) 禁用外部设备的中断,防止立即重入
8) 设置中断控制器重新使能该中断
9) 恢复寄存器状态
10) 通过返回指令退出中断
11) 恢复之前中断的任务环境

互斥访问

如果中断处理程序要访问与其他任务共享的资源,需要使用临界区实现互斥访问。

对于优先级较低的任务,需要在访问共享资源前后添加 Suspend/Resume All Interrupts 调用,在临界区内禁用所有中断。

对于与中断优先级相同或更高的任务,需要在中断处理程序内部添加 Suspend/Resume All Interrupts 调用来保护共享资源。


Cat2 中断处理流程



初始化配置

Cat2 中断使用前需要完成以下配置:

- 在中断向量表中将中断入口设置为指向 OS
- 使用 ISR 宏正确定义中断服务程序
- OS 负责配置中断控制器
- 设备驱动负责配置中断触发条件

中断处理

当设备发起 Cat2 中断请求时,处理流程如下:

1) 设备发起中断请求
2) CPU 判断中断优先级
3) CPU 允许中断发生
4) CPU 自动保存现场
5) 根据向量表跳转到 OS 中断入口
6) OS 保存 Context 和寄存器状态
7) 调用中断处理程序的用户代码
8) 禁用设备中断
9) 返回 OS,检查是否需要任务调度
10) 恢复中断控制器状态
11) 恢复保存的寄存器状态
12) 执行中断返回指令
13) 恢复被中断任务的执行状态

2.png


中断配置



设备驱动级配置

- Cat2 中断使用 ISR 宏定义处理程序
- Cat1 中断需要平台相关代码支持
- 设备驱动负责编写中断处理用户代码
- 中断处理程序需要放在驱动同一位置

OS 层配置

- OS 需要配置每个中断的向量号、优先级、名称、类别等信息
- BSW 调度器负责向 OS 配置需要的资源

BSW 调度器层配置

1. BSW 主函数的 TASK
- BSW 调度器生成调用各 BSW 主函数的 TASK
- 需要知道各 BSW 模块的主函数名及调用顺序

2. 堆栈中的其他 TASK
- 除主函数,BSW 模块还可能被 RTE 的 TASK 调用
- 这些 TASK 也需要加入访问资源列表

3. 临界区处理
- Cat1 中断通过全局禁用中断实现互斥
- Cat2 中断可通过资源或禁用中断实现互斥  
- BSW 调度器决定使用哪种互斥方式
- 需要收集所有访问临界区的 TASK 和 ISR 信息
- 仅禁用中断方式需较少信息,但可能优先级反转


Cat1 中断使用建议



1. 应优先考虑使用 Cat2 中断
2. 仅在以下情况使用 Cat1 中断:

    • Cat2 中断 OS 开销过大
    •  对延迟非常敏感的场景
    •  需要很低的抖动要求

3. 应尽早在上层解耦 Cat1 中断
4. 相邻模块使用 Cat1 中断通信时,应通过 BSW 调度器的 Disable/Enable All Interrupts 调用来保护临界区
5. 使用 Cat1 中断的代码必须是可信的


中断处理的注意事项



中断处理程序设计注意事项

1. 中断处理程序要短小精悍,主要用于 acknowledge 中断和响应事件
2. 中断处理结束要禁用外部设备的中断,防止立即重入
3. 中断处理程序要考虑与其他任务的互斥访问问题
4. 对共享资源的访问要加锁,使用 OS 提供的互斥机制

中断类别选择注意事项  

1. 默认优先考虑使用 Cat2 中断
2. 只有在 OS 开销过大或对延迟敏感时才使用 Cat1 中断
3. Cat1 中断要尽早在上层模块解耦
4. 相邻模块间使用 Cat1 中断通信时需加锁保护临界区

中断配置注意事项

1. 中断向量表配置要与中断处理程序一致
2. 中断优先级不能违反硬件设计的约束
3. OS 要配置每个中断的类别、优先级、入口等信息
4. BSW 调度器要负责配置 OS 的互斥资源
5. 访问同一临界区的所有任务和中断要配置到同一个资源

Cat1 中断注意事项

1. Cat1 中断无法做运行时间检查,必须可信
2. Cat1 中断调用的 OS 服务非常有限
3. Cat1 中断禁用中断会影响所有 ISR 和任务
4. 使用 Cat1 中断会增加处理互斥访问的复杂度

性能优化注意事项

1. Cat2 中断相对于 Cat1 中断有更高的延迟
2. 频繁的中断会增加 OS 的开销
3. 只禁用中断实现互斥访问会延长高优先级任务的阻塞时间


收藏
点赞
2000