callout的问题,谢谢!

写中断Callout的时候遇到了一了问题,请教各位大虾了,先谢谢了!
QNX移植的目标是ep9315,它有两个中断寄存器,
在写中断callout的时候,查阅了一些网上的资料,好像有两种方法:
第一种
patch_intr:

stmdb sp!,{r4,lr}
add r4, r0, r2

mov r0, #size1
ldr r1, base1
bl callout_io_map
CALLOUT_PATCH r4, r0, r1, r2, ip

mov r0, #size2
ldr r1, base2
bl callout_io_map
CALLOUT_PATCH r4, r0, r1, r2, ip

ldmia sp!,{r4,pc}



CALLOUT_START(interrupt_id_ep9315 , 0, patch_intr)
/*

  • Get the address of the interrupt registers (patched)
    */
    mov ip, #0x000000ff
    orr ip, ip, #0x0000ff00
    orr ip, ip, #0x00ff0000
    orr ip, ip, #0xff000000

mov r3, #0x000000ff
orr r3, r3, #0x0000ff00
orr r3, r3, #0x00ff0000
orr r3, r3, #0xff000000

第二种:
patch_intr1:

stmdb sp!,{r4,lr}
add r4, r0, r2
mov r0, #size1
ldr r1, base1
bl callout_io_map
CALLOUT_PATCH r4, r0, r1, r2, ip
ldmia sp!,{r4,pc}

patch_intr2:

stmdb sp!,{r4,lr}
add r4, r0, r2
mov r0, #size2
ldr r1, base2
bl callout_io_map
CALLOUT_PATCH r4, r0, r1, r2, ip
ldmia sp!,{r4,pc}

CALLOUT_START(interrupt1_id_ep9315, 0, patch_intr1)
mov r3, #0x000000ff
orr r3, r3, #0x0000ff00
orr r3, r3, #0x00ff0000
orr r3, r3, #0xff000000

CALLOUT_START(interrupt2_id_ep9315, 0, patch_intr2)
mov r3, #0x000000ff
orr r3, r3, #0x0000ff00
orr r3, r3, #0x00ff0000
orr r3, r3, #0xff000000


我不清楚该用哪一种方法
假如是用第一种方法的话,那interrupt_id_ep9315的ip中保存的地址是哪一个呢?(base2/base1)
现在手头没有相关的callout类似文件可以参考,所以不大清楚写类似的规则,
有哪位大虾有相关callout的文件,不管是针对何种目标板的,能不能给我传一份作一下参看
非常感谢!
附:我的邮箱jiyq2003@gmail.com

http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/building/startup.html

QNX的文档里有关于callout的介绍。

网页中的内容我有看过
但是其中有关如何撰写callout提到的不是很多!

ip内容为base1的虚拟地址,r3内容为base2的虚拟地址.

若两级中断控制器是级连的,第二种较好,若不是,第一种较好,但要看具体情况而定.

请问comquter大侠,下面的语句什么含义?另外ip和r3寄存器可否更换成其它的寄存器如r1、r2等?
CALLOUT_START(interrupt_id_xxx , 0, patch_intr)
/*

  • Get the address of the interrupt registers (patched)
    */
    mov ip, #0x000000ff
    orr ip, ip, #0x0000ff00
    orr ip, ip, #0x00ff0000
    orr ip, ip, #0xff000000

mov r3, #0x000000ff
orr r3, r3, #0x0000ff00
orr r3, r3, #0x00ff0000
orr r3, r3, #0xff000000

含义:正如注释所说,Get the address of the interrupt registers (patched)
这几条指令执行过后IP/R3里就是PATCH过的寄存器虚拟地址.

一般来说用R0-R3及IP.

这样理解对不对?
如果patch了两个物理地址,就要有两次mov orr… 的过程,先进行mov orr…的返回第一patch的地址,后进行mov orr…返回后patch的地址。而mov orr…中具体用哪个寄存器无关紧要。

看看patcher的源代码应该不难理解那四条指令.

看了半天才明白。是将这4条指令中FF的字节给修改成了Vaddr了。设计者真是煞费苦心啊。如果所有代码一次编译,就能用编译工具实现同样的功能了。像我这等菜鸟也更容易理解了。 呵呵