s5pv210——中断

1:s5pv210的中断步骤

(1):建立异常向量表;

(2):写入中断处理函数;

(3):中断初始化;

(4):建立中断号与中断处理函数的联系,使能中断;

当中断发生时,中断处理函数会自动处理中断;

流程如下:

2:建立异常向量表:

s5pv210异常向量表的基地址为0xD003_7400,下图为异常对于基地址的偏移量;

第一步建立异常向量表:

代码如下:

/*
 *    s5pv210 裸机
 *
 *  异常向量表初始化
 *
 */

#define VECTOR_TABLE_BASE            0xD0037400

#define Reset_offset                0x0
#define Undef_offset                0x4
#define SVC_offset                    0x8
#define Prectch_offset                0xC
#define Data_Abort_offset            0x10
#define IRQ_offset                    0x18
#define FIQ_offset                    0x1C

#define _PFUNC_Reset        (*(unsigned int*)(VECTOR_TABLE_BASE+Reset_offset))
#define _PFUNC_Undef        (*(unsigned int*)(VECTOR_TABLE_BASE+Undef_offset))
#define _PFUNC_SVC            (*(unsigned int*)(VECTOR_TABLE_BASE+SVC_offset))
#define _PFUNC_Prectch        (*(unsigned int*)(VECTOR_TABLE_BASE+Prectch_offset))
#define _PFUNC_Data_Abort    (*(unsigned int*)(VECTOR_TABLE_BASE+Data_Abort_offset))
#define _PFUNC_IRQ            (*(unsigned int*)(VECTOR_TABLE_BASE+IRQ_offset))
#define _PFUNC_FIQ            (*(unsigned int*)(VECTOR_TABLE_BASE+FIQ_offset))

void Reset_handle(void)
{

}
void Undef_handle(void)
{

}

void SVC_handle(void)
{

}
void Prectch_handle(void)
{

}
void Data_Abort_handle(void)
{

}

void vector_table_init(void)
{
    _PFUN_Reset            = Reset_handle;
    _PFUNC_Undef        = Undef_handle;
    _PFUNC_SVC            = SVC_handle;
    _PFUNC_Prectch        = Prectch_handle;
    _PFUNC_Data_Abort    = Data_Abort_handle;
    _PFUNC_IRQ            = IRQ_handle;
    _PFUNC_FIQ            = IRQ_handle;            //FIQ、IRQ都是采用IRQ中断

}

IRQ_handle要写在汇编IRQ_handle.S中;

代码如下:

/*
 *
 *
 *
 *
 */

#define IRQ_STACK        0xD0037F80 

    .global IRQ_handle
IRQ_handle:

    //设置IRQ的栈
    ldr sp, =IRQ_STACK

    //由于三级流水线的存在,pc为此时的程序语句+8,保存的时候要把下一句保存到lr中
    sub lr, lr, #4

    //保存现场
    stmd sp! {r0-r12, lr}

    //跳转到中断处理函数
    bl isr_handler

    //恢复现场
    ldmfd sp! {r0-r8, lr}^

ARM保存中断时为什么使用 sub lr, lr, #4

1. 首先要谈流水线,在arm执行过程中一般分为取指,译码,执行阶段

也就是假设当前                                                                      第一条指令在执行阶段

第二条指令在译码阶段

第三条指令在取指阶段

当前正在执行的指令地址为pc-8,第二条就为pc-4,而pc现在真正指向已处于pc位置

2. 一般pc在发生中断时lr保存的是当前的pc值,这里pc值是多少呢??

当发生中断肯定保存的pc是第三条指令,而我们从中断返回肯定不是执行第三条指令,而是紧接着的第二条指令,所以应该保存的 lr = pc - 4,

但是当执行到此位置时pc值已经改变,肯定不对,还好发生中断时 mov lr,pc 所以这里就可以直接使用 sub lr,lr,#4

————————————————————未完待续————————————————————————————

时间: 2024-07-30 10:13:34

s5pv210——中断的相关文章

s5pv210中断体系

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

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: @ 关闭看门狗 l

软件和硬件都是对生活的高度抽象---论中断控制(ARM体系编程)

不同的芯片体系设计在集成电路系统设计阶段其实都遵循大体一致的设计思想,芯片设计发展那么多年,真正为人所熟知的就是X86架构和ARM架构,当然还有日渐没落的MIPS,其他都是一些简单的控制器芯片体系.而硬件模块设计又是高度抽象于现实需求,很多时候,X86.ARM和MIPS只有底层寄存器和指令级别的差异,对于软件驱动基本是一致的.本文论及ARM体系的中断控制,以基于Cortex A8的S5PV210为例.中断是一种异步工作机制,也是嵌入式处理器的一个核心工作机制,对于实时操作系统来说必不可少. 1.

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

嵌入式Linux裸机开发(八)--S5PV210中断处理流程 中断是一个过程,是CPU在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程.因硬件原因引起的中断过程的出现是不可预测的,即随机的,而软中断是事先安排的.引起中断的信号源称之为中断源.根据中断源的来源将中断分为外部中断和内部中断.中断源来自SoC内部(内部外设)的中断称为内部中断.中断源来自SoC外部,通过中断对应的GPIO引脚产生的中断称为外部中断.中断有四种状态: Inactive(不激活):没有被激活或挂起的中断 

s5pv210中断处理过程

一.异常处理的两个过程 第一,异常向量表的跳转 第二,进入异常处理程序中 二.异常处理中的第一个过程 1.当发生异常时,CPU会自动跳转PC到异常向量表对应的地址处,软件需要处理的就是将这个异常处理的代码首地址填入这个异常向量地址处. 2.中断处理要先在汇编文件中进行,主要的过程是保护现场和恢复现场 保护现场:主要是设置IRQ栈.保存LR和保存r0-r12,中断返回时关键的就是对于PC和cpsr两个寄存器的保存.中断返回地址保存在LR中,而cpsr自动保存在(IRQ模式下的)spsr中. 恢复现

linux的中断子系统简介(汇编和hard irq部分)_ARM平台(S5PV210)

2011年9月份时候做的笔记, 当时阅读中断子系统的代码后做的一个PPT, 内核版本不记得了, 硬件平台是samsung 的S5PV210. 这部分主要是针对汇编和hard irq的部分, 在hard irq处理后的softirq的处理, 以及下半部的处理(tasklet/workqueue)都没有涉及. Agenda ?Interrupts in ARM ?Important structs ?External interrupt resources in S5PV210 ?Code flow

嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)

这是一篇阐述怎样对嵌入式SOC外部中断进行控制编程的方法论文章.希望读者理解本篇文章后.能够具备对市场上全部已经面世和将来面世的嵌入式芯片的外部中断进行控制编程的能力. 笔者原创的技术分享一直都恪守下面原则: 从需求的角度去理解嵌入式各种软件和硬件模块的作用和组成.并从芯片系统设计的角度去阐述怎样进行控制编程. 前者对于理解复杂的系统(如linux的各个子系统)是非常有效的:后者所讲的是代表一个芯片设计project师的视觉,芯片模块由他负责设计,他对于该模块的控制编程自然是最有发言权的. 笔者

S5PV210 串口实验(中断方式)

结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验. start.S .global _start .global IRQ_handle _start: /* 关 Watch Dog */ ldr r0, =0xE2700000 mov r1, #0 str r1, [r0] /* 设置系统模式栈指针 */ ldr sp, =0x40000000 /* 开 IRQ 总中断开关 */ mov r0, #0x53 msr CPSR_cxsf, r0 /* 时钟初始化 */

s5pv210的外部中断

中断,在学单片机的时候就没有学好,这次接触到210的中断体系,直接蒙圈了..前天下午老师简单的讲了一下,他的每句话拆开都可以听得懂,联系起来就傻了,,而且懂了与会写差距还远着呢.当天下午所有人都是萎靡的状态(不懂,不会写极其郁闷),以为参照裸机开发指南可以边写会慢慢理解,结果越写越是打击.晚上没有回去,一直想体验下在教室通宵的感觉,除了蚊子比较多.床不好睡.网速依旧渣.睡得太累,好吧,好像并没有什么优点. 虽然说是通宵了,但是几乎什么都没有学到,反而把自己搞得劳累.得不偿失!早上去领了免费包子,