wince5.0 Eboot下USB中断机制

      开始在EBOOT中使用USB的时候很奇怪中断响应。因为在EBOOT和STEPLDR中都没有看到有对中断向量表部分的处理。那么这个中断是怎么触发?

 

      最后在USB.C中的Isr_Init找到这句话:

pISR =(unsigned)(0xEA000000)+(((unsigned)IsrHandler - (0x80000000 + 0x18 + 0x8) )>>2);

这个实现了将USB的handler交给中断向量部分的处理,很简洁,下面分析这句话:

0xEA00000000 是机械码,将汇编中的无条件跳转指令 b

(unsigned)IsrHandler 是汇编中的ISR处理程序的首地址。

0x80000000 是MMU以后的映射的首地址。

0x18是中断向量表中的ISR部分的地址偏移量。

0x8 是进行ARM的三级流水的补偿。

((unsigned)IsrHandler - (0x80000000 + 0x18 + 0x8) )的意思就是计算ISRHandle函数相对于首地址的偏移地址。>>2是取Word对齐。

(unsigned)(0xEA000000)+(((unsigned)IsrHandler - (0x80000000 + 0x18 + 0x8) )>>2)就是一个机械码。EAXXXXXX,跳转到相对于首地址的ISRHandle位置。

 

而pISR的宏定义为#define pISR  (*(volatile unsigned *)(0x30000000+0x18)) // Virtual Address 0x0 is mapped to 0x30000000, ISR Address is VA 0x18

意思就是指向中断向量表中ISR地址。

 

所以

pISR =(unsigned)(0xEA000000)+(((unsigned)IsrHandler - (0x80000000 + 0x18 + 0x8) )>>2);

就是将IsrHandle的程序指向到中断向量表中的ISR。

 

当有USB的中断发生时,会先进入到IsrHandler程序进行判断。然后再这段汇编中跳转到IsrUsbd中进行对USB的各种中断处理。

 

在其中还有一点疑惑。

1. pISR是一个指向函数/地址的指针。而等式后面是一个机械码。相当于将一个这个机械码写到某个地址上面。不知道这样是否ok@

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值