我们按照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中断体系结构分析的更多相关文章

  1. s5pv210中断体系

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

  2. Linux中断处理体系结构分析

    Linux中断处理体系结构分析(一) 异常,就是可以打断CPU正常运行流程的一些事情,比如外部中断.未定义指令.试图修改只读的数据.执行swi指令(Software Interrupt Instruc ...

  3. S5PV210 时钟体系分析

    S5PV210 时钟体系 如下面时钟结构图所示,S5PV210 中包含 3 大类时钟域, 分别是主系统时钟域(简称 MSYS).显示相关的时钟域(简称 DSYS). 外围设备的时钟域(简称 PSYS) ...

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

    Facebook的体系结构分析---外文转载 From various readings and conversations I had, my understanding of Facebook's ...

  5. 【MINA学习笔记】—— 1.体系结构分析[z]

    前言 Apache的MINA框架是一个早年非常流行的NIO框架,它出自于Netty之父Trustin Lee大神之手.虽然目前市场份额已经逐渐被Netty取代了,但是其作为NIO初学者入门学习框架是非 ...

  6. Java虚拟机体系结构分析

    下图是JAVA虚拟机的结构图: 每个Java虚拟机都有一个类装载子系统,它根据给定的全限定名来装入类型(类或接口).同样,每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令 ...

  7. Spring源码阅读-ApplicationContext体系结构分析

    目录 继承层次图概览 ConfigurableApplicationContext分析 AbstractApplicationContext GenericApplicationContext Gen ...

  8. Mina整体体系结构分析

    mina在应用程序中处于什么样的地位? mina屏蔽了一些网络通信细节对socket进行封装,并且基于NIO非阻塞框架,可以帮助我们快速开发网络通信,常常用于用户游戏开发,中间件等服务端应用程序.

  9. Spring源码阅读-BeanFactory体系结构分析

    BeanFactory是Spring中非常重要的一个类,搞懂了它,你就知道了bean的初始化和摧毁过程,对于深入理解IOC有很大的帮助. BeanFactory体系结构 首先看一下使用IDEA生成的继 ...

随机推荐

  1. Eclipse GBK批量转UTF-8插件(转)

    最近需要把Android项目转Android Studio,由于之前是eclipse开发,而且坑爹的是编码还是GBK的,转到Android Studio中文都是乱码,如果一个文件一个文件ctrl+c的 ...

  2. mysql空值排序

    SELECT * FROM lzh_topic_channel_product ORDER BY order_id is null , order_id  其中的ORDER BY order_id i ...

  3. bzoj3929(sam)

    因为题目中树的特殊性暴力dfs建sam就好了.然后sam有一个有意思的性质是一个点代表的子串个数等于mx[i]-mx[fail[i]],至于为什么,我不会严谨的证明,但想想还是可以的,就是当前串的所有 ...

  4. 【repost】学JS必看-JavaScript数据结构深度剖析

    JavaScript以其强大灵活的特点,被广泛运用于各种类型的网站上.一直以来都没怎么好好学JS,只是略懂皮毛,看这篇文章时有读<PHP圣经>的感觉,作者深入浅出.生动形象地用各种实例给我 ...

  5. MySQL导入SQL语句报错 : MySQL server has gone away (已解决)

    MySQL server has gone away 解决的方法其实很简单,我相信也有很多人遇到了这个问题.比如DZ论坛,安装好服务器,但是清空缓存等操作数据库的动作,运行时间稍长就会出现 MySQL ...

  6. Autofac与AOP功能例子

    using Autofac.Extras.DynamicProxy; using System; using System.Collections.Generic; using System.Linq ...

  7. [UWP]不那么好用的ContentDialog

    ContentDialog是UWP开发中最常用的组件之一,一个体验良好的UWP应用很难避免不去使用它.博客园里也有许多的文章介绍如何来利用ContentDialog实现各种自定义样式的弹窗界面.不过实 ...

  8. 项目Alpha冲刺(团队5/10)

    项目Alpha冲刺(团队5/10) 团队名称: 云打印 作业要求: 项目Alpha冲刺(团队) 作业目标: 完成项目Alpha版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 ...

  9. maya2017卸载/安装失败/如何彻底卸载清除干净maya2017注册表和文件的方法

    maya2017提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2017失败提示maya2017安装未完成,某些产品无法安装,也有时候想重新安装maya ...

  10. Spring.Net封闭业务类为WebService注意点和问题

    最近遇到的一个项目中用到了标题所说的方法,用Spring.Net将业务类封闭成WebService供其它地方调用使用,感觉还是蛮新鲜的,于是在园子中搜了一篇园友写的文章(这里)自己也尝试着搭了一个环境 ...