s5pv210中断体系结构分析

Zackary.Liu Zackary.Liu     2022-10-12     381

关键词:

我们按照Tiny210官方的裸板程序来梳理S5PV210的中断体系。

关于 S5PV210 的中断体系结构

S5PV210 的中断控制器是由 4 个向量中断控制器(VIC)、 ARM PrimeCell PL192 和 4 个
TrustZone Interrupt Controller (TZIC)共同组成。
S5PV210 共支持 93 个中断源(具体见官方手册)。

首先看 Start.S

.global _start
.global IRQ_handle

_start:
	@ 关闭看门狗
	ldr	r0, =0xE2700000			
	mov	r1, #0
	str	r1, [r0]

	@ 设置栈,以便调用c函数
	ldr	sp, =0x40000000		

	@ 开中断
	mov r0, #0x53			
	msr CPSR_cxsf, r0	

	@ 汇编初始化时钟		
	bl clock_init	

	@ 调用main函数
	bl main	

IRQ_handle:

	@ 设置中断模式的栈
	ldr sp, =0xD0037F80
	
	@ 保存现场
	sub lr, lr, #4				
	stmfd sp!, {r0-r12, lr}
	
	@ 跳转到中断处理函数
	bl	irq_handler		
	
	@ 恢复现场
	ldmfd sp!, {r0-r12, pc}^

设置 CPSR = #0x53,进入SVC模式,开IRQ中断。

接着在main函数中会调用 system_initexception 函数:

void system_initexception( void)
{
    // 设置中断向量表
    pExceptionUNDEF	  =	(unsigned long)exceptionundef;
    pExceptionSWI  	  =	(unsigned long)exceptionswi;
    pExceptionPABORT  =	(unsigned long)exceptionpabort;
    pExceptionDABORT  =	(unsigned long)exceptiondabort;
    pExceptionIRQ	  =	(unsigned long)IRQ_handle;
    pExceptionFIQ	  =	(unsigned long)IRQ_handle;

    // 初始化中断控制器
    intc_init();
}

void intc_init(void)
{
    // 禁止所有中断
    VIC0INTENCLEAR = 0xffffffff;
    VIC1INTENCLEAR = 0xffffffff;
    VIC2INTENCLEAR = 0xffffffff;
    VIC3INTENCLEAR = 0xffffffff;

    // 选择中断类型为IRQ
    VIC0INTSELECT = 0x0;
    VIC1INTSELECT = 0x0;
    VIC2INTSELECT = 0x0;
    VIC3INTSELECT = 0x0;

    // 清VICxADDR
    VIC0ADDR = 0;
    VIC1ADDR = 0;
    VIC2ADDR = 0;
    VIC3ADDR = 0;
}

然后设置 VICINTENABLE 使能中断。

我们只关心这条就可以:

pExceptionIRQ	  =	(unsigned long)IRQ_handle;

头文件中这样定义:

#define    _Exception_Vector	0xD0037400
#define    pExceptionIRQ		( *((volatile unsigned long *)(_Exception_Vector + 0x18)) )
而S5PV210 的异常向量表的起始地址是0xD0037400,原因见下图:

这样,在发生IRQ中断时,PC就会跳转到 pExceptionIRQ 地址处,从而执行了 IRQ_handle 函数,接着又执行了 irq_handler 函数。

void irq_handler(void)
{
    unsigned long vicaddr[4] = {VIC0ADDR,VIC1ADDR,VIC2ADDR,VIC3ADDR};
    int i=0;
    void (*isr)(void) = NULL;

    for(; i<4; i++)
    {
        if(intc_getvicirqstatus(i) != 0)
        {
            isr = (void (*)(void)) vicaddr[i];
            break;
        }
    }
    (*isr)();
}

通过调用 intc_getvicirqstatus 函数返回 VICIRQSTATUS 的值就知道当前VIC中是否有中断请求,有的话就会将isr赋值为 VICADDR 的值,即(服务函数的地址),然后调用服务程序。

有一点需要说明:

当有中断发生时,硬件上会将当前中断的中断处理函数从寄存器 VICVECTADDR 自动拷贝到寄存器
VICADDR 中, 所以我们在 irq_handler()函数里会调用保存在寄存器 VICADDR 里的中断处理函数。假如我们要开启 EXINT0 中断,那么我们只需将中断服务程序的地址赋值给 VIC0VECTADDR0 即可。

s5pv210串口实验(中断方式)

结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验。start.S.global_start.globalIRQ_handle_start:/*关WatchDog*/ldrr0,=0xE2700000movr1,#0strr1,[r0]/*设置系统模式栈指针*/ldrsp,=0x40000000/*开IRQ总中断开关*/movr0,#0x53msrCPS... 查看详情

s5pv210中断体系

一、什么是中断?1、中断的发明是用来解决宏观上的并行需要的。宏观就是从整体上来看,并行就是多件事情都完成了。2、微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的。宏... 查看详情

s5pv210——中断

1:s5pv210的中断步骤(1):建立异常向量表;(2):写入中断处理函数;(3):中断初始化;(4):建立中断号与中断处理函数的联系,使能中断;当中断发生时,中断处理函数会自动处理中断;流程如下: 2:建立异常向量表:s5pv21... 查看详情

s5pv210的中断处理机制详解

1、ARM的中断机制介绍参考博客:《ARM架构的中断机制详解(S5PV210芯片)》;2、S5PV210芯片的中断处理过程2.1、中断处理第一阶段S5PV210芯片的中断处理第一阶段就是异常向量表的跳转,并没有任何特别,看上面的参考... 查看详情

s5pv210的中断处理机制详解

1、ARM的中断机制介绍参考博客:《ARM架构的中断机制详解(S5PV210芯片)》;2、S5PV210芯片的中断处理过程2.1、中断处理第一阶段S5PV210芯片的中断处理第一阶段就是异常向量表的跳转,并没有任何特别,看上面的参考... 查看详情

s5pv210中断处理过程

一、异常处理的两个过程    第一,异常向量表的跳转    第二,进入异常处理程序中二、异常处理中的第一个过程    1、当发生异常时,CPU会自动跳转PC到异常向量表对应的地址处,软... 查看详情

gpio中断

...V210_GPJ3(0))作为输出,来控制两个作为中断的GPIO(S5PV210_GPH1(4)和S5PV210_GPH1(2)),从而触发两个LED灯( S5PV210_GPH0(6)和S5PV210_GPH0(7))。主要参考文件linux/interrupt.h,kernel... 查看详情

gpio中断

主要功能:通过两个GPIO(S5PV210_GPJ2(7)和S5PV210_GPJ3(0))作为输出,来控制两个作为中断的GPIO(S5PV210_GPH1(4)和S5PV210_GPH1(2)) 查看详情

s5pv210的启动过程

一、硬件结构 S5PV210存储部分的硬件结构大致为:内置SRAM+外接大容量DRAM+外接大容量Nand(S5PV210采用的是iNand)。 S5PV210内置了一块96kb的SRAM(即iRAM),同时还内置了一块64kb的NorFlash(即iROM)。二、启动过程 1、当CPU上... 查看详情

arm架构的外部中断介绍(s5pv210芯片)(代码片段)

1、外部中断介绍(1)中断源的划分:内部中断和外部中断。所谓内部中断和外部中断,是根据中断源来自Soc内部还是外部,(1)比如串口、定时器等都是Soc内部自带的,所以触发的中断都是内部中断;(2)给Soc外接... 查看详情

arm架构的外部中断介绍(s5pv210芯片)(代码片段)

1、外部中断介绍(1)中断源的划分:内部中断和外部中断。所谓内部中断和外部中断,是根据中断源来自Soc内部还是外部,(1)比如串口、定时器等都是Soc内部自带的,所以触发的中断都是内部中断;(2)给Soc外接... 查看详情

s5pv210-arm裸机-异常中的中断实现过程

210中的异常中的中断实现过程: 首先异常分为很多种,异常中包含了中断异常,有一个东西叫做异常向量表,在异常向量表中有很多相应异常的的地址。异常向量表中的所有异常中断的地址是不会变化的。地址都是固定的,但... 查看详情

arm架构的中断机制详解(s5pv210芯片)(代码片段)

1、中断介绍(1)中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行;(2)中断是为了实现宏观上的并发。... 查看详情

arm架构的中断机制详解(s5pv210芯片)(代码片段)

1、中断介绍(1)中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行;(2)中断是为了实现宏观上的并发。... 查看详情

x210开发板(s5pv210芯片)uboot中sd卡分区分析(init_raw_area_table函数)(代码片段)

1、init_raw_area_table函数调用关系 start.s start_armboot() mmc_initialize() mmc_init() mmc_startup() init_raw_area_table()2、structraw_area结构体&structmember结构体//这个结构体包含所有分区的信息typedefstructra 查看详情

s5pv210——初始化时钟

1:s5pv210的时钟域MSYSDomain:为处理器、3D、intc(中断)、DMC0、DMC1、IRAM、IROM提供时钟,HCLK_MSYS:200MHZ、PCLK_MSYS:100MHzDSYSDomain:为音视频等设备提供时钟,HCLK_DSYS:166MHZ、PCLK_DSYS:83MHzPSYSDomain:为外设提供时钟,如GPIO、I2C、PWM、... 查看详情

嵌入式开发(s5pv210)——u-boot的顶层makefile分析(代码片段)

前言本文分析的是u-boot的主Makefile以及主Makefile调用到的一些关键文件,此Makefile可能和你手里的u-boot的Makefile不一样,这是正常的,但是从逻辑上都是一样的,无非就是把同样功能的脚本放在了不同的位置或者子Ma... 查看详情

s5pv210-kernel-内核启动过程分析

1、1、内核启动过程分析前的准备1、拿到一个内核源码时,先目录下的无用文件删除2、建立SI工程3、makefile(1)makefile中不详细的去分析,几个关键的地方,makefile开始部分是kernel的版本号,这个版本号比较重要,因为在模块化驱... 查看详情