智能车制作

标题: he mother's !what the fuck problem. [打印本页]

作者: 尕玍紿    时间: 2014-3-8 09:55
标题: he mother's !what the fuck problem.
加了个函数...还没调用它,怎么就会让原来没问题的程序运行时死机呢?
这可能是什么原因?求老鸟,指条明路...
(内容看起来长,其实不长的,愿有心人给些建议,谢谢!)
问题奇葩到我不知道怎么说,抽象而简单的说是这样的:
原来的程序:
void main(void)
{
   if(flag1){
      ...
   }
   if(flag2){
     ...
  }
}
编译没问题,运行也正常!

在原来基础上加个函数:
void fun (void);
void main (void)
{
    if(flag1){
       ...
    }
    if(flag2){
      ...
   }
   fun(); //调用这个新实现的函数   
}
void fun (void)
{
   ...;
}
加了这个函数后,程序编译没问题,可是运行会死机...
这也不奇葩,也许我新写的函数有问题...不过后面的情况让我很想不开:

检查我新写的函数两天后,我实在没思路了,
就想是不是问题不是出在新函数上,而是在原有函数上。
于是我注释掉了调用新函数的语句,即不调用新写的函数,来检查原有的函数有没有问题,代码更改如下:
void fun (void);
void main (void)
{
    if(flag1){
       ...
    }
    if(flag2){
      ...
   }
   //fun(); //没改动其他的,就注释掉了这句。  
}
void fun (void)
{
   ...;
}
编译通过...可是运行会死机!诶,之前没问题的,怎么死机了呢?难道是我改的时候误操作了?
于是把之前备份的原有工程拿出来对比,没发现有误改的地方啊,分别测试原有的和现有的两个工程,
原有工程还是正常的,新的依旧会死机...这就怪了——虽然我添加了一个新的函数,但我都没调用,怎么就会引起死机呢???????进一步验证我修改中没误操作:我又做了以下修改(注释掉新写的函数)
//void fun (void);  //注释掉函数声明
void main (void)
{
    if(flag1){
       ...
    }
    if(flag2){
      ...
   }
   //fun(); //注释掉 调用语句。  
}
/*注释掉函数实体
void fun (void)
{
   ...;
}*/
再次编译没问题..运行也没死机!也就是说我没有误操作了。
这就怪了...怎么会这样呢??加了个函数...还没调用它呢,怎么就会让原来没问题的程序运行时死机了呢?

仁者见仁智者见智,都给点思路 / 建议 吧...






作者: 尕玍紿    时间: 2014-3-8 10:17
自己分析:对比前后的改动:“加了个函数,没调用就死机了”推出:没调用,不可能影响到程序的运行,难道是加了个函数造成了内存溢出,从而导致死机?印象中应该不会啊,没被调用的函数,只会被汇编成.o文件,不会被编译成目标代码(.hex)的,即烧写进单片机里的内容是不变的啊!自己查了下.map的情况:
  5 126  bytes of readonly  code memory
        60  bytes of readwrite code memory
   1 310  bytes of readonly  data memory
  17 929  bytes of readwrite data memory
不调用新函数的情况下,不管函数实体注释掉与否,code和data的量是不改变的...
而且,就算调用上新的函数,增大的量也不会超出容量啊...
我用的是K60:flash512_ram128

bulid文件夹下的release文件里的:.hex文件18KB
作者: majorfog    时间: 2014-3-14 00:39
这种情况真没见过,debug一下看看死在哪个位置
作者: 尕玍紿    时间: 2014-3-14 10:26
majorfog 发表于 2014-3-14 00:39
这种情况真没见过,debug一下看看死在哪个位置

DEBUG过了,发现了个问题,可是依旧不知道怎么解决...
main中的其中一个if(flag)的flag异常了。而且异得很长...flag 我定义是u8 (unsigend char)无符号字符型。对他的操作只有赋值 0 、1或 2。可是调试的时候,死机时我观察该flag 的值,发现值竟然为256(8bit,最大值也就255啊!),窗口显示的类型始终显示的也是int型。不清楚是什么原因造成了,这个值的异常。能给点意见吗?

作者: majorfog    时间: 2014-3-14 19:20
标题: RE: he mother's !what the fuck problem.
尕玍紿 发表于 2014-3-14 10:26
DEBUG过了,发现了个问题,可是依旧不知道怎么解决...
main中的其中一个if(flag)的flag异常了。而且异 ...

你把这个变量声明成易变型的试试
作者: 尕玍紿    时间: 2014-3-16 19:53
我已经声明成 易变性的了!!
中断中会访问的变量 我都有这么做的。
作者: zhangqingpei    时间: 2014-3-18 17:42
表示不懂啊大婶们




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2