程序运行到一个 子函数里面,总是莫名其妙的复位
我用的C8051,定时器3中断之后,关了总中断,运行子函数,包括一些比较复杂的算式,要循环好多次,完成之后再开总中断,可是总是循环2次就复位了,看门狗是关着的。 找不出原因来了{:cry:}。 运行到第二个图22行i=2之后,执行不到i=3 就跑到主函数里面的第一句了 可以打印流程中信息看有没规律 栈太小了溢出? NJ8888 发表于 2016-5-21 11:39可以打印流程中信息看有没规律
一步一步执行着看,规律是有的。要是屏蔽 了38,39,40,41 行,就不跳到主函数了。我不知道如何打印流程 1988_coolboy 发表于 2016-5-21 11:43
一步一步执行着看,规律是有的。要是屏蔽 了38,39,40,41 行,就不跳到主函数了。我不知道如何打印流程 ...
忘了,你是C8051,能单步调试,那就不用打印,单步看如何出错的就可以了 bangbangji 发表于 2016-5-21 11:41
栈太小了溢出?
怎么知道是不是溢出了? 中断里面尽量不要做复杂的运算。
特别还有浮点数。 数组越界? 楼主.. 是不是你的硬件问题. 你在电源两端加个1000uF的电容试试.
当初我也是. 只要运行到某一个程序,单片机就重启了.
发现... 原来是电源波动的厉害了. 你这里面的FFT 是控制了很多的LED 造成电流不够? 电源拉低.单片机重启?
难道真的是这样.我们拭目以待... 哈 本帖最后由 1988_coolboy 于 2016-5-21 13:19 编辑
sweet_136 发表于 2016-5-21 13:09
楼主.. 是不是你的硬件问题. 你在电源两端加个1000uF的电容试试.
当初我也是. 只要运行到某一个程序,单片 ...
没有LED,就单纯计算一下的。我用示波器了下电源,没有大波动,挺稳定的。 1988_coolboy 发表于 2016-5-21 11:47
怎么知道是不是溢出了?
单步运行,同时观察SP 中断程序中调用子程序,一个子程序那么多层,单片机受得了吗,最好还是把大程序分成一个个的功能块. 一个float4字节,64x4=256,单片机在函数里开这么大的数组,很危险的用法哦,把那个数组挪到全局变量里吧 zouzhichao 发表于 2016-5-21 15:36
一个float4字节,64x4=256,单片机在函数里开这么大的数组,很危险的用法哦,把那个数组挪到全局变量里吧 ...
恐怕早就溢出鸟。 浮点计算是不可重入的,楼主你在主循环里是不是也有浮点运算 等式太长,需要大量堆栈.堆栈溢出.如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+=......;试试. 在程序能运行的情况下,最好只留下有问题的部分一步一步的试,应该能查出问题的。 当调到fft()函数里面去之后,SP的值是0x32,一直不变的。我把4*64的变量去掉了,算式也分开了,还是总跳回主函数。 中断中在需要计算FFT的地方做过标记,然后把FFT计算放到主函数中计算。
另外检查一下中断程序中DPTR进栈保护了没 标记一下,期待真正原因。 是不是被优化了 程序跑乱巨大的可能是变量初始化,有没有没有初始化的字符串数组,定义了没有使用的变量,对数组的引用超过数组设计长度。 在线仿真看看对应汇编,在出错的时候,对应的几句有没有问题 1988_coolboy 发表于 2016-5-21 11:38
运行到第二个图22行i=2之后,执行不到i=3 就跑到主函数里面的第一句了
看看数组的下标计算是不是有溢出的,你的数组的下标是计算产生的,计算的结果可能超过数组范围了,单步跟踪一下就知道了 编译时的code optimization 改成Level 6了,不跳回函数了 。这样靠谱吗?会不会下次编译又出错了?
页:
[1]