RSS

Samsung原版44B0X的Bootloader分析(1)

来源:网络 作者:匿名 时间:2007-01-06 Tag: 点击:

    str       r1,[r0]

2)IRQ中断处理函数

下面这段程序是用来处理非向量中断,具体判断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      %F1

    add      r8,r8,#4

    b         %B0

1

    ldr       r9,=HandleADC      

    add      r9,r9,r8          ;得到偏移地址

    ldr       r9,[r9]            ;得到相应的IRQ程序地址

    str       r9,[sp,#8]              ;把IRQ程序的地址当成PC值入栈

    ldmfd   sp!,{r8-r9,pc} ;对PC赋值,转到新的中断程序处。

3)定义一个加载宏。

    MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

;由于ADS仅支持FD(满递减)型堆栈

    sub      sp,sp,#4             ;decrement sp(to store jump address)

    stmfd   sp!,{r0}              ;PUSH the work register to stack(lr does't push because it return to original address)

;将要使用的R0寄存器压栈保护。

    ldr       r0,=$HandleLabel   ;load the address of HandleXXX to r0

    ldr       r0,[r0]                ;load the contents(service routine start address) of HandleXXX

    str       r0,[sp,#4]                  ;store the contents(ISR) of HandleXXX to stack

;将对应的中断函数首地址入栈保护

    ldmfd   sp!,{r0,pc}          ;POP the work register and pc(jump to ISR)

;将中断函数的首地址出栈,放入PC中,系统将跳转到对应中断处理函数    

    MEND


1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
教程下载