打印
[STM32]

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

[复制链接]
楼主: haohaodee
手机看帖
扫描二维码
随时随地手机跟帖
21
keil4比keil5好一点,keil5不是太给力

使用特权

评论回复
22
haohaodee|  楼主 | 2018-3-20 11:55 | 只看该作者
ayb_ice 发表于 2018-3-20 11:27
也可能堆栈出问题了

堆栈有什么问题,我改大试了也不行

使用特权

评论回复
23
haohaodee|  楼主 | 2018-3-20 11:58 | 只看该作者
ayb_ice 发表于 2018-3-20 11:27
也可能堆栈出问题了

堆栈有什么问题呀,我改大了堆栈也不行

使用特权

评论回复
24
haohaodee|  楼主 | 2018-3-20 12:00 | 只看该作者
我现在比较在比较两种情况下生成的.map文件,还不确定怎么分析

使用特权

评论回复
25
linqing171| | 2018-3-20 21:43 | 只看该作者
haohaodee 发表于 2018-3-20 00:15
我找了另一台电脑的KEIL编译,相同的有if(control_get_mode() == MODE_LAND)这一句,但飞机飞稳了,反汇编 ...

MODE_LAND这个宏没有问题。  CMP      r0,#0x03 ,这里的3就是这个宏。
不过看你的两个电脑的版本,差4个字节,先自己做个软件整理一下hex,按地址排列,然后用beyound compare比一下hex,看看差在哪个地方多出来的四个字节。对应着map文件看看是哪个地方不同了。
control_get_mode 函数的反汇编有吗?

不过看起来还是感觉是其它的原因。
好的hex和不好的hex反复交叉测试过吗?确认不是其它的偶然操作因素?

使用特权

评论回复
26
haohaodee|  楼主 | 2018-3-21 00:01 | 只看该作者
linqing171 发表于 2018-3-20 21:43
MODE_LAND这个宏没有问题。  CMP      r0,#0x03 ,这里的3就是这个宏。
不过看你的两个电脑的版本,差4个 ...

好主意,比较hex。我明天上control_mode_get()的反汇编。
目前我比较.map,发现是他们所在的函数,有了判断的代码的函数在flash中的地址比没有判断的代码整个向后推移了72个字节,就造成飞的不稳了。

使用特权

评论回复
27
haohaodee|  楼主 | 2018-3-21 00:01 | 只看该作者
本帖最后由 haohaodee 于 2018-3-22 10:45 编辑
linqing171 发表于 2018-3-20 21:43
MODE_LAND这个宏没有问题。  CMP      r0,#0x03 ,这里的3就是这个宏。
不过看你的两个电脑的版本,差4个 ...

好的hex和不好的hex反复测试过,好的一直都好,每次烧进去都好,不好的也一直不好。确认不是偶然因素造成的。
即使是那个在另一台电脑编译可以的,如果再改了程序其他不影响飞行的地方,也会使飞行变得不稳。
所以现在很随机。
我怀疑是修改了程序,导致某些代码在flash中的位置发生移动,就会出现这样的问题。

使用特权

评论回复
28
cooldog123pp| | 2018-3-21 09:27 | 只看该作者
就服你这种,我还有同事经常怀疑微软有bug,反正bug都是别人的,对么。

使用特权

评论回复
29
619888476| | 2018-3-21 13:44 | 只看该作者
把工程删了,重新建,再试试喃

使用特权

评论回复
30
m564522634| | 2018-3-21 14:12 | 只看该作者
不是keil的问题,你的代码的问题了。 自己检察下堆栈覆盖之类的变量有没有被改变

使用特权

评论回复
31
haohaodee|  楼主 | 2018-3-21 14:44 | 只看该作者
haohaodee 发表于 2018-3-21 00:01
好的hex和不好的hex反复测试过,好的一直都好,每次烧进去都好,不好的也一直不好。确认不是偶然因素造成 ...

control_mode_get()的反汇编:  

149:         return control_mode;
0x08007948 4801      LDR      r0,[pc,#4]  ; @0x08007950
0x0800794A 7800      LDRB     r0,[r0,#0x00]

先谢谢大家的建议,自己努力排查中。

使用特权

评论回复
32
haohaodee|  楼主 | 2018-3-21 15:49 | 只看该作者
本帖最后由 haohaodee 于 2018-3-21 16:15 编辑



有那一句比没那一句,所在的文件data段多了4个字节,就变抖了

hex的差别相差很大,我还看不出眉目

debug1.PNG (16.61 KB )

debug1.PNG

使用特权

评论回复
33
haohaodee|  楼主 | 2018-3-21 16:19 | 只看该作者
linqing171 发表于 2018-3-20 21:43
MODE_LAND这个宏没有问题。  CMP      r0,#0x03 ,这里的3就是这个宏。
不过看你的两个电脑的版本,差4个 ...

你说的4个字节和我说的data段多出来的4个字节是不是可能是一回事。

现在把排查目标锁定到多出来的这4个字节上?

使用特权

评论回复
34
li880wert| | 2018-3-21 16:48 | 只看该作者
看下数组或是变量有没对齐问题,一般裸机情况 很少会有这种对齐问题,除非你用了大数组。

使用特权

评论回复
35
haohaodee|  楼主 | 2018-3-21 17:14 | 只看该作者
li880wert 发表于 2018-3-21 16:48
看下数组或是变量有没对齐问题,一般裸机情况 很少会有这种对齐问题,除非你用了大数组。 ...

你说的对齐具体是指哪种情况啊如果飞稳了,我各种飞行基本都是正常的

使用特权

评论回复
36
一周一天班| | 2018-3-21 18:38 | 只看该作者
把u8变量改为u32

使用特权

评论回复
37
水动风凉| | 2018-3-21 21:47 | 只看该作者

使用特权

评论回复
38
linqing171| | 2018-3-21 21:48 | 只看该作者
haohaodee 发表于 2018-3-21 14:44
control_mode_get()的反汇编:  

149:         return control_mode;

反汇编不全,后面还有文字池,再弄十个字节。
不过看这部分,应该没有什么问题。

使用特权

评论回复
39
linqing171| | 2018-3-21 21:48 | 只看该作者

LDRB指令可以为任意地址,奇数偶数都可以,神马地址都可以按字节寻址。

使用特权

评论回复
40
一周一天班| | 2018-3-21 22:02 | 只看该作者
本帖最后由 一周一天班 于 2018-3-21 22:05 编辑

  

使用特权

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

本版积分规则