[MCU] 真诚求助,求建议,奇怪的问题

[复制链接]
 楼主| haohaodee 发表于 2018-3-28 12:33 | 显示全部楼层 |阅读模式
本帖最后由 haohaodee 于 2018-3-28 12:48 编辑

上次发帖“指针使用不当,会造成很奇怪的问题,大家注意”,本以为问题解决了,实际仍然没有解决,再次求大家建议。https://bbs.21ic.com/icview-2489572-1-1.html?fromuid=1912616



问题描述:
在keil v5.23环境下做的四轴飞行器飞控,如果增减一些无关代码,飞机的飞行效果变化很大。


例如,在进入主飞控程序之前,增加一些打印输出,如“printf("welcome\r\n");printf...”,飞机飞的很稳;
如果把这些printf删掉,飞机就会变得很抖。
同理,楼主测试了在程序的其他位置增减一些无用的本不影响飞行的代码(不一定含有printf,可以只是一些没用的if..else...或者其他),飞机也会变稳或者变抖。


目前,楼主已经对此问题进行了各种测试,都没有解决这个问题,
包括:
1. 确认了代码空间远小于flash存储空间。
2. 增减栈、堆空间。
3. 删掉编译生成的中间文件,重新编译。
4. 尝试各种优化选项。
5. 确认数组越界的可能,指针操作越界的可能。


以上尝试都没能解决。


真诚求大伙建议,在此不胜感激。
@linqing171 @ayb_ice





ayb_ice 发表于 2018-3-28 13:22 | 显示全部楼层
认真测试,认真检查,没有其它办法
 楼主| haohaodee 发表于 2018-3-28 13:56 | 显示全部楼层
ayb_ice 发表于 2018-3-28 13:22
认真测试,认真检查,没有其它办法

都认真检查了,现在是实在没有办法了。

我在想,能不能通过改写编译脚本控制重要代码和数据在flash和ram的位置,这样就能保护重要的代码和数据。
ayb_ice 发表于 2018-3-28 14:17 | 显示全部楼层
haohaodee 发表于 2018-3-28 13:56
都认真检查了,现在是实在没有办法了。

我在想,能不能通过改写编译脚本控制重要代码和数据在flash和ram ...

不要怀疑这些了,没有意义的
ayb_ice 发表于 2018-3-28 14:18 | 显示全部楼层
haohaodee 发表于 2018-3-28 13:56
都认真检查了,现在是实在没有办法了。

我在想,能不能通过改写编译脚本控制重要代码和数据在flash和ram ...

现在看来,你这可能是临界代码的问题了
 楼主| haohaodee 发表于 2018-3-28 14:42 | 显示全部楼层
ayb_ice 发表于 2018-3-28 14:18
现在看来,你这可能是临界代码的问题了

现在是裸机,没有操作系统,所以应该不存在临街代码的问题把。

说来排查问题应该也不难,飞机抖,就是姿态控制的问题。
我把控制的目标值设为定值,这样就隔离了上层代码。
现在发现输出跳动很大,引起了飞机抖动,那就是输入有问题,输入就只有陀螺仪。
我看了陀螺仪的数据没问题,尝试了对陀螺仪的各种改,也还是不行。

所以现在就奇怪了。
ayb_ice 发表于 2018-3-28 14:43 | 显示全部楼层
haohaodee 发表于 2018-3-28 14:42
现在是裸机,没有操作系统,所以应该不存在临街代码的问题把。

说来排查问题应该也不难,飞机抖,就是姿 ...

开什么玩笑,除非你没有中断
 楼主| haohaodee 发表于 2018-3-28 14:46 | 显示全部楼层
haohaodee 发表于 2018-3-28 14:42
现在是裸机,没有操作系统,所以应该不存在临街代码的问题把。

说来排查问题应该也不难,飞机抖,就是姿 ...

