打印
[ZLG-MCU]

急!请教:什么情况下会进入_intDefaultHandler死循环?

[复制链接]
3704|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
坚持梦想|  楼主 | 2008-4-29 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我将在裸机上试验的读取18B20的程序写成单任务,在ZLG发布的uCOS移植模板上添加单任务程序,编译时通过,但Debug之后,程序便在
static void __intDefaultHandler (void)
{
    while (1) {
    }
}
不断死循环。
这个函数的注释是:当处理器发生不可预测的中断时调用本函数。
之前在裸机上运行时,这个程序是通过的,而且这个程序中并没有用到中断。为什么还会进入这个死循环?
急盼赐教,谢谢!

相关帖子

沙发
jtingwang| | 2008-4-29 21:18 | 只看该作者

程序跑飞了

程序跑飞了,有可能的原因:指针没有赋值就使用;主堆栈或任务堆栈不够大

使用特权

评论回复
板凳
立体几何| | 2008-4-30 11:46 | 只看该作者

没有中断也会进入intDefaultHandler

新鲜事儿啊!程序跑飞的可能性应该不大,跑飞最多进FAULTISR也不会进intDefaultHandler,看看初始中是不是有用到其它模块,其它模块是不是定义了中断。我还是觉得模板中用到了中断可能性大一点。

使用特权

评论回复
地板
坚持梦想|  楼主 | 2008-4-30 13:06 | 只看该作者

回2楼:堆栈不够大?

怎样判断堆栈需要多大?我使用的是参考程序的堆栈设置,如下:
#define  TASK_START_STK_SIZE                50
#define  TASK_TEMP_STK_SIZE               50

使用特权

评论回复
5
坚持梦想|  楼主 | 2008-4-30 13:09 | 只看该作者

回3楼:的确没有中断

的确没有中断。我是在实验程led单任务程序上修改的。以下是我的目标板初始化代码:
void  targetInit (void)
{
 #if PLL_EN == 0                                                     SysCtlClockSet(CCLK_DIV | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | EXT_CLK);                                                            #else                                                                       SysCtlClockSet(CCLK_DIV | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | EXT_CLK); 
#endif
    tickInit(); //Initialize the uC/OS-II tick,应该不会是这个中断吧??                                                                                                                         
    temp_Init();   //温度读取初始化


void temp_Init(void)
 {
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIO口
}   

使用特权

评论回复
6
jtingwang| | 2008-4-30 15:41 | 只看该作者

我看错了,以为是FAULTISR

我看错了,以为是FAULTISR

如果是intDefaultHandler,你检查一下,中断向量表是不是对应错了,即本来是40号中断,对应到了第39或41的位置;
或者先屏蔽所有中断,然后再单单使能OS用到的时钟节拍中断。

使用特权

评论回复
7
立体几何| | 2008-4-30 16:37 | 只看该作者

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

看看中断向量表里是不是把systick的中断函数加到中断向量表了

使用特权

评论回复
8
坚持梦想|  楼主 | 2008-5-1 23:00 | 只看该作者

还有可能是其它问题吗?

确定向量表里已经添加了tickISRHandler。因为只有systick中断,所以中断向量表里没有添加其它中断函数,应该不会出现对应错误。在写程序时,主函数中已经先关闭了总中断,然后在目标板初始化时,使能时钟节拍中断。

使用特权

评论回复
9
坚持梦想|  楼主 | 2008-5-1 23:02 | 只看该作者

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

在这个程序中我觉得自己并没有用到中断。我在相关的DS1820文档中看到,使用DS1820一定要禁止任何中断产生(也不知是否必要,我在裸机上跑这个程序时根本没管)。
可以在temp_init()(即温度初始化程序)中添加intDisAll();(即禁止总中断)的语句吗?这样会不会也同时禁止了tick中断?

使用特权

评论回复
10
zlgmcu| | 2008-5-6 09:16 | 只看该作者

re:9楼

intDisAll()禁止中断,当然也会禁止tick中断.

使用特权

评论回复
11
zlgmcu| | 2008-5-6 09:20 | 只看该作者

RE:楼主

进入 __intDefaultHandler 中断函数后,请看一下中断号(状态寄存器中的ISR),就知道是产生哪个中断 .

使用特权

评论回复
12
坚持梦想|  楼主 | 2008-5-6 14:35 | 只看该作者

谢谢!

谢谢ZLGMCU,找到了中断号。3楼说的是对的,的确用到了中断,是我忽略了。谢谢各位!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

39

帖子

0

粉丝