嵌入式Linux裸机开发(八)——S5PV210中断处理流程

嵌入式Linux裸机开发(八)——S5PV210中断处理流程

中断是一个过程,是CPU在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程。因硬件原因引起的中断过程的出现是不可预测的,即随机的,而软中断是事先安排的。引起中断的信号源称之为中断源。根据中断源的来源将中断分为外部中断和内部中断。中断源来自SoC内部(内部外设)的中断称为内部中断。中断源来自SoC外部,通过中断对应的GPIO引脚产生的中断称为外部中断。中断有四种状态:

Inactive(不激活):没有被激活或挂起的中断
    Pending(挂起):这个中断可以被硬件识别或是由软件产生的,正处於等待处理器处理。
    Active(激活):中断被处理器从通用中断控制器中的中断源中识别了出来,并且正在处理这个中断,且没有处理完成。
    Active and pending(激活和挂起):处理器正在处理某个中断,且通用中断控制器有一个挂起的中断。

一、S5PV210中断体系

S5PV210共有4个向量中断控制器,支持93个中断源。

主要向量中断控制寄存器:

VIC0INTENABLE:中断使能

VIC0INTENCLEAR:中断禁止

VIC0INTSELECT:中断选择,IRQ/FIQ

VIC0IRQSTATUS:IRQ中断状态寄存器

VIC0FIQSTATUS:FIQ中断状态寄存器

VIC0VECTADDR:中断源对应的ISR地址

VIC0ADDRESS:向量地址寄存器,当有中断发生时,硬件上会将当前中断的中断服务例程ISR地址从寄存器VICVECTADDR自动拷贝到寄存器VICDDR中

S5PV210在BL0阶段关闭了FIQ和IRQ,因此程序开始时需要手动打开IRQ。

// 开中断

mov r0, #0x13

msr CPSR_cxsf, r0

二、中断处理流程

S5PV210中断处理流程:

1、中断处理前的准备工作

A、初始化中断控制器

外部中断的中断控制器的初始化包括:外设相应GPIO引脚设置为外部中断模式、外部中断控制寄存器的初始化、中断向量控制寄存器的初始化。

内部中断的中断控制器的初始化包括:中断向量控制寄存器的初始化

B、绑定中断源的ISR到向量中断控制器的VICnVECTADDR

C、使能中断源中断

2、中断处理流程

A、异常向量表跳转到IRQ入口

CPU处理常规任务时收到中断的通知,于是S5PV210根据iROM固化代码跳转到iRAM的异常向量表的IRQ异常向量地址。一般将负责保护现场、处理中断、恢复现场的汇编代码段的起始地址赋值给IRQ异常向量地址,作为处理中断的入口。

B、保护中断现场

处理中断之前先要保护现场,主要工作是:设置IRQ模式下的栈,将R0-R12,LR压栈保存(由于流水线的原因,LR一般为当前执行的指令地址加8,LR减去4就是下一条要运行指令的地址)。

C、执行中断处理程序

查看VICnADDR寄存器是否有ISR函数地址,如果有,执行ISR。一般在中断发生之前已经绑定好ISR到VICnVECTADDR。

D、恢复现场

执行ISR后,将栈中的R0-R12,LR分别出栈R0-R12,PC,程序将根据PC的值自动跳转会到常规任务执行。

中断处理的一般模型如下:

#define IRQ_STACK (0xD0037F80)

.global irq_exception

irq_exception:

//设置IRQ模式下的栈

ldr sp,=IRQ_STACK

//保护现场

//保存LR

sub lr,lr,#4

//保存R0~R12

stmfd sp!,{r0-r12,lr}

bl irq_handler//中断处理程序

//恢复现场

ldmfd sp!,{r0-r12,pc}^

三、中断处理程序与中断服务例程ISR

中断处理程序和中断服务例程ISR是两个非常容易混淆的概念,但两者是两个不同的概念。内核中的中断处理程序与中断服务例程的关系如下图:

每一个触发中断的中断源对应一个中断处理程序,每一个中断处理程序对应多个中断服务例程。对中断服务例程进行注册后中断服务例程就会挂在中断请求队列中。中断处理程序是中断向量的处理程序,如果多个设备共享一个中断源,中断处理程序必须要调用每个设备的中断服务例程ISR。