这样说,只能是姿态控制的相关内存数据被改写了。
程序顺序执行,能够改写的只有中断。
我把读陀螺仪时关闭中断,读完再打开,还是不行。
 楼主| haohaodee 发表于 2018-3-28 15:09 | 显示全部楼层
ayb_ice 发表于 2018-3-28 14:43
开什么玩笑,除非你没有中断

你说的临界代码是指中断吗还是哪部分的代码?
另外,我觉的你说“不要怀疑编译脚本,没意义”很对。
 楼主| haohaodee 发表于 2018-3-28 15:20 | 显示全部楼层
ayb_ice 发表于 2018-3-28 14:43
开什么玩笑,除非你没有中断

我能想到的情况就是,有一个全局变量,在中断时被修改,就是所谓的不可重入函数。
不知道还有没有别的可能。
ayb_ice 发表于 2018-3-28 15:22 | 显示全部楼层
haohaodee 发表于 2018-3-28 15:09
你说的临界代码是指中断吗还是哪部分的代码?
另外,我觉的你说“不要怀疑编译脚本,没意义”很对。 ...

很多代码被打断可能会达不到想要结果,
一个最简单的语句i++都可能是临界代码,这取决于内核
针对这些情况需要仔细考虑
ayb_ice 发表于 2018-3-28 15:24 | 显示全部楼层
haohaodee 发表于 2018-3-28 15:20
我能想到的情况就是,有一个全局变量,在中断时被修改,就是所谓的不可重入函数。
不知道还有没有别的可 ...

这当然也要考虑了
ta1ent 发表于 2018-3-28 16:48 | 显示全部楼层
printf有延时。也许是你传感器需要稳定一段时间吧。
 楼主| haohaodee 发表于 2018-3-28 17:03 | 显示全部楼层
ta1ent 发表于 2018-3-28 16:48
printf有延时。也许是你传感器需要稳定一段时间吧。

明白,但不是这个问题。有printf时,只是启动的时候printf,以后就没有了。
 楼主| haohaodee 发表于 2018-3-28 17:04 | 显示全部楼层
是不是keil故意给**版注入的BUG。。。
 楼主| haohaodee 发表于 2018-3-28 19:19 | 显示全部楼层
我已经比较了这段代码的disassembly,只是存储位置不同而已,其他的相同。
JerryWu75 发表于 2018-3-28 20:43 | 显示全部楼层
编译器优化有没有影响?
我遇到过TI的CCS3, 开O3优化时程序直接跑死掉, O2优化就没问题.
linqing171 发表于 2018-3-28 21:44 | 显示全部楼层
haohaodee 发表于 2018-3-28 17:04
是不是keil故意给**版注入的BUG。。。

这个我给你100%的保证,不会的。
linqing171 发表于 2018-3-28 21:45 | 显示全部楼层
JerryWu75 发表于 2018-3-28 20:43
编译器优化有没有影响?
我遇到过TI的CCS3, 开O3优化时程序直接跑死掉, O2优化就没问题. ...

O3里面本来就有很多比较偏门的优化,用GCC的人很少有人敢用O3.
linqing171 发表于 2018-3-28 21:51 | 显示全部楼层
haohaodee 发表于 2018-3-28 15:20
我能想到的情况就是,有一个全局变量,在中断时被修改,就是所谓的不可重入函数。
不知道还有没有别的可 ...

你用pc-lint检查你的代码了吗?
printf除了慢,还有就是耗内存也大。
看你的描述,还是像有其它函数的局部变量被你用指针传出来了,不破坏的话就没有问题,一旦破坏就不行了。
如果裸奔的话,中断里面的功能越少越好。
你的浮点运算是硬件的吗?

你的程序能记录抖动吗?或者当检测到抖动比较大的时候,把一些历史刷flash里? 你的pc机能实时监控你的这个数**算的输入和输出吗?
前两天听供应商说,大疆用他们的方案,高清视频可以传10km。你这个printf,print到天线上,电脑分析一下应该可以吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

80

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部