1988_coolboy 发表于 2016-5-21 11:36:08

程序运行到一个 子函数里面,总是莫名其妙的复位

我用的C8051,定时器3中断之后,关了总中断,运行子函数,包括一些比较复杂的算式,要循环好多次,完成之后再开总中断,可是总是循环2次就复位了,看门狗是关着的。 找不出原因来了{:cry:}。

1988_coolboy 发表于 2016-5-21 11:38:32

运行到第二个图22行i=2之后,执行不到i=3 就跑到主函数里面的第一句了

NJ8888 发表于 2016-5-21 11:39:38

可以打印流程中信息看有没规律

bangbangji 发表于 2016-5-21 11:41:08

栈太小了溢出?

1988_coolboy 发表于 2016-5-21 11:43:02

NJ8888 发表于 2016-5-21 11:39
可以打印流程中信息看有没规律

一步一步执行着看,规律是有的。要是屏蔽 了38,39,40,41 行,就不跳到主函数了。我不知道如何打印流程

NJ8888 发表于 2016-5-21 11:46:41

1988_coolboy 发表于 2016-5-21 11:43
一步一步执行着看,规律是有的。要是屏蔽 了38,39,40,41 行,就不跳到主函数了。我不知道如何打印流程 ...

忘了,你是C8051,能单步调试,那就不用打印,单步看如何出错的就可以了

1988_coolboy 发表于 2016-5-21 11:47:49

bangbangji 发表于 2016-5-21 11:41
栈太小了溢出?

怎么知道是不是溢出了?

xy-mcu 发表于 2016-5-21 12:13:06

中断里面尽量不要做复杂的运算。
特别还有浮点数。

w282529350 发表于 2016-5-21 12:40:16

数组越界?

sweet_136 发表于 2016-5-21 13:09:42

楼主.. 是不是你的硬件问题. 你在电源两端加个1000uF的电容试试.

当初我也是. 只要运行到某一个程序,单片机就重启了.

发现... 原来是电源波动的厉害了. 你这里面的FFT 是控制了很多的LED 造成电流不够? 电源拉低.单片机重启?

难道真的是这样.我们拭目以待... 哈

1988_coolboy 发表于 2016-5-21 13:17:52

本帖最后由 1988_coolboy 于 2016-5-21 13:19 编辑

sweet_136 发表于 2016-5-21 13:09
楼主.. 是不是你的硬件问题. 你在电源两端加个1000uF的电容试试.

当初我也是. 只要运行到某一个程序,单片 ...

没有LED,就单纯计算一下的。我用示波器了下电源,没有大波动,挺稳定的。

agilityChen 发表于 2016-5-21 15:02:45

1988_coolboy 发表于 2016-5-21 11:47
怎么知道是不是溢出了?

单步运行,同时观察SP

2avr 发表于 2016-5-21 15:16:11

中断程序中调用子程序,一个子程序那么多层,单片机受得了吗,最好还是把大程序分成一个个的功能块.

zouzhichao 发表于 2016-5-21 15:36:36

一个float4字节,64x4=256,单片机在函数里开这么大的数组,很危险的用法哦,把那个数组挪到全局变量里吧

wye11083 发表于 2016-5-21 20:14:04

zouzhichao 发表于 2016-5-21 15:36
一个float4字节,64x4=256,单片机在函数里开这么大的数组,很危险的用法哦,把那个数组挪到全局变量里吧 ...

恐怕早就溢出鸟。

yangsen 发表于 2016-5-21 20:20:29

浮点计算是不可重入的,楼主你在主循环里是不是也有浮点运算

pengshicao 发表于 2016-5-22 09:15:54

等式太长,需要大量堆栈.堆栈溢出.如a=b*c+d*e+f*g+h*l+m*n+....;
改成:a=b*c;a+=d*e;a+=f*g;a+=h*l;a+=m*n;a+=......;试试.

MCUStudent 发表于 2016-5-22 20:24:44

在程序能运行的情况下,最好只留下有问题的部分一步一步的试,应该能查出问题的。

1988_coolboy 发表于 2016-5-23 10:10:37

当调到fft()函数里面去之后,SP的值是0x32,一直不变的。我把4*64的变量去掉了,算式也分开了,还是总跳回主函数。

modbus 发表于 2016-5-23 10:36:20

中断中在需要计算FFT的地方做过标记,然后把FFT计算放到主函数中计算。
另外检查一下中断程序中DPTR进栈保护了没

y1z2f4 发表于 2016-5-23 11:24:17

标记一下,期待真正原因。

fghfguytu 发表于 2016-5-23 11:27:00

是不是被优化了

zyqcome 发表于 2016-5-23 12:51:51

程序跑乱巨大的可能是变量初始化,有没有没有初始化的字符串数组,定义了没有使用的变量,对数组的引用超过数组设计长度。

zyqcome 发表于 2016-5-23 12:53:31

在线仿真看看对应汇编,在出错的时候,对应的几句有没有问题

albert.hu 发表于 2016-5-23 13:12:21

1988_coolboy 发表于 2016-5-21 11:38
运行到第二个图22行i=2之后,执行不到i=3 就跑到主函数里面的第一句了

看看数组的下标计算是不是有溢出的,你的数组的下标是计算产生的,计算的结果可能超过数组范围了,单步跟踪一下就知道了

1988_coolboy 发表于 2016-5-23 13:39:15

编译时的code optimization 改成Level 6了,不跳回函数了 。这样靠谱吗?会不会下次编译又出错了?
页: [1]
查看完整版本: 程序运行到一个 子函数里面,总是莫名其妙的复位