A.W. 发表于 2012-4-15 22:17:23

6410 中断问题

搞了好几天,一直搞不定,向大家求救!请帮忙:

我要在TQ6410裸机上接管中断服务,从Nand Flash启动,在不擦除U-Boot的情况下,把我的代码下载到RAM,请问如何接管 IRQ中断?

我尝试过以下办法,行不通,为什么 ?
1) 我跟踪0x00000018处的IRQ入口,发现它跳到0x00000084处执行,反编译那里的代码如下:
          SUBR13,R13,#4
          STMFD R13!,{R0}
         LDRR0,;= ->0x0C001FF8
         LDRR0,    ;= ->0xE5854010
         STRR0,
         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也操作了,也不成功,请问是为什么?

A.W. 发表于 2012-4-17 21:52:52

自己顶一下,看看有没有人能够解决!
页: [1]
查看完整版本: 6410 中断问题