[STM32]

指针使用不当,会造成很奇怪的问题,大家注意

[复制链接]
楼主: haohaodee
手机看帖
扫描二维码
随时随地手机跟帖
haohaodee|  楼主 | 2018-3-21 23:48 | 显示全部楼层
linqing171 发表于 2018-3-21 21:48
反汇编不全,后面还有文字池,再弄十个字节。
不过看这部分,应该没有什么问题。 ...



uint8_t control_get_mode()
{       
        return control_mode;
}


反汇编:

0x08007942 2000      DCW      0x2000
   148:         return control_mode;
0x08007944 4801      LDR      r0,[pc,#4]  ; @0x0800794C
0x08007946 7800      LDRB     r0,[r0,#0x00]
   149: }
0x08007948 4770      BX       lr
0x0800794A 0000      DCW      0x0000
0x0800794C 01B0      DCW      0x01B0
0x0800794E 2000      DCW      0x2000
    17:         return true;
0x08007950 2001      MOVS     r0,#0x01
    18: }
    19:  

使用特权

评论回复
haohaodee|  楼主 | 2018-3-21 23:51 | 显示全部楼层
现在不是只这里会引起问题,即使这里注释掉if里面的,飞机飞稳了;
此时如果再修改别的地方,多一句或者少一句不影响飞行的代码,飞机又会变抖。

使用特权

评论回复
ayb_ice| | 2018-3-22 08:38 | 显示全部楼层
反汇编一般是不会有问题的,都是源代码引起的,特别是指针,数组,强制转换等引起的

使用特权

评论回复
haohaodee|  楼主 | 2018-3-22 10:24 | 显示全部楼层
本帖最后由 haohaodee 于 2018-3-22 10:25 编辑
ayb_ice 发表于 2018-3-22 08:38
反汇编一般是不会有问题的,都是源代码引起的,特别是指针,数组,强制转换等引起的 ...

我昨天把所有的数组指针检查了一遍。。。还是没搞定。。。

使用特权

评论回复
ayb_ice| | 2018-3-22 10:33 | 显示全部楼层
haohaodee 发表于 2018-3-22 10:24
我昨天把所有的数组指针检查了一遍。。。还是没搞定。。。

有些BUG是很难搞的,正常,只能多测试,多观察,多怀疑,多求证了

使用特权

评论回复
haohaodee|  楼主 | 2018-3-22 10:39 | 显示全部楼层
ayb_ice 发表于 2018-3-22 10:33
有些BUG是很难搞的,正常,只能多测试,多观察,多怀疑,多求证了

现在我们有这个线索,多家那一行和不加那一行的问题,最好是有能力从这里入手。

使用特权

评论回复
一周一天班| | 2018-3-22 11:16 | 显示全部楼层
把u8变量改为32,u8和常数比较在arm是有bug。arm变量不应该定义为u8

使用特权

评论回复
haohaodee|  楼主 | 2018-3-22 11:32 | 显示全部楼层
一周一天班 发表于 2018-3-22 11:16
把u8变量改为32,u8和常数比较在arm是有bug。arm变量不应该定义为u8

谢谢啦。
但是貌似跟条件判断没关系。我写成if(true),飞机就抖动;如果改成if(false),飞机就稳了。我也打印过两个的比较值,是没问题的。

使用特权

评论回复
ayb_ice| | 2018-3-22 11:33 | 显示全部楼层
haohaodee 发表于 2018-3-22 10:39
现在我们有这个线索,多家那一行和不加那一行的问题,最好是有能力从这里入手。 ...

这个只是现象,本质应该是引起代码位置发生变化,
可能是变量对齐的问题

使用特权

评论回复
haohaodee|  楼主 | 2018-3-22 11:35 | 显示全部楼层
ayb_ice 发表于 2018-3-22 11:33
这个只是现象,本质应该是引起代码位置发生变化,
可能是变量对齐的问题 ...

是啊,所以有没有技术手段能够分析。
比如比较.map,.hex,看代码位置的变化。
我现在还搞不懂,你有没有建议啊。

使用特权

评论回复
雪山飞狐D| | 2018-3-22 12:47 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2018-3-22 12:50 编辑

有浮点数的地方你不开编译优化试试,浮点数有可能会出现极大数和极小数细分精度不够和舍弃的问题,或者或者自己修改成定点模式,我感觉是这个地方出了问题

