打印
[MCU]

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

[复制链接]
3942|70
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 ...

不要怀疑这些了,没有意义的

使用特权

评论回复
5
ayb_ice| | 2018-3-28 14:18 | 只看该作者
haohaodee 发表于 2018-3-28 13:56
都认真检查了,现在是实在没有办法了。

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

现在看来,你这可能是临界代码的问题了

使用特权

评论回复
6
haohaodee|  楼主 | 2018-3-28 14:42 | 只看该作者
ayb_ice 发表于 2018-3-28 14:18
现在看来,你这可能是临界代码的问题了

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

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

所以现在就奇怪了。

使用特权

评论回复
7
ayb_ice| | 2018-3-28 14:43 | 只看该作者
haohaodee 发表于 2018-3-28 14:42
现在是裸机,没有操作系统,所以应该不存在临街代码的问题把。

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

开什么玩笑,除非你没有中断

使用特权

评论回复
8
haohaodee|  楼主 | 2018-3-28 14:46 | 只看该作者
haohaodee 发表于 2018-3-28 14:42
现在是裸机,没有操作系统,所以应该不存在临街代码的问题把。

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

这样说,只能是姿态控制的相关内存数据被改写了。
程序顺序执行,能够改写的只有中断。
我把读陀螺仪时关闭中断,读完再打开,还是不行。

使用特权

评论回复
9
haohaodee|  楼主 | 2018-3-28 15:09 | 只看该作者
ayb_ice 发表于 2018-3-28 14:43
开什么玩笑,除非你没有中断

你说的临界代码是指中断吗还是哪部分的代码?
另外,我觉的你说“不要怀疑编译脚本,没意义”很对。

使用特权

评论回复
10
haohaodee|  楼主 | 2018-3-28 15:20 | 只看该作者
ayb_ice 发表于 2018-3-28 14:43
开什么玩笑,除非你没有中断

我能想到的情况就是,有一个全局变量,在中断时被修改,就是所谓的不可重入函数。
不知道还有没有别的可能。

使用特权

评论回复
11
ayb_ice| | 2018-3-28 15:22 | 只看该作者
haohaodee 发表于 2018-3-28 15:09
你说的临界代码是指中断吗还是哪部分的代码?
另外,我觉的你说“不要怀疑编译脚本,没意义”很对。 ...

很多代码被打断可能会达不到想要结果,
一个最简单的语句i++都可能是临界代码,这取决于内核
针对这些情况需要仔细考虑

使用特权

评论回复
12
ayb_ice| | 2018-3-28 15:24 | 只看该作者
haohaodee 发表于 2018-3-28 15:20
我能想到的情况就是,有一个全局变量,在中断时被修改,就是所谓的不可重入函数。
不知道还有没有别的可 ...

这当然也要考虑了

使用特权

评论回复
13
ta1ent| | 2018-3-28 16:48 | 只看该作者
printf有延时。也许是你传感器需要稳定一段时间吧。

使用特权

评论回复
14
haohaodee|  楼主 | 2018-3-28 17:03 | 只看该作者
ta1ent 发表于 2018-3-28 16:48
printf有延时。也许是你传感器需要稳定一段时间吧。

明白,但不是这个问题。有printf时,只是启动的时候printf,以后就没有了。

使用特权

评论回复
15
haohaodee|  楼主 | 2018-3-28 17:04 | 只看该作者
是不是keil故意给**版注入的BUG。。。

使用特权

评论回复
16
haohaodee|  楼主 | 2018-3-28 19:19 | 只看该作者
我已经比较了这段代码的disassembly,只是存储位置不同而已,其他的相同。

使用特权

评论回复
17
JerryWu75| | 2018-3-28 20:43 | 只看该作者
编译器优化有没有影响?
我遇到过TI的CCS3, 开O3优化时程序直接跑死掉, O2优化就没问题.

使用特权

评论回复
18
linqing171| | 2018-3-28 21:44 | 只看该作者
haohaodee 发表于 2018-3-28 17:04
是不是keil故意给**版注入的BUG。。。

这个我给你100%的保证,不会的。

使用特权

评论回复
19
linqing171| | 2018-3-28 21:45 | 只看该作者
JerryWu75 发表于 2018-3-28 20:43
编译器优化有没有影响?
我遇到过TI的CCS3, 开O3优化时程序直接跑死掉, O2优化就没问题. ...

O3里面本来就有很多比较偏门的优化,用GCC的人很少有人敢用O3.

使用特权

评论回复
20
linqing171| | 2018-3-28 21:51 | 只看该作者
haohaodee 发表于 2018-3-28 15:20
我能想到的情况就是,有一个全局变量,在中断时被修改,就是所谓的不可重入函数。
不知道还有没有别的可 ...

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

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

使用特权

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

本版积分规则

3

主题

80

帖子

0

粉丝