| 搞了好几天,一直搞不定,向大家求救!请帮忙: 
 我要在TQ6410裸机上接管中断服务,从Nand Flash启动,在不擦除U-Boot的情况下,把我的代码下载到RAM,请问如何接管 IRQ中断?
 
 我尝试过以下办法,行不通,为什么 ?
 1) 我跟踪0x00000018处的IRQ入口,发现它跳到0x00000084处执行,反编译那里的代码如下:
 SUB  R13,R13,#4
 STMFD R13!,{R0}
 LDR  R0,[R15,#0x25C]  ;=[0x000002F0] ->0x0C001FF8
 LDR  R0,[R0]    ;=[0x0C001FF8] ->0xE5854010
 STR  R0,[R13,#4]
 LDMFD R13!,{R0,PC}
 看起来好像U-Boot在0x000002F0处保存了一个地址0x0C001FF8,而地址0x0C001FF8这里又保存了最后的IRQ函数处理入口,由于0x00000018 , 0x00000084 , 0x000002F0处都是Flash地址 ,我不打算改变U Boot原代码,以免下次启动错误,所以我打算修改SRAM处0x0C001FF8的内容,把它的内容改为我的IRQ函数地址,然后开启了一个RTC定时器中断,每隔1秒定时器中断一次,闪烁LED灯,串口打印信息,运行的时候却发现,开机LED流水灯闪烁,然后从串口输出欢迎信息,表明程序已经启动,但是接下来开启中断后大约3秒钟,板子没动静了,灯也不闪,串口也没动静,应该是中断已经发生,然后跑飞了。通过串口打印0x0C001FF8的内容发现,我的IRQ处理函数地址已经被正确填写在那里,但是就是不行,为什么?PC跑到哪里去了?我该怎么办 ?我的代码是通过U Boot的选项7下载到RAM里0xC0000000地址处的,中断服务函数的地址是0xC00005F8,代码如下:
 void __irq HandlerIRQ(void)
 {
 
 volatile unsigned int value_VIC0_IRQSTATUS=VIC0_IRQSTATUS;
 startled();
 
 if(value_VIC0_IRQSTATUS & (1<<2))
 {
 _isr_timer();
 }
 
 uart0_print("irq: VIC0_IRQSTATUS=%X\n",VIC0_IRQSTATUS);
 return;
 }
 
 2)我尝试过另外一种方法来接管中断,即往VICxADDR寄存器处写IRQ服务函数地址,CP15也操作了,也不成功,请问是为什么?
 
 
 |