主题 : 进入中断服务函数无法退出!!!! 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 94354
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
贡献值: 0 点
综合积分: 28 分
注册时间: 2013-07-15
最后登录: 2015-09-16
楼主  发表于: 2014-09-17 19:04

 进入中断服务函数无法退出!!!!

今天做了个dm9000的裸机驱动程序  用的是开发板的EINT7中断  但是进了中断服务函数后就停在了恢复现场的那段汇编代码那出不去了  实在想不出为啥  

void int_issue()
{
          __asm__(
           "sub lr,lr,#4\n"
           "stmfd sp!,{r0-r12,lr}\n"
           :
           :
          );
          packet_len = dm9000_rx(&buffer[0]);        

          net_handle(&buffer[0],packet_len);

          EINT0PEND = (~0x0);
          VIC0ADDRESS = 0;
          VIC1ADDRESS = 0;
            led_on();     <<-----------------------用led测试后发现就是停在这出不去的
        __asm__(
           "ldmfd sp!,{r0-r12,pc}^ \n"
           :
           :
           );
         // led_on();  <<-----------------------  要是LED 放在这的话就不亮了  所以我认为是停在汇编那出不去的
}


void int_init()             //各个寄存器地址都确保没有错
{
       GPNCON &= (~(0x2<<14));
       GPNCON |= (0x2<<14);
       EINT0CON0 &= (~(0x7<<12));
       EINT0CON0 |= (0x1<<12);
       EINT0MASK = 0;
       VIC0INTENABLE |= 0xffffffff;
       EINT7_VECTORADDR = (int)int_issue;
       __asm__(
        "mrc p15,0,r0,c1,c0,0\n"
        "orr r0,r0,#(1<<24)\n"
        "mcr p15,0,r0,c1,c0,0\n"

        "mrs r0,cpsr\n"
        "bic r0, r0, #0x80\n"  //允许中断
        "msr cpsr_c, r0\n"
        :
        :
        );
}
级别: 新手上路
UID: 109008
精华: 0
发帖: 13
金钱: 65 两
威望: 13 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2014-10-14
最后登录: 2015-12-03
1楼  发表于: 2015-03-10 15:41
楼主解决了吗,我现在也面临这个问题求答案。。
级别: 新手上路
UID: 113040
精华: 0
发帖: 7
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2015-02-28
最后登录: 2015-12-16
2楼  发表于: 2015-03-14 12:10
这其实是进入堆栈时候的一个小bug,我发过类似的帖子,有兴趣的话可以去看看