[ZLG-MCU] 急!请教:什么情况下会进入_intDefaultHandler死循环?

[复制链接]
 楼主| 坚持梦想 发表于 2008-4-29 17:36 | 显示全部楼层 |阅读模式
我将在裸机上试验的读取18B20的程序写成单任务,在ZLG发布的uCOS移植模板上添加单任务程序,编译时通过,但Debug之后,程序便在<br />static&nbsp;void&nbsp;__intDefaultHandler&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />不断死循环。<br />这个函数的注释是:当处理器发生不可预测的中断时调用本函数。<br />之前在裸机上运行时,这个程序是通过的,而且这个程序中并没有用到中断。为什么还会进入这个死循环?<br />急盼赐教,谢谢!<br />
jtingwang 发表于 2008-4-29 21:18 | 显示全部楼层

程序跑飞了

程序跑飞了,有可能的原因:指针没有赋值就使用;主堆栈或任务堆栈不够大
立体几何 发表于 2008-4-30 11:46 | 显示全部楼层

没有中断也会进入intDefaultHandler

新鲜事儿啊!程序跑飞的可能性应该不大,跑飞最多进FAULTISR也不会进intDefaultHandler,看看初始中是不是有用到其它模块,其它模块是不是定义了中断。我还是觉得模板中用到了中断可能性大一点。
 楼主| 坚持梦想 发表于 2008-4-30 13:06 | 显示全部楼层

回2楼:堆栈不够大?

怎样判断堆栈需要多大?我使用的是参考程序的堆栈设置,如下:<br />#define&nbsp;&nbsp;TASK_START_STK_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50<br />#define&nbsp;&nbsp;TASK_TEMP_STK_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50<br />
 楼主| 坚持梦想 发表于 2008-4-30 13:09 | 显示全部楼层

回3楼:的确没有中断

的确没有中断。我是在实验程led单任务程序上修改的。以下是我的目标板初始化代码:<br />void&nbsp;&nbsp;targetInit&nbsp;(void)<br />{<br />&nbsp;#if&nbsp;PLL_EN&nbsp;==&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(CCLK_DIV&nbsp;|&nbsp;SYSCTL_USE_OSC&nbsp;|&nbsp;SYSCTL_OSC_MAIN&nbsp;|&nbsp;EXT_CLK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(CCLK_DIV&nbsp;|&nbsp;SYSCTL_USE_PLL&nbsp;|&nbsp;SYSCTL_OSC_MAIN&nbsp;|&nbsp;EXT_CLK);&nbsp;<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;tickInit();&nbsp;//Initialize&nbsp;the&nbsp;uC/OS-II&nbsp;tick,应该不会是这个中断吧??&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;temp_Init();&nbsp;&nbsp;&nbsp;//温度读取初始化<br />}&nbsp;<br /><br />void&nbsp;temp_Init(void)<br />&nbsp;{<br />&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIO口<br />}&nbsp;&nbsp;&nbsp;<br />
jtingwang 发表于 2008-4-30 15:41 | 显示全部楼层

我看错了,以为是FAULTISR

我看错了,以为是FAULTISR<br /><br />如果是intDefaultHandler,你检查一下,中断向量表是不是对应错了,即本来是40号中断,对应到了第39或41的位置;<br />或者先屏蔽所有中断,然后再单单使能OS用到的时钟节拍中断。
立体几何 发表于 2008-4-30 16:37 | 显示全部楼层

ZLG的UC/OS的systick也是用中断的

看看中断向量表里是不是把systick的中断函数加到中断向量表了
 楼主| 坚持梦想 发表于 2008-5-1 23:00 | 显示全部楼层

还有可能是其它问题吗?

确定向量表里已经添加了tickISRHandler。因为只有systick中断,所以中断向量表里没有添加其它中断函数,应该不会出现对应错误。在写程序时,主函数中已经先关闭了总中断,然后在目标板初始化时,使能时钟节拍中断。
 楼主| 坚持梦想 发表于 2008-5-1 23:02 | 显示全部楼层

会是温度读取程序的问题吗?可以这样做吗?

在这个程序中我觉得自己并没有用到中断。我在相关的DS1820文档中看到,使用DS1820一定要禁止任何中断产生(也不知是否必要,我在裸机上跑这个程序时根本没管)。<br />可以在temp_init()(即温度初始化程序)中添加intDisAll();(即禁止总中断)的语句吗?这样会不会也同时禁止了tick中断?
zlgmcu 发表于 2008-5-6 09:16 | 显示全部楼层

re:9楼

intDisAll()禁止中断,当然也会禁止tick中断.
zlgmcu 发表于 2008-5-6 09:20 | 显示全部楼层

RE:楼主

进入&nbsp;__intDefaultHandler&nbsp;中断函数后,请看一下中断号(状态寄存器中的ISR),就知道是产生哪个中断&nbsp;.
 楼主| 坚持梦想 发表于 2008-5-6 14:35 | 显示全部楼层

谢谢!

谢谢ZLGMCU,找到了中断号。3楼说的是对的,的确用到了中断,是我忽略了。谢谢各位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

39

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

12

主题

39

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部