最近做以太网这块的东西,按照wiki上面的例子,自己把locatorReceive这个函数里的接收buffer换了一个全局的比较大的变量(1024),在接收数据时连续接收后会跳到dabort异常(发现主程序不动了立即停止仿真),如果时间长了(没有立即停止仿真),程序会跳到undefEntry里面,这种情况应该怎么查找原因呢?
使用的是TMS570ls3137 pge的芯片,自己做的板子,发送是正常的,就是在连续接收数据的时候会出问题,请求指导下。
yong
Jay:
Hi yong,
请检查你的堆栈是否溢出。请加大堆栈再进行测试。
Regards,
Jay
yong zhang2:
回复 Jay:
加大哪一部分的堆栈呢?已经把IRQ部分的堆栈增加了,单步调试看这个堆栈没有溢出
今天把看门狗关掉了,然后发现程序会卡在以太网接收保护的IntMasterIRQDisable()这个例程中带的函数中一直死循环,调试窗口也只显示这一个函数,没有显示是通过哪个函数调用的,之前的dabort可能是由于加了看门狗,在这个地方触发了不可屏蔽中断造成的
主程序还有调用rti模块的中断,把这个中断关掉的话没有出现上面那个问题,怀疑是这个rti中断造成的影响,这个rti的中断服务程序中时关了中断的(_disable_interrupt_()),结尾时才打开中断,目前不清楚具体发生问题的原因是什么
Regards,
yong
yong zhang2:
回复 Jay:
刚才又测试了几次,发现程序又没在那卡着了。。。程序跳到了sys_core。asm中的_esmCcmErrorsClear_,然后一直循环很多遍,最后出现dabort异常,这是为什么呢?
yong zhang2:
回复 yong zhang2:
问题解决了,是以太网中断跟定时器中断禁用可能有冲突,具体原因不清楚,把定时器中断服务程序中的开、关中断关掉就正常了,十分感谢您的回复~
regards,
yong
Jay:
回复 yong zhang2:
Hi yong,
很高兴能看到问题得以解决。
从你提供的信息来看,还是觉得是由于堆栈溢出引起data abort的异常。
请问你的程序中,以太网中断和定时器中断有“嵌套”吗?
Regards,
Jay
yong zhang2:
回复 Jay:
应该是有的,从VIM中的优先级来看,定时器的中断优先级是比较高的,可能会发生中断的嵌套,定时器的中断服务程序很少的,有十来行代码吧,这样的话会在IRQ的堆栈中会溢出么?
Regards
yong
yong zhang2:
回复 Jay:
十分感谢您的提示,确实可能是这里的问题。
Regards,
yong