s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

发布者:数字奇迹最新更新时间:2023-08-09 来源: elecfans关键字:s3c2440  裸机  异常中断 手机看文章 扫描二维码
随时随地手机看文章

1.异常中断概述

在arm架构的处理器中,cpu有7中工作模式,2中工作状态。


1.CPU模式(Mode):

7种Mode: 除了usr/sys,其他5种都是异常模式。我们知道中断属于异常的2中,中断有irq,fiq。

usrsysundefined(und)Supervisor(svc)Abort(abt)irqfiq
用户模式系统模式未定义指令异常模svc管理模式终止模式(1.指令预取终止(读写某条错误的指令导致终止运行);2.数据访问终止(读写某个非法地址程序终止))irq中断快中断

除了usr模式,其他6中为特权模式。 CPU无法从usr模式直接进入特权模式。不能直接进入特权模式,那么怎么进入特权模式呢?


可以通过设置CPSR(后面会讲)进入其他模式。


2种工作State:

ARM state

Thumb state(几乎用不上)

3.寄存器:

(1)通用寄存器:

(2)备份寄存器(banked register):

CPSR:当前程序状态寄存器(Current Program Status Register) 反映程序处在那种状态

SPSR:CPSR的备份寄存器 (Saved Program Status Register)  用来保存"被中断前的CPSR"

下图是我们arm状态下的通用寄存器和程序状态寄存器

R13是SP(栈指针)


R14是LR(link register),程序跳转或者发成异常时的返回地址


R15是PC(程序计数器)


假设cpu执行:


mov R0, R8

mov R0,R8_fiq

在usr/System 模式下访问的R8, 但是在FIQ模式下,访问R8是访问FIQ模式专属的R8寄存器,不是同一个物理上的寄存器。

在5种异常模式中每个模式都有自己专属的R13 R14寄存器,R13用作SP(栈), R14(LR)是用来保存发生异常时的指令地址。


为什么快中断(FIQ)有那么多专属寄存器?

这些寄存器称为备份寄存器,我们先看下中断处理流程:


1 保存现场(保存被中断模式的寄存器)---(比如程序正在sys/usr模式下运行,当发生中断时,需要把R0-R14这些寄存器全部保存下来)

2 异常处理(去分辨是哪一个中断源产生了中断,去执行对应的中断服务程序)

3 恢复现场(恢复被中断时保存下来的寄存器R0-R14)

但如果是快中断,那么我就不需要保存系统/用户模式下的R8 ~ R12这几个寄存器,因为在FIQ模式下有自己专属的R8 ~ R12寄存器,省略保存寄存器的时间,加快处理速度,所以它才称得上快中断。


PSR程序状态寄存器:

在异常中断中PSR寄存器会使用的很频繁,PSR寄存器的格式如下图:

我们再来看看下表,反映的是PSR的 M[4:0]与arm工作模式的关系:

我们可以按照上图的对应关系设置CPSR,让其进入与之对应的模式。


4.异常向量表:

异常向量:不同的异常有不同的入口函数,那么这个异常入口函数的地址就是存放在该异常向量的位置。从该异常向量读取到的数据就是异常入口函数的地址。


异常向量表就是由异常向量组成的集合。


下图是我从uboot源代码中截取的smdk2410 的异常向量表:(2440异常向量表也是这个)


.globl _start

_start: b       reset

ldr pc, _undefined_instruction

ldr pc, _software_interrupt

ldr pc, _prefetch_abort

ldr pc, _data_abort

ldr pc, _not_used

ldr pc, _irq

ldr pc, _fiq

异常向量表对应的地址如下图:

2.异常处理流程

CPU是如何进入到中断模式,执行中断服务程序的?


1.中断前:

下图是中断未触发前的程序执行过程:

那么如何初始化中断?


1,设置中断源(使中断能够产生,让CPU知道是哪个中断)

2,设置中断控制器(设置中断屏蔽,中断优先级)

3,设置中断总开关CPSR (使能中断)

2.中断产生后:

举个栗子:按键按下,产生按键irq。


硬件上的处理流程:


