免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3667 | 回复: 0
打印 上一主题 下一主题

mips中断处理,eret无法返回 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-28 22:33 |只看该作者 |倒序浏览
本帖最后由 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根本没有返回。



请问 出现上述现象的原因,会有哪些可能? 谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP