Samsung原版44B0X的Bootloader分析

发 布 时 间 : 2008-11-17    来 源 : 来自网络    作 者 : 匿名   浏 览 :

1.中断向量表

AREA Init,CODE,READONLY

说明:

1.从代码看Init段就是要写入0x00地址的原始中断向量,因此把这个文件编译生成的44binit.O和Init填入ADS的Linker-Layout页对应项中(这样编译器会把该段代码编译到0X0地址。

2.这一部分按44B0数据手册中的中断的地址顺序列出了一个异常中断向量表(每个表项占4个字节)

3.例如 ADC 的中断向量为 0x000000c0 下面对应表中第49项位置;对应向量地址为 0x0 4*(49-1)= 0x000000c0

ENTRY ;入口

;地址

b ResetHandler ;for debug ;0x0000 0000

b HandlerUndef ;handlerUndef ;0x0000 0004

b HandlerSWI ;SWI interrupt handler ;0x0000 0008

b HandlerPabort ;handlerPAbort ;0x0000 000c

b HandlerDabort ;handlerDAbort ;0x0000 0010

b . ;handlerReserved ;0x0000 0014

b HandlerIRQ ;0x0000 0018

b HandlerFIQ ;0x0000 001c

;以下参考44B0的手册:中断控制器一章.按地址顺序排列

VECTOR_BRANCH

ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table 0x0000 0020

ldr pc,=HandlerEINT1 ;

ldr pc,=HandlerEINT2 ;

ldr pc,=HandlerEINT3 ;

ldr pc,=HandlerEINT4567 ;

ldr pc,=HandlerTICK ;mGA

b .

b .

ldr pc,=HandlerZDMA0 ;mGB

ldr pc,=HandlerZDMA1 ;

ldr pc,=HandlerBDMA0 ;

ldr pc,=HandlerBDMA1 ;

ldr pc,=HandlerWDT ;

ldr pc,=HandlerUERR01 ;mGB

b .

b .

ldr pc,=HandlerTIMER0 ;mGC

ldr pc,=HandlerTIMER1 ;

ldr pc,=HandlerTIMER2 ;

ldr pc,=HandlerTIMER3 ;

ldr pc,=HandlerTIMER4 ;

ldr pc,=HandlerTIMER5 ;mGC

b .

b .

ldr pc,=HandlerURXD0 ;mGD

ldr pc,=HandlerURXD1 ;

ldr pc,=HandlerIIC ;

ldr pc,=HandlerSIO ;

ldr pc,=HandlerUTXD0 ;

ldr pc,=HandlerUTXD1 ;mGD

b .

b .

ldr pc,=HandlerRTC ;mGKA

b . ;

b . ;

b . ;

b . ;

b . ;mGKA

b .

b .

ldr pc,=HandlerADC ;mGKB

b . ;

b . ;

b . ;

b . ;

b . ;mGKB

b .

b .

;0xe0=EnterPWDN

ldr pc,=EnterPWDN

通过这段代码,就在44B0的ROM中以0x00为起始地址的地方建立起了一张中断向量表,而且这个表的顺序完全符合44B0数据手册中对中断向量地址的定义要求。

2.一级与二级中断处理程序

在中断向量表中IRQ的地址处写入一条进入IRQ中断处理的指令,使IRQ发生中断时先到IRQ——SERIVE(一级中断处理程序)中对中断向量进行识别,再进入相应的在外部RAM中具体的IRQ中断程序。在此之间需要把中断向量表中的INT源中的中断与外部RAM中的与其对应的中断处理程序(二级中断处理程序)相对应,该操作是由一个宏来完成的,任何调用HandlerXXX HANDLER HandleXXX都将被下面的程序展开,该宏定义的代码用于将对应中断服务程序ISR的入口地址装载到PC中,可称之为“加载程序”

本初始化程序定义了一个34个字空间的数据区(在文件最后),用于存放相应中断服务程序的首地址。每个字空间都有一个标号,以HandleXXX命名。在向量中断模式下使用“加载程序”来执行中断服务程序。

向量中断和非向量中断模式的概念与区别

(一)向量中断模式是当CPU读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,通过跳转指令系统就直接跳转到对应地址函数中,节省了中断处理时间提高了中断处理速度。例如 ADC 中断的向量地址为0xC0,则在0xC0处放如下代码:ldr PC,=HandlerADC 当ADC中断产生的时候系统会自动跳转到HandlerADC函数中处理中断。

(二)非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将INTPND寄存器中对应标志位置位,然后跳转到位于0x18处的统一中断函数中;该函数通过读取INTPND寄存器中对应标志位来判断中断源,并根据优先级关系再跳到对应中断源的处理代码中处理中断。

1)设置缺省中断处理函数

;****************************************************

;* Setup IRQ handler *

;****************************************************

ldr r0,=HandleIRQ ;This routine is needed

ldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c

str r1,[r0]

2IRQ中断处理函数

下面这段程序是用来处理非向量中断,具体判断I_ISPR中各位是否置1 置1表示目前此中断等待响应(每次只能有一位置1),从最高优先级中断位开始判断,检测到等待服务 ;中断就将pc置为中断服务函数首地址

IsrIRQ ;using I_ISPR register.

sub sp,sp,#4 ;reserved for PC,PC留下空位.

stmfd sp!,{r8-r9} ;r8,r9先入栈

ldr r9,=I_ISPR ;读入I_ISPR中的值

ldr r9,[r9]

mov r8,#0x0

0

movs r9,r9,lsr #1 ;逻辑右移,得到中断源的编号

bcs

上一篇:解析44B0中断执行过程-中断跳读       下一篇:ARM硬件开发