cpu强制跳转到异常向量表上对应的_irq异常向量(0x18)去读取指令(这个是CPU强制执行的,不需要我们去控制)。


具体的进入中断向量和中断返回流程见下图:

进入:

(1) LR_异常=PC + offset(具体多少看下图)

(2)SPSR_异常=被中断前的程序模式CPSR

(3) CPSR被设置成对应的异常模式

(4)跳转到对应的异常向量去执行


退出(返回):进入和退出就是一个逆过程

(1)PC= LR_异常 -offset

(2)被中断前的程序模式CPSR = SPSR_异常

(3)中断结束,清中断

进入异常和返回异常时pc和lr的关系如下图:

从图中我们发现进入不同异常,offset的值也是有差异的。


软件上的处理流程:


1.当跳转到irq异常向量(0x18)后,发现该处是一条跳转指令“ldr pc, _irq”,

那么会通过ldr绝对跳转指令跳到到真正的中断处理函数_irq去执行。

2.那么在_irq的函数中我们需要按照之前说的**中断处理流程**去执行:

(1)保存现场

(2)异常处理(去分辨是哪一个中断源产生了中断,去执行对应的中断服务程序)

(3)恢复现场

下面用流程图总结下中断产生后的详细处理过程:

关键字:s3c2440  裸机  异常中断 引用地址:s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

上一篇:s3c2440裸机-异常中断(二. und未定义指令异常)
下一篇:s3c2440裸机-代码重定位、清bss的优化和位置无关码

推荐阅读最新更新时间:2024-10-20 06:47