使用特权

评论回复
ayb_ice| | 2018-3-22 13:00 | 显示全部楼层
haohaodee 发表于 2018-3-22 11:35
是啊,所以有没有技术手段能够分析。
比如比较.map,.hex,看代码位置的变化。
我现在还搞不懂,你有没有 ...

还有可能是函数不重入引起的

使用特权

评论回复
haohaodee|  楼主 | 2018-3-22 14:52 | 显示全部楼层
本帖最后由 haohaodee 于 2018-3-22 16:14 编辑
ayb_ice 发表于 2018-3-22 13:00
还有可能是函数不重入引起的

很可能是这个原因,我就是对这里没信心。
主要是怎样取串口收到的数据,然后解帧。目前使用的方法是另开一个buff_1[],然后memcpy()串口的buff_0,之后对buff_1[]进行解帧。
有没有别的机制?求建议。。。

使用特权

评论回复
ayb_ice| | 2018-3-22 16:23 | 显示全部楼层
haohaodee 发表于 2018-3-22 14:52
很可能是这个原因,我就是对这里没信心。
主要是怎样取串口收到的数据,然后解帧。目前使用的方法是另开一 ...

用队列处理

使用特权

评论回复
haohaodee|  楼主 | 2018-3-22 17:45 | 显示全部楼层

很可能不是这个问题,这个只会引起随机的问题,但是稳的那个代码一直会稳。

使用特权

评论回复
sc1884| | 2018-3-22 19:31 | 显示全部楼层
关注一下

使用特权

评论回复
苏山人家| | 2018-3-22 20:13 | 显示全部楼层
楼主可以排查
1.清除所有编译中间文件,也就是.o和.i文件在再测试
2.楼主说的不影响姿态的代码,也会造成这些问题,那可以怀疑是不是堆栈溢出,这个可以在好的代码上面增加一些堆申请,或者函数里面增加一点点栈消耗,看看能不能弄坏
3.除非如楼上各位所有,类型使用不当造成的精度或者编码错误,keil编译器是不会造成逻辑错误的
4.可以排查一下是否和优化级别有关系

使用特权

评论回复
haohaodee|  楼主 | 2018-3-22 21:41 | 显示全部楼层
苏山人家 发表于 2018-3-22 20:13
楼主可以排查
1.清除所有编译中间文件,也就是.o和.i文件在再测试
2.楼主说的不影响姿态的代码,也会造成这 ...

感谢苏山。
1. 所有编译生成的中间文件都在obj文件夹中,尝试过全部clean了,还是不行。
2. 程序中有一个malloc()函数,开的堆足够这个malloc()使用,还有别的需要堆空间吗?我试试增大堆成不;另外,我尝试了增大和减小栈空间,都不行。
3. 我再仔细排查一下。
4. 有一次,不记是开了one ELF per Function还是关了,就可以了。

使用特权

评论回复
haohaodee|  楼主 | 2018-3-22 22:21 | 显示全部楼层
生成的image,有if,所在的函数size大了64个字节,他之后的函数,地址向后顺延了64个字节,飞机就不稳了。

3.PNG

使用特权

评论回复
linqing171| | 2018-3-22 23:33 | 显示全部楼层
haohaodee 发表于 2018-3-21 23:48
uint8_t control_get_mode()
{       
        return control_mode;

看反汇编没有问题。
DCW 0x0000   是填充,没有用处,代码对齐用的。
DCW 0x01B0
DCW 0x2000
这两句表示U8类型的变量 control_mode 分配在0x200001B0, 使用LDRB r0,[r0,#00] 来访问,没有任何问题。不用改成U32.

你的MCU的浮点运算是硬件的么? 支持双线程吗? 你现在的浮点数的比较和运算是在中断里面了吗?

感觉像是你定义了个全局数组,用的时候越界使用了,随机的被访问越界了。把隔壁的功能给弄乱了。
又或者函数指针的参数类型传错了之类的。
对付这种问题我都是用自己做的工具,整理hex,对比不同点。单独看map文件,不排序的话,还是难以看出来的。即使你加了SRC链接指令,不生成hex而生成反汇编,比起来也要对比好久,不如直接对比hex来的快。

使用特权

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

本版积分规则