注册 登录
查看: 259|回复: 2

[山外调试工具] 【调试技巧】 程序卡死在默认中断(延时函数),怎么办?

[复制链接]
发表于 2019-5-27 12:59:18 | 显示全部楼层 |阅读模式
经常很多同学遇到程序卡死,就没办法。这部分知识,其实我们在K60视频的IAR使用技巧里,说到如何解决的。不过,我们发现很多同学不喜欢看资料,一来就拿师兄的可跑程序来修改,遇到卡死情况就束手无策。

首先,程序卡死,需要看调用栈。

IAR界面里,进入调试界面,view —— call stack


等程序卡死了,看调用栈的信息。这里是跑入默认中断:


双击 default_isr ,这个是默认中断函数,双击后,代码会切换到这函数:


大家可以看到,我们的默认中断函数,已经把调试信息,通过串口发送出去。
由于死循环里,有延时函数,换句话说,延时函数占用的时间比其他函数还要多很多,很多同学总是误以为卡死在延时函数,实际上就是进入默认中断,或者断言失败。

可以考虑接上串口,有报错误信息的。不会用串口的同学,看以下帖子:
  1. 山外K60 串口输出问题,printf输出问题 - 智能车资料区 - 山外论坛 http://vcan123.com/forum.php?mod=viewthread&tid=22&ctid=1

  2. 串口通信异常,一般这个帖子可以解决。

  3. 如果对串口接线不熟悉,可看这帖子:
  4. 【山外串口】串口TTL和RS232解析 - 智能车资料区 - 山外论坛 http://vcan123.com/forum.php?mod=viewthread&tid=6482&ctid=15




不过很多同学不会用串口,我这里在讲一下手动查找的方法:把 vtr 添加到 watch ,看看值是多少


此值为0x35,即对应的10进制数据为53

查找代码:Chip\inc\common.h 里面的 VECTORn_t 枚举  (不要把 IRQn_t 搞混, VECTORn 和 IRQn不一样的!!!看后缀)


上图,是UART3_RX_TX_VECTORn中断。

结论: UART3 的中断入口函数,并没配置好。(可能没配置,也可能触发中断前,还没执行配置函数,即函数顺序搞反了)

中断函数入口,需要调用set_vector_handler函数来配置,看下图是串口例程的模版:


如果你确认已经调用了这函数配置入口,但依旧出现这情况,那就需要考虑函数的执行顺序问题,把这部分配置,放在main函数的开头。



如上图,先执行set_vector_handler函数,这样就不会搞错了。




如果是 NMI中断,如何处理?
把PTA4,接髙电平,确保不会被拉低

如果是 Hard中断,如何处理?
看看进入中断前,执行的是哪个函数,哪个语句,导致的。
这个中断产生的原因非常多。例如:
  1. 除法运算,被除数为0;
  2. 指针指向不可读写的区域;
  3. 调用没初始化的模块;
  4. 数组越界,堆栈被破坏;
  5. 。。。


根据最后执行的语句,判断问题。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2019-5-27 20:33:18 | 显示全部楼层
谢谢 山外哥 是我资料没看太仔细
回复 支持 反对

使用道具 举报

发表于 2019-5-28 14:21:56 | 显示全部楼层
谢谢分享,有用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部