S5pv210中断体系结构分析

我们按照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 即可。

原文地址:https://www.cnblogs.com/GyForever1004/p/8367272.html

时间: 2024-11-05 14:53:50

S5pv210中断体系结构分析的相关文章

s5pv210中断体系

一.什么是中断? 1.中断的发明是用来解决宏观上的并行需要的.宏观就是从整体上来看,并行就是多件事情都完成了. 2.微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的.宏观上面的并行并不等于围观的并行,有时候宏观上是并行的,微观上 是串行的. 3.为什么需要中断?因为单核CPU实际无法并行的,但是通过中断机制,可以实现假并行(宏观上的并行,微观上实际还是串行的). 二.异常和中断的区别和联系 1.针对SoC来说,发生复位.软中断.中断.快速中断.取指令异常.数

S5pv210 时钟体系分析

S5PV210 时钟体系 如下面时钟结构图所示,S5PV210 中包含 3 大类时钟域, 分别是主系统时钟域(简称 MSYS).显示相关的时钟域(简称 DSYS). 外围设备的时钟域(简称 PSYS). 1) MSYS:用来给 cortex a8 处理器.DRAM 控制器.3D.IRAM.IROM.INTC(中断控制器)等提供时钟: 2) DSYS:用来给显示相关的部件提供时钟,包括 FIMC.FIMD.JPEG 和 multimedia IPs; 3) PSYS:用来给外围设备提供时钟,如 i

Facebook的体系结构分析---外文转载

Facebook的体系结构分析---外文转载 From various readings and conversations I had, my understanding of Facebook's current architecture is: Web front-end written in PHP. Facebook's HipHop Compiler [1] then converts it to C++ and compiles it using g++, thus providi

s5pv210——中断

1:s5pv210的中断步骤 (1):建立异常向量表: (2):写入中断处理函数: (3):中断初始化: (4):建立中断号与中断处理函数的联系,使能中断: 当中断发生时,中断处理函数会自动处理中断: 流程如下: 2:建立异常向量表: s5pv210异常向量表的基地址为0xD003_7400,下图为异常对于基地址的偏移量: 第一步建立异常向量表: 代码如下: /* * s5pv210 裸机 * * 异常向量表初始化 * */ #define VECTOR_TABLE_BASE 0xD003740

JZ2440开发板之中断体系

ARM架构的CPU有7种工作模式: 1. 用户模式--usr 2. 管理模式--svc 3. 系统模式--sys 4. 快中断模式--fiq 5. 中断模式--irq 6. 数据访问终止模式--abt 7. 未定义指令终止模式--und ARM架构的CPU有2种工作状态: 1. ARM状态--处理器执行32位的字对齐的ARM指令 2. Thumb状态--处理器执行16位的半字对齐的Thumb指令 ARM架构的CPU的寄存器: 1. ARM有31个通用的32位寄存器和6个状态寄存器 2. 每种AR

长安.ARM体系结构分析

作者:华清远见讲师 有许多同学问我,老师嵌入式行业发展前景如何. 嵌入式从来就不是一个行业,嵌入式只是一类技术的组合,而且这"一类技术",还在随着时间不断变化. 技术是用来解决问题的.你应当首先思考,你准备解决什么问题.而无论是Linux.Android.ARM.C等等我在这里教你的每一项具体的技术,都无法单独解决问题. 停止问我"嵌入式还是Android好"这种无聊的问题吧,也停止思考"我应该是做应用层还是底层"这种浅薄的人生.去发现这个社会的

Java虚拟机体系结构分析

下图是JAVA虚拟机的结构图: 每个Java虚拟机都有一个类装载子系统,它根据给定的全限定名来装入类型(类或接口).同样,每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令. 当JAVA虚拟机运行一个程序时,它需要内存来存储许多信息,Java虚拟机把这些信息都组织到几个“运行时数据区”中,以便于管理.运行时数据区共包括五个部分(方法区.Java堆区.Java栈区.程序计数器.本地方法栈). 1.类加载子系统 在JAVA虚拟机中,负责查找并加载类型的那部分被称为类加载子

【Oracle】8.Orecle体系结构分析

概念 什么是Oracle数据库? 基本上,有Oracle数据库的两个主要组成部分 - 实例和数据库本身.实例包括一些内存结构和后台进程,而数据库是指磁盘资源.图1会告诉你之间的关系. 实例 该实例分析(SGA + PGA +后台进程)交互过程. 内存结构和后台进程contitute一个实例.内存结构本身由系统全局区(SGA),程序全局区(PGA),以及一个可选的区域.在另一方面,强制性的后台进程数据库写进程(DBWn),日志写入(LGWR),检查点(CKPT)系统监视器(SMON)和进程监视器(

计算机网络体系结构分析

一.基本概念 计算机网络按照体系结构划分可分为七层协议模型及ISO/OSI(国际标准化组织/开放式系统互联).四层协议模型及TCP/IP协议模型.和OSI和TCP/IP相结合的五层协议模型.三者关系入下图所示. 二.网络层级 应用层: 简介:为应用程序提供服务并规定通信程序中通信协议的相关细节 通信单元:报文 典型协议:HTTP.FTP.POP3.IMAP.DNS 表示层: 简介:负责上下层间交换数据的语法和与语义,具体负责数据交换.加密.及压缩 通信单元: 典型协议: 会话层: 简介:负责建立