在裸机中,由于每个中断源(终端编号)只有一个对应的中断向量地址寄存器VICVECTADDR,所以每一个中断处理程序只有一个中断服务例程。

四、用外部中断处理按键

中断处理的编程模型:

1、查看电路原理图,找到对应外部中断源按键的GPIO

A、查阅底板电路图按键相关部分:

Smart210开发板共有四个用户按键,对应引脚为XEINT16——XEINT19

B、查阅核心板电路原理图按键相关部分:

按键引脚XEINT16——XEINT19对应的GPIO引脚为GPH2_0——GPH2_3

#define GPH2CON ( *((volatile unsigned long *)0xE0200C40) )

//设置K1--K4按键的GPIO引脚为外部中断模式

GPH2CON |= 0xFFFF<<0;

2、查阅文档,设置外部中断控制寄存器

S5PV210的外部中断通过外部中断对应的GPIO产生,外部中断寄存器位于文档中GPIO部分。

外部中断的主要寄存器:

EXT_INT_N_CON:设置外部中断的触发方式

EXT_INT_N_PEND:中断挂起寄存器,32位,每位对应一个外部中断源,

EXT_INT_N_MASK:中断掩码控制寄存器

四个用户按键的外部中断号为EXT_INT16——EXT_INT19,选择第二组外部中断控制寄存器。

//中断触发模式

// 低电平触发

//EXT_INT_2_CON &= ~(0xFFFF);

//下降沿触发

//EXT_INT_2_CON |= (0x2<<0 | 0x2<<4 | 0x2<<8 | 0x2<<12);

//双边沿触发

EXT_INT_2_CON |= (0x4<<0 | 0x4<<4 | 0x4<<8 | 0x4<<12);

//打开外部中断

EXT_INT_2_MASK &= ~(0xF<<0);

//清除挂起,清除时需要写1

EXT_INT_2_PEND |= 0xF<<0;

3、设置向量中断控制寄存器

// 禁止所有中断

VIC0INTENCLEAR = 0xffffffff;

VIC1INTENCLEAR = 0xffffffff;

VIC2INTENCLEAR = 0xffffffff;

VIC3INTENCLEAR = 0xffffffff;

// 选择中断类型为IRQ

VIC0INTSELECT = 0x0;

VIC1INTSELECT = 0x0;

VIC2INTSELECT = 0x0;

VIC3INTSELECT = 0x0;

// 清VICxADDR

// VICxADDR:当前正在处理的中断的中断处理函数的地址

VIC0ADDR = 0;

VIC1ADDR = 0;

VIC2ADDR = 0;

VIC3ADDR = 0;

设置好GPIO外部中断模式、外部中断控制寄存器、向量中断控制寄存器后,外部中断就能到达CPU内部了。对于内部中断来说,无需设置GPIO、外部中断控制器,只需要设置向量中断控制寄存器,中断就能到达CPU。

4、CPU处理中断

CPU收到中断通知后就可以按照中断处理流程处理中断了。

工程源代码见附件,工程编译后在Smart210正常烧录运行。

开机串口打印数字,按下K1-K4按键时打印信息。

参考博文:

三星S5PV210(ARM-Cortex A8)中断过程图解(CSDN Im刘北席

中断处理程序&中断服务例程(chinaunix Helianthus_lu

时间: 2024-10-10 18:39:57

嵌入式Linux裸机开发(八)——S5PV210中断处理流程的相关文章

嵌入式Linux裸机开发(六)——S5PV210时钟系统

嵌入式Linux裸机开发(六)--S5PV210时钟系统 一.时钟系统简介 外设工作需要一定频率的时钟,这些时钟都由系统时钟提供.系统时钟一般由外部低频24MHZ晶体振荡器通过锁相环电路PLL倍频产生.通过外部的低频晶体振荡器产生系统时钟不仅可以减少干扰还可以降低成本.外设的工作频率越高,功耗越高,越不稳定.通过关闭外设的时钟可以关闭外设. 二.时钟域 S5PV210 中包含 3 大类时钟 domain, 分别是主系统时钟 domain (简称 MSYS).显示相关的时钟 domain (DSY

嵌入式Linux裸机开发(九)——S5PV210定时器

嵌入式Linux裸机开发(九)--S5PV210定时器 S5PV210内部一共有四类定时器. 一.PWM定时器 1.PWM定时简介 S5PV210内部共有5个32bit的PWM定时器.PWM定时器可以生成内部中断.PWM定时器0.1.2.3具有PWM功能,可以驱动外部I/O信号.PWM定时器4是一个无外部引脚的内部定时器.PWM 定时器使用 PCLK_PSYS 作为时钟源. 每个定时器有一个由定时器时钟驱动的32位递减计数器.递减计数器的初始值是由TCNTBn自动装载而获得的.如果递减计数器减到

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

嵌入式Linux裸机开发(五)——SDRAM初始化

嵌入式Linux裸机开发(五)--SDRAM初始化 一.SDRAM初始化流程 S5PV210有两个独立的DRAM控制器,一个最大支持512MB,一个最大支持1024MB,但两个控制器必须支持相同类型的内存. 根据三星S5PV210文档可知,DDR2类型内存的初始化流程如下: 1.提供稳压电源给内存控制器和内存芯片,内存控制器必须保持CLE在低电平,此时就会提供稳压电源.注:当CKE引脚为低电平时,XDDR2SEL应该处于高电平 2.根据时钟频率正确配置PhyControl0.ctrl_start

嵌入式Linux裸机开发(十一)——Nandflash

嵌入式Linux裸机开发(十一)--Nandflash 一.Nand Flash简介 NandFlash是Flash的一种,具有容量较大,改写速度快等优点,适用于大量数据的存储.NandFlash没有专门的地址线,发送指令.地址和数据都通过8/16位宽的总线(I/O接口)到内部的寄存器. NandFlash分为SLC和MLC两类.SLC全称为Single-Level Cell,单层单元闪存,MLC全称为Multi-Level Cell,多层单元闪存.SLC每一个单元储存一位数据,而MLC通过使用

嵌入式Linux裸机开发(十)——SD卡启动

嵌入式Linux裸机开发(十)--SD卡启动 存储设备分类: 磁存储设备:软盘.硬盘.光盘.CD.磁带 Flash:NandFlash.NorFlash 缺点:时序复杂,无坏块处理机制,接口不统一 NandFlash:MLC(可靠性差,容量大).SLC(可靠性高.容量小) 扩展卡式Flash:SD卡.MMC卡.MicroSD(TF卡) 内部为NnadFlash存储颗粒,外部封装了接口,接口标准统一.通用. 缺点:频繁使用导致卡槽接触不可靠 iNand.MoviNand.eSSD: 内部为Nand

嵌入式Linux裸机开发(一)——点亮Led

嵌入式Linux裸机开发(一)--点亮Led 开发板:友善之臂smart210 一.电路图查阅 1.底板电路图 查阅开发板底板电路图,查阅LED相关部分 LED电路工作原理: LED的正极接3.3V,负极接地时导通,LED发光. 开发板共有四颗LED,正极接3.3V,负极接开发板的LED1_LED4引脚,如果LED要点亮则需要输入低电平. 2.核心板电路图 查阅核心板电路图可知,LED1-LED4接在SoC的GPJ2_0-GPJ2_3,通过控制GPJ2_0-GPJ2_3的寄存器使对应GPIO引脚

嵌入式Linux裸机开发(十四)——ADC

嵌入式Linux裸机开发(十四)--ADC 一.AD转换简介 AD转换就是模数转换,就是把模拟信号转换成数字信号.A/D转换器是用来通过一定的电路将模拟量转变为数字量.模拟量可以是电压.电流等电信号,也可以是压力.温度.湿度.位移.声音等非电信号.在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号.A/D转换后,输出的数字信号可以有8位.10位.12位.14位和16位等. 二.ADC控制器 ADC控制器时钟: 时钟源为PCLK_PSYS,经过一次分频后得到AD

嵌入式Linux裸机开发(四)——重定位relocate

嵌入式Linux裸机开发(四)--重定位relocate 一.位置有关编码 汇编源文件被编译成二进制可执行程序时编码方式可能与内存地址有关,也可能与内存地址无关.与内存地址有关的为位置有关编码,与内存地址无关的为位置无关编码. 程序在设计时需要规划一个程序运行时的地址(链接地址),编译连接器在链接时必须指定这个链接地址,得到的二进制程序的程序理论规划的运行时地址和编译连接器指定的链接地址才相同,程序才能正常运行.位置无关编码程序则无需设计程序时规划运行时地址,编译链接器链接时同样无需指定链接地址