s3c2440裸机-异常中断1-异常中断的原理与流程
1.异常中断概述 在arm架构的处理器中,cpu有7中工作模式,2中工作状态。 1.CPU模式(Mode): 7种Mode: 除了usr/sys,其他5种都是异常模式。我们知道中断属于异常的2中,中断有irq,fiq。 usr sys undefined(und) Supervisor(svc) Abort(abt) irq fiq 用户模式 系统模式 未定义指令异常模 svc管理模式 终止模式(1.指令预取终止(读写某条错误的指令导致终止运行);2.数据访问终止(读写某个非法地址程序终止)) irq中断 快中断 除了usr模式,其他6中为特权模式。 CPU无法从usr模式直接进入特权模式。不能直接进入特权模式,那么怎
[单片机]
s3c2440裸机-异常中断2-und未定义指令异常
1._und(未定义指令异常)介绍 我们之前分析过5种异常,那么如何进入未定义指令异常,当然是cpu读取指令发生异常,出现了指令解析异常。 我们先来看下当cpu解析到什么样的指令才会触发未定义指令异常呢? 从上面的arm指令格式中可知,只要指令码属于划线的格式,就属于未定义指令异常。 2.汇编向c函数传参 我们知道汇编给C语言函数传参是通过r0,r1,...通过堆栈的方式去传递的参数,比如r0=1, r1=2;那么在被调用的c函数中argv0就是r0, argv1就是r1...,那么我们如果通过汇编给C函数传递字符串呢? 我们可以通过这样声明und_string为一个字符串: und_string: .stri
[单片机]
s3c2440裸机-异常中断3-swi软中断
swi(软中断) 我们知道arm有7中工作模式,除了usr模式,其他6种都是特权模式。我们知道usr模式无法修改CPSR直接进入其他特权模式,但linux应用程序一般运行在usr模式,既然usr模式权限非常低,是无法直接访问硬件寄存器的,那么它是如何访问硬件的呢? linux应用程序是通过系统调用,从而进入内核态,运行驱动程序来访问的硬件,那么系统调用又是如何实现的呢,就是通过软中断swi指令来进入svc模式,进入到svc模式后当然就能访问硬件啦。 所以我们的应用程序在usr模式想访问硬件,必须切换模式,怎么切换? 有以下两种方式: 1.发生异常或中断(被动的) 2.swi + 某个值(主动的) 现在介绍如何进
[单片机]
s3c2440裸机-异常中断4-irq外部中断
我们回顾下中断产生前后的处理流程:详见异常、中断的原理与流程 中断前: 中断产生后: 问题案例: 我们想实现一个按键点灯程序,我们知道有以下两种方案: 1.轮询方案:轮询检测按键的电平状态,当检测到被按下后,对应的gpio会拉低,点亮对应的led;(略) 2.中断方案:将按键配置成外部中断源,当有按键按下,触发中断,在中断服务程序(isr)中去完成点灯。下面开始写代码: 一.中断初始化 1)中断源设置 我们用按键作为外部中断源,我们把按键对应的gpio配置成中断引脚,当按键按下,相应的gpio产生了电平跳变,就会触发外部中断。 我们想达到按下按键灯亮,松开按键灯灭这种效果(配成双边沿触发,按下的时候产生下降沿
[单片机]
s3c2440裸机-异常中断5-irq定时器中断
之前讲过s3c2440时钟体系,看了时钟体系再来看定时器中断会更好的结合运用所学知识点。 S3c2440共有2种定时器: 1.Watchdog看门狗定时器 2.PWM脉冲可调制定时器 下面详细介绍2种定时器的原理,来了解定时器是如何产生定时器中断的。 1. Watchdog看门狗定时器 1)Watchdog看门狗定时器原理 Watchdog定时器的原理很简单,寄存器很少,框图如下: 1.定时器,定时器那肯定是需要用到时钟的,从框图中可以看到Watchdog定时器采用的时钟源是PCLK,从s3c2440时钟体系中也可以体现出来,接的是APB总线。 2.然后到达一个8bit的分频器,可以通过配置WTCON 来设置分频器的预设
[单片机]
s3c2440裸机-异常中断(一. 异常、中断的原理与流程)
1.异常中断概述 在arm架构的处理器中,cpu有7中工作模式,2中工作状态。 1.CPU模式(Mode): 7种Mode: 除了usr/sys,其他5种都是异常模式。我们知道中断属于异常的2中,中断有irq,fiq。 usr sys undefined(und) Supervisor(svc) Abort(abt) irq fiq 用户模式 系统模式 未定义指令异常模 svc管理模式 终止模式(1.指令预取终止(读写某条错误的指令导致终止运行);2.数据访问终止(读写某个非法地址程序终止)) irq中断 快中断 除了usr模式,其他6中为特权模式。 CPU无法从usr模式直接进入特权模式。不能直接进入特权模
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-<font color='red'>异常中断</font>(一. 异常、中断的原理与流程)
s3c2440裸机-异常中断(二. und未定义指令异常)
1._und(未定义指令异常)介绍 我们之前分析过5种异常,那么如何进入未定义指令异常,当然是cpu读取指令发生异常,出现了指令解析异常。 我们先来看下当cpu解析到什么样的指令才会触发未定义指令异常呢? 从上面的arm指令格式中可知,只要指令码属于划线的格式,就属于未定义指令异常。 2.汇编向c函数传参 我们知道汇编给C语言函数传参是通过r0,r1,...通过堆栈的方式去传递的参数,比如r0=1, r1=2;那么在被调用的c函数中argv0就是r0, argv1就是r1...,那么我们如果通过汇编给C函数传递字符串呢? 我们可以通过这样声明und_string为一个字符串: und_string: .string unde
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-<font color='red'>异常中断</font>(二. und未定义指令异常)
s3c2440裸机-异常中断(三. swi软中断)
#swi(软中断) 我们知道arm有7中工作模式,除了usr模式,其他6种都是特权模式。我们知道usr模式无法修改CPSR直接进入其他特权模式,但linux应用程序一般运行在usr模式,既然usr模式权限非常低,是无法直接访问硬件寄存器的,那么它是如何访问硬件的呢? linux应用程序是通过系统调用,从而进入内核态,运行驱动程序来访问的硬件,那么系统调用又是如何实现的呢,就是通过软中断swi指令来进入svc模式,进入到svc模式后当然就能访问硬件啦。 所以我们的应用程序在usr模式想访问硬件,必须切换模式,怎么切换? 有以下两种方式: 1.发生异常或中断(被动的) 2.swi + 某个值(主动的) 现在介绍如何进入软中断s
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-<font color='red'>异常中断</font>(三. swi软中断)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved