ARM编程四--->中断编写流程

中断的产生与捕获(ARM 处理器)

  1. 概念
    中断是一种用于响应外部或内部事件的机制,能够暂时打断当前正在执行的程序,去处理紧急事件。中断使得处理器能够优先处理重要的任务,如外设的数据读取、定时器溢出等。
  2. 中断的分类
  • FIQ(Fast Interrupt Request,快速中断):FIQ 是一种优先级较高的中断类型,用于处理时间要求严格、响应速度快的中断。它具有专用的寄存器组,避免了中断进入时的保存操作,提高了处理效率。
  • IRQ(Interrupt Request,普通中断):IRQ 是一种较为常见的中断类型,优先级低于 FIQ,通常用于一般的设备或系统事件处理。
  1. 中断的处理流程
    1. 中断的产生
      • 当外设或定时器等模块检测到中断事件时,会向中断控制器(如 GIC)发出中断请求。
      • 中断控制器处理中断信号,将中断请求传递给 CPU。
    2. 中断捕获与响应
      • 保存当前上下文:当 CPU 收到中断请求后,立即中断当前的任务执行,保存当前的上下文(包括 R0-R12 寄存器和 CPSR 状态寄存器)。
      • 跳转到中断处理程序:CPU 根据中断类型,从中断向量表中获取中断处理程序的入口地址,并跳转到中断服务例程(ISR)。
      • 中断优先级处理:如果同时存在多个中断,GIC 通过优先级机制决定先处理哪个中断。
    3. 中断处理
      • 中断处理程序执行特定任务。
        • 例如:读取外设的数据。清除中断标志位。更新计数器或内存状态等。
      • 中断服务程序可以使用寄存器 R0-R12,这些寄存器会在进入中断时保存到内存。
    4. 中断处理完成
    • 恢复上下文:当中断处理程序完成后,CPU 恢复之前保存的寄存器和程序状态寄存器(SPSR 恢复到 CPSR)。
    • 返回中断前的代码:CPU 跳回到被中断的代码继续执行。这是通过将程序计数器(PC)恢复到中断前的地址来实现的。
  2. 中断控制器(GIC)
  • 功能:ARM 系统中通常包含一个通用中断控制器(GIC,Generic Interrupt Controller),负责管理所有中断请求。它不仅扩展了中断源,还负责:
    • 中断优先级的管理:根据中断的优先级来决定哪个中断优先响应。
    • 中断屏蔽:在处理较高优先级的中断时,较低优先级的中断可能会被屏蔽。
    • 中断分发:在多核系统中,GIC 可以将中断请求分发给不同的 CPU 核。
  1. 中断的上下文切换
  • 中断处理期间,CPU 需要对上下文进行切换,这包括:
    • 保存当前的寄存器内容(R0-R12、PC、CPSR)。
    • 切换到相应的中断模式,执行中断服务程序。
    • 处理完毕后,恢复之前保存的寄存器值,继续执行被中断的任务。
  1. ARM 中断向量表
    ARM 处理器的中断向量表是一个固定地址表,通常存储在内存的开始部分。该表包含不同类型中断的入口地址
中断类型 描述 触发条件
Reset(复位) 处理器启动后的第一个地址 处理器上电或复位后触发
Undefined(未定义指令) 执行未定义指令时触发 当执行未定义的指令时
Software Interrupt(软件中断) 通过 SWI 指令触发 执行 SWI 指令时
Prefetch Abort(预取异常) 指令预取阶段发生的异常 处理器在指令预取阶段遇到异常时
Data Abort(数据异常) 数据访问阶段发生的异常 处理器在数据访问阶段遇到异常时
IRQ(普通中断) 外设或其他设备触发的普通中断 处理器的中断请求线触发
FIQ(快速中断) 优先级更高的快速中断 处理器的快速中断请求线触发

按键中断ARM编程流程

1.编写main.c
  1. 看电路图找到CPU对应的控制管脚 GPX1_1
  2. 看芯片手册,找到对应寄存器
    a. 配置管脚为interrupt模式
    b. 功能块设置
  3. 编程
    代码如下
//初始化串口通信,通过 UART 发送和接收字符
//初始化 GPIO 外部中断,配置下降沿触发的中断模式
//当发生 GPIO 中断时,处理器会跳转到中断处理程序 do_irq(),执行相应的中断处理逻辑,并通过串口发送特定字符来表示中断已处理
#define GPX1CON         (*(volatile unsigned int *)0x11000C20)  // GPX1组管脚控制寄存器
#define EXT_INT41CON    (*(volatile unsigned int *)0x11000E04)  // 外部中断41组配置寄存器,配置中断触发方式
#define EXT_INT41_MASK  (*(volatile unsigned int *)0x11000F04)  // 外部中断41组掩码寄存器,控制中断使能
#define ICDISER1_CPU0   (*(volatile unsigned int *)0x10490104)  // GIC中断使能寄存器1,启用中断号对应的中断源
#define ICDDCR          (*(volatile  int *)0x10490000)          // GIC分发控制寄存器,使能中断分发
#define ICCICR_CPU0     (*(volatile  int *)0x10480000)          // CPU接口控制寄存器,启用CPU0中断处理
#define ICCPMR_CPU0     (*(volatile  int *)0x10480004)          // CPU接口优先级掩码寄存器,设置中断优先级门槛
#define 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值