打印

关于U-boot的IRQ处理的一些疑问:

[复制链接]
3290|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子小骑兵|  楼主 | 2009-2-4 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
U-boot中IRQ的处理程序如下:
     
1        ldr sp , IRQ_STACK_START
        
2     sub    sp, sp, #S_FRAME_SIZE 
3    stmia    sp, {r0 - r12}            ;@ Calling r0-r12
4    add     r8, sp, #S_PC
5    stmdb   r8, {sp, lr}^                  ; @ Calling SP, LR
6    str     lr, [r8, #0]                   ; @ Save calling PC
7    mrs     r6, spsr
8    str     r6, [r8, #4]                   ; @ Save CPSR
9    str     r0, [r8, #8]                   ; @ Save OLD_R0
10    mov    r0, sp
      
11      bl     do_irq

12        ldmia    sp, {r0 - lr}^            ;@ Calling r0 - lr
13    mov    r0, r0
14    ldr    lr, [sp, #S_PC]            ;@ Get PC
15    add    sp, sp, #S_FRAME_SZ
16    subs    pc, lr, #4        

其中: S_FRAME_SIZE=72, S_PC=60.
       do_irq为一C函数,函数原型为:void do_irq(struct pt_reg *pt_regs)

仔细看了看,有几个问题百思不得其解,向大家讨教:

1. 第10句,为什么要保存IRQ模式下的SP?而保存之后似乎又没有使用这个保存量。至于后面第13句的mov ro ro就更不能理解了,不知何意?

2. 为什么要用第5句保存用户模式下的SP和LR?是为了利于在中断中返回用户模式进行中断嵌套么?

3. 第7和8句保存了SPSR入栈,但是后面的程序并没有使用到这个栈内的SPSR,依然是直接利用SUBS从SPSR来返回用户模式,不知怎么理解? 

谢谢~

相关帖子

沙发
电子小骑兵|  楼主 | 2009-2-6 10:41 | 只看该作者

...

谢谢版主的加精~~
另外,还有个问题想一起问下:
在start.s中,上述IRQ_STACK_START地址处放的数值是0x0badc0de,在2410的内存分布中这是一个ROM的绝对地址,而且远大于4K,如果将程序搬运到RAM以后,发生IRQ中断,此处的IRQ中断堆栈应该是用不了的,不能写。或许这个ARM920T的start.s并不是专门针对2410的,但是如果2410用这个START.S,发生了IRQ中断,那么处理器应该是不能处理的,不知道是不是这样?如果是这样,那发生了IRQ中断怎么办呢?

使用特权

评论回复
板凳
kieght| | 2009-2-7 12:21 | 只看该作者

持续关注中。

使用特权

评论回复
地板
avocationA| | 2009-2-7 17:00 | 只看该作者

关注中!!

使用特权

评论回复
5
kieght| | 2009-2-8 11:05 | 只看该作者

有懂这个的老大讲一下吗?

使用特权

评论回复
6
mxh0506| | 2009-2-9 10:28 | 只看该作者

LZ:看代码思维要灵活一点

0x0badc0de =  bad code, 明白了吗?

使用特权

评论回复
7
电子小骑兵|  楼主 | 2009-2-9 14:30 | 只看该作者

楼上的兄台能否说的更清楚些?

楼上的兄台能否说的更清楚些?不知道看的是不是同一个版本,我看的是u-boot-1.1.6,不过好象里面没有发现0x0badc0de =  bad code···
另外,=bad code代表什么?还是不解··· 请教了~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

32

帖子

0

粉丝