我是靠谱客的博主 默默老虎,最近开发中收集的这篇文章主要介绍ARM处理器异常与中断处理 学习总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天学习《ARM System Developer's Guide: Designing and Optimizing System Software》第9章 异常与中断处理,总结一下:

1. 异常处理

Q1. 异常和中断嘛关系啊?

       中断时异常的一种,中断两种:IRQ, FIQ。异常好多种呢?reset,data abort, FIQ,IRQ,prefetch abort, SWI, undefined 。ARM标准向量表中列出了以下异常:   

exception      mode     offset of vector table
  reset           SVC               +0x00
 undefined    UND               +0x04
  SWI             SVC               +0x08
prefetch abort     ABT          +0x0c
data abort           ABT         +0x10
undefined             -             +0x14
IRQ/FIQ             IRQ/FIQ     +0x18/0x1c


通常说的异常主要来自cpu内部,abort,reset等; 中断主要来自外设

Q2. 怎么进入异常?

       两种:改cpsr 和 发生相应异常。其中USER mode 和 system mode只能通过该cpsr进入相应mode。上面的表都没有这两种mode。


reset handler:主要配置cpsr寄存器(关中断),因为这时候interrupt handler还没有初始化好;设置SVC mode.

reset:
	/*
	 * set the cpu to SVC32 mode
	 */
	mrs	r0, cpsr
	bic	r0, r0, #0x3f
	orr	r0, r0, #0xd3
	msr	cpsr, r0

Q3.异常优先级

    除了简单的reset,data abort, FIQ,IRQ,prefetch abort, SWI, undefined 依次优先级下降外。

   data abort 发生在MMU或UMC指示访问了无效的存储器地址,或当前代码没有访问权限。data abort的handler里没有禁用FIQ,在data abort的异常处理程序中,可以发生FIQ,当FIQ完成后,控制权交给data abort handler.

   FIQ 中断处理时,禁 FIQ和IRQ,所以所有的外部中断都进不来。

   IRQ : 只有当没有FIQ 和data abort 的时候,IRQ才能进来,然后关IRQ中断

    prefech abort: 在流水线中,如果某指令的“执行”阶段没有更高优先级的异常出现,保持FIQ不变(注意是不变),禁止IRQ。如果FIQ enable,并且发生了FIQ,可以了在处prefech abort handler的时候得到响应。

2. 中断

1))分配中断: 系统design哪些硬件可产生哪种中断,可以通过硬件或软件实现。

2)  IRQ与FIQ异常 会使处理器硬件经过以下一个标准流程(假设中断未被屏蔽)

     a. 处理器切换到一个特定的mode,表明产生了中断;

     b. 前一个mode的cpsr保存到新mode的spsr

     c. pc被保存到新的中断mode的lr

     d. 关中断 - 更改cpsr中的IRQ 或者FIQ和IRQ都禁止。中断请求是允许还是禁止,只有在MSR指令已经完成了流水线的“执行”阶段后才确定,理解这一点很重要!在MSR指令完成前,中断仍可能发生或者被屏蔽。

     e. 处理器跳转到响应向量表的入口


IRQ mode堆栈必须在中断使能前设置好-通常是系统初始化代码中(reset),思考为什么FIQ不用呢?

r13是堆栈寄存器,要在系统初始化的时候,设置好各个异常的堆栈。

 


最后

以上就是默默老虎为你收集整理的ARM处理器异常与中断处理 学习总结的全部内容,希望文章能够帮你解决ARM处理器异常与中断处理 学习总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部