📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载注明出处
文章目录
-
-
- [1. 系统异常(System Exceptions)](#1. 系统异常(System Exceptions))
-
- [1.1 复位(Reset)](#1.1 复位(Reset))
- [1.2 不可屏蔽中断(NMI,Non - Maskable Interrupt)](#1.2 不可屏蔽中断(NMI,Non - Maskable Interrupt))
- [1.3 硬件错误(HardFault)](#1.3 硬件错误(HardFault))
- [1.4 存储器管理错误(Memory Management Fault)](#1.4 存储器管理错误(Memory Management Fault))
- [1.5 总线错误(BusFault)](#1.5 总线错误(BusFault))
- [1.6 使用错误(UsageFault)](#1.6 使用错误(UsageFault))
- [2. 中断控制器相关中断](#2. 中断控制器相关中断)
-
- [2.1 SysTick定时器中断](#2.1 SysTick定时器中断)
- [2.2 PendSV(可挂起的系统服务)](#2.2 PendSV(可挂起的系统服务))
- [2.3 SVC(系统服务调用)](#2.3 SVC(系统服务调用))
- [3. 代码](#3. 代码)
- [4. 总结](#4. 总结)
-
ARM内核自带了多个中断,不同的ARM内核版本(如Cortex - M0、Cortex - M3、Cortex - M4等)可能会在中断数量和类型上有所差异,但一些常见的中断类型基本是相似的。下面以Cortex - M系列内核为例,介绍一些ARM内核自带的重要中断:
1. 系统异常(System Exceptions)
1.1 复位(Reset)
- 描述:复位异常是系统上电或者按下复位按钮后触发的第一个异常。当发生复位时,处理器会停止当前正在执行的任务,将所有寄存器和系统状态恢复到初始值,然后从复位向量处开始执行程序,通常是启动代码的入口点。
- 优先级:最高优先级,不可屏蔽。
1.2 不可屏蔽中断(NMI,Non - Maskable Interrupt)
- 描述:NMI是一种具有最高优先级的中断,用于处理一些非常紧急且不能被其他中断或异常所屏蔽的事件,例如硬件故障、电源故障等。一旦触发NMI,处理器会立即停止当前正在执行的任务,转去执行NMI的中断服务程序。
- 优先级:固定为最高优先级,不可屏蔽。
1.3 硬件错误(HardFault)
- 描述:当处理器遇到无法处理的硬件错误时,会触发HardFault异常。这些错误可能包括非法指令、内存访问错误(如访问未映射的内存地址)、总线错误等。HardFault异常处理程序通常需要进行错误诊断和恢复操作,以确保系统的稳定性。
- 优先级:较高优先级,通常在系统异常中仅次于NMI。
1.4 存储器管理错误(Memory Management Fault)
- 描述:该异常在访问内存违反了存储器管理单元(MMU)或者内存保护单元(MPU)的规则时触发,例如访问了受保护的内存区域、执行了未授权的内存操作等。通过处理该异常,可以及时发现和处理内存访问错误,提高系统的安全性。
- 优先级:可配置。
1.5 总线错误(BusFault)
- 描述:当处理器在访问总线(如内存总线、外设总线)时发生错误,如总线传输超时、总线冲突等,会触发BusFault异常。该异常处理程序可以对总线错误进行诊断和处理,确保系统的正常通信。
- 优先级:可配置。
1.6 使用错误(UsageFault)
- 描述:UsageFault异常在处理器遇到一些使用错误时触发,例如未定义的指令、协处理器访问错误、除零错误等。通过处理该异常,可以捕获程序中的一些逻辑错误,提高程序的健壮性。
- 优先级:可配置。
2. 中断控制器相关中断
2.1 SysTick定时器中断
- 描述:SysTick是一个24位的递减定时器,它是Cortex - M内核自带的一个系统定时器。SysTick定时器可以用于实现系统的定时功能,例如操作系统的任务调度、延时函数等。当SysTick定时器计数到0时,会触发SysTick中断。
- 优先级:可配置。
2.2 PendSV(可挂起的系统服务)
- 描述:PendSV主要用于操作系统的上下文切换。在多任务操作系统中,当需要进行任务切换时,可以通过设置PendSV异常挂起位来触发PendSV中断,在PendSV中断服务程序中完成任务上下文的保存和恢复操作。
- 优先级:通常配置为最低优先级,以确保其他高优先级的中断可以优先处理。
2.3 SVC(系统服务调用)
- 描述:SVC是一种软件触发的异常,用于实现用户程序与操作系统内核之间的系统调用。用户程序可以通过执行SVC指令来触发SVC异常,从而调用操作系统提供的服务,如内存分配、文件操作等。
- 优先级:可配置。
3. 代码
c
// 不可屏蔽中断(NMI)处理函数
void NMI_Handler(void)
{
// 处理紧急且不能被屏蔽的事件,如硬件故障、电源故障等
// 这里可以添加具体的错误处理代码,例如记录错误日志、触发报警等
while (1)
{
// 可以添加一些调试信息,如点亮LED表示发生NMI
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
}
}
// 硬件错误(HardFault)处理函数
void HardFault_Handler(void)
{
// 处理硬件错误,如非法指令、内存访问错误等
// 可以添加错误诊断和恢复操作,例如记录错误状态、重启系统等
while (1)
{
// 点亮另一个LED表示发生HardFault
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
}
}
// 存储器管理错误(Memory Management Fault)处理函数
void MemManage_Handler(void)
{
// 处理存储器管理错误,如访问受保护的内存区域等
// 可以添加错误处理代码,如记录错误地址、关闭相关外设等
while (1)
{
// 点亮特定LED表示发生存储器管理错误
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
}
}
// 总线错误(BusFault)处理函数
void BusFault_Handler(void)
{
// 处理总线错误,如总线传输超时、总线冲突等
// 可以添加错误诊断和恢复操作,如重新初始化总线、记录错误信息等
while (1)
{
// 点亮LED表示发生总线错误
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
}
}
// 使用错误(UsageFault)处理函数
void UsageFault_Handler(void)
{
// 处理使用错误,如未定义的指令、协处理器访问错误等
// 可以添加错误处理代码,如检查指令地址、重新初始化相关模块等
while (1)
{
// 点亮LED表示发生使用错误
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
}
// SysTick定时器中断处理函数
void SysTick_Handler(void)
{
HAL_IncTick(); // 更新系统滴答计数器
// 可以添加定时任务代码,例如每1ms执行一次的任务
// 例如:
// static uint32_t counter = 0;
// counter++;
// if (counter % 1000 == 0) {
// HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
// }
}
// PendSV(可挂起的系统服务)处理函数
// 在操作系统中用于上下文切换
// 这里只是简单示例,实际应用中会更复杂
void PendSV_Handler(void)
{
// 可以添加上下文切换代码,如保存和恢复任务上下文
// 例如:
// save_context();
// switch_to_next_task();
// restore_context();
}
// SVC(系统服务调用)处理函数
void SVC_Handler(void)
{
// 处理系统服务调用,如内存分配、文件操作等
// 可以根据不同的系统调用号执行相应的操作
// 例如:
// uint32_t svc_number = __get_MSP() + 26;
// switch (svc_number) {
// case 0:
// // 执行内存分配操作
// break;
// case 1:
// // 执行文件打开操作
// break;
// default:
// break;
// }
}
4. 总结
以下是将上述ARM内核自带中断总结成的表格:
中断名称 | 描述 | 优先级 |
---|---|---|
复位(Reset) | 系统上电或复位按钮按下后触发,使处理器恢复初始状态并从复位向量处开始执行程序 | 最高优先级,不可屏蔽 |
不可屏蔽中断(NMI) | 用于处理紧急且不能被屏蔽的事件,如硬件故障、电源故障等 | 固定为最高优先级,不可屏蔽 |
硬件错误(HardFault) | 处理器遇到无法处理的硬件错误时触发,如非法指令、内存访问错误等 | 较高优先级,仅次于NMI |
存储器管理错误(Memory Management Fault) | 访问内存违反MMU或MPU规则时触发,如访问受保护内存区域等 | 可配置 |
总线错误(BusFault) | 处理器访问总线时发生错误,如总线传输超时、冲突等 | 可配置 |
使用错误(UsageFault) | 处理器遇到使用错误时触发,如未定义指令、除零错误等 | 可配置 |
SysTick定时器中断 | SysTick定时器计数到0时触发,用于系统定时功能,如任务调度、延时函数等 | 可配置 |
PendSV(可挂起的系统服务) | 主要用于操作系统的上下文切换 | 通常配置为最低优先级 |
SVC(系统服务调用) | 用户程序通过执行SVC指令触发,用于实现与操作系统内核之间的系统调用 | 可配置 |