- 论坛徽章:
- 0
|
本帖最后由 wilbur512 于 2010-09-29 00:10 编辑
大家好!
我想在mips32(xls 416用32位工具链编译) uboot里添加时钟中断处理功能,结果发现中断处理函数里eret失败
以下为操作步骤:
1) 把mips exception入口向量,拷贝到物理0x180 地址开始的内存区域 ,然后把ebase指向0x180 :
即,把以下三句代码拷贝到虚拟地址0x80000180:
lui k1, HIGH(handle_int)
addiu k1, k1, LOW(handle_int)
jr k1
2)中断处理函数 handle_int:
LEAF(handle_int)
nop
la t9,do_IRQ
nop
jalr t9
nop
eret
nop
END(handle_int)
说明:a)nop是预防延迟槽;
b)为了简便起见,中断处理函数里没有SAVE_ALL保存现场,而是处理完毕do_IRQ后直接eret;同时,do_IRQ是个非常简单的函数,仅仅打印一句话就退出:
void do_IRQ(void)
{
ack_irq(); /* 响应一下中断,以免CPU不停的发中断,我这里的实现是 write_compare(0x0),
把mips的性能计数器清0*/
print("do_irq enter\n");
}
外面的主循环是:
main_loop()
{
local_irq_enable();
while(1){
print("loop...\n");
}
}
现在发现handle_int函数的最后一句,eret似乎没有退出中断,系统每隔4s打印一次"do_irq
enter"(时钟周期设置的是4s),而没有打印外面的主循环“loop...”,
看上去像是发生了中断嵌套,所以猜测是eret根本没有返回。
请问 出现上述现象的原因,会有哪些可能? 谢谢 |
|