打印
[AVR单片机]

请教AVR Studio+GCC 的代码优化的问题 急

[复制链接]
7887|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
KaiXuan|  楼主 | 2010-12-12 02:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在mega8A项目中有一个读取SHT10温湿度传感器的功能,优化设置里-00能正常工作,但是代码体积变得比较庞大,以致影响后面的继续编程。使用-0s虽然体积小了但是SHT10不能正常工作了。即使在SHT10的代码中把所有的变量都加上volatile也无济于事,实在是不解呀,我刚刚接触AVR的时间不长而这个项目又比较急,都快抓狂了呵呵
现把代码附上 希望有高手帮忙修改指点。我刚来这个论坛时间不长分数只能是0-50,所以只能50了。先谢谢各位了。
AVR.rar (72.4 KB)

相关帖子

沙发
airwill| | 2010-12-12 08:36 | 只看该作者
通常体积优化 os 后, 必然导致执行时间的延长. 而要导致硬件不能工作, 很有可能出现了时序上的问题. 所以可以可以先通过用示波器检查时序来定位哪里出现了问题.

我看你的编译结果. 发现 init 里面的好几个函数编译有错误.
不过在我的 gccavr 3.4.5 (20060421版) 却没有发现编译错误. 不知道你是那个版本的.

使用特权

评论回复
板凳
KaiXuan|  楼主 | 2010-12-12 09:02 | 只看该作者
本帖最后由 KaiXuan 于 2010-12-12 09:10 编辑

我用的是AVR Studio 4.18和WinAVR-20100110,不管开启不开启优化都没有发现编译错误。另外优化后没感觉执行时间变长反而好像变短了。

使用特权

评论回复
地板
airwill| | 2010-12-12 09:13 | 只看该作者
没有报告错误吗?  我只是从编译生成的文件看, 发现那几个函数不应该那样编译.

你不妨下载个 我说的那个版本试试, 这样兴许会快些, 而且我那个版本的代码空间可能更小, 我这里编译出来的代码空间是 5444 bytes

使用特权

评论回复
5
KaiXuan|  楼主 | 2010-12-12 09:23 | 只看该作者
我这就下载试验

使用特权

评论回复
6
airwill| | 2010-12-12 09:27 | 只看该作者
或者你可以下载智峰软件工作室简介(www.zhifengsoft.com) 的 AVRGCCIDE 2.05

这是个非常精练的包含了 gccavr 3.4.5 的集成 IDE, 我已经用了好多年了

使用特权

评论回复
7
KaiXuan|  楼主 | 2010-12-12 09:41 | 只看该作者
嗯经验之谈 非常感谢
我先一个一个的来试验,有结果通知您

使用特权

评论回复
8
KaiXuan|  楼主 | 2010-12-12 18:46 | 只看该作者
使用 AVRGCCIDE 2.05 设置各种优化级别,SHT.c文件内的所有变量都加上volatile也未见有效,似乎某些循环类的语句被优化了,但并不是空循环不应该了呀

使用特权

评论回复
9
airwill| | 2010-12-12 20:45 | 只看该作者
你可以打开 .LSS  文件看看, 那些函数都是怎么编译的, 然后修改源程序, 看看编译的变化

使用特权

评论回复
10
john_lee| | 2010-12-12 20:47 | 只看该作者
代码中最大的问题是那个自定义的_nop_函数,在不优化时,每次循环耗时大约20个周期,而优化后,每次循环只耗时大约4个周期,可能达不到希望的延时时间。

另外,TWI的速率计算也有问题,我看你定义的F_CPU为11059200,TWI希望的速率为400K,而计算出的TWBR为5,但用5这个值会导致TWI速率超过400K。

还有,代码太乱,不符合规范的地方太多,例如:你既然用了AVR Studio作为项目管理,那么F_CPU就不要自己在代码中定义,而要使用AVR Studio的设置。

另外,浮点数最好不要使用,那东西巨占空间。

使用特权

评论回复
11
KaiXuan|  楼主 | 2010-12-12 23:21 | 只看该作者
嗯 DHT10的代码是来自官方例程单独模拟的I2c。TWI总线是给CH452使用的,语言全靠自学没人指点缺乏经验呵呵。以前一直使用51了。如果这次不行也只能换其它型号的传感器了。至于提到的浮点数算法也是来自DHT10的官方例程,我学历太低面对这个算法想要去掉浮点数实在太困难了。
这是DHT1系列的官方驱动有兴趣的朋友看看吧
SHT1xx驱动.pdf (173.48 KB)

使用特权

评论回复
12
airwill| | 2010-12-14 07:27 | 只看该作者
这代码写得还挺规范. 学历低没有关系, 学历并不等于能力哦.

我使用 AVRGCCIDE 2.05 设置OS 编译, 至少 _nop_ 函数正常执行了.
你查一下编译报告里说明的编译器版本, 另外, 这个带 "_" 开头的函数会不会跟 c 的内部函数有冲突, 改名试试, 我平时都避免这样起函数名

使用特权

评论回复
13
KaiXuan|  楼主 | 2010-12-15 21:55 | 只看该作者
问题找到了,-0s一切正常
之前的代码如下
DATA1;
SCK1;
DATAin;
error=(PINC&(1<<PC1))>>1;                                         
SCK0;
修改后的代码如下
DATA1;
DATAin;
nop(de);       
SCK1;
error=(PINC&(1<<PC1))>>1;                                         
SCK0;
估计是优化后运行效率提高了导致PINC没有及时响应DATAin; 没能读出数据(个人愚见)
感谢airwill AVRGCCIDE 2.05很好用,同时也知道了.LSS这个文件呵呵。还有代码凡是有"_" 开头的函数或变量都改掉了也未发现变化。

使用特权

评论回复
14
evenness| | 2013-6-20 17:56 | 只看该作者
谢谢,凯旋,今天我也遇到类似的问题:使用-OS选项,delay正常,但输入不对,因此我在输入之前加:__nop__(50),问题解决了,再次感谢!!祝你生活愉快!
另外我的主频为7.3728MHz,nop大约是0.1356*50=6.78us

使用特权

评论回复
评论
SD10A 2015-11-27 19:17 回复TA
NOP 有多久有哪个软件怎么看到? 
15
magusic| | 2015-11-27 18:56 | 只看该作者
请问avrgccide现在哪里有下载?

使用特权

评论回复
16
ccxlslr| | 2015-11-30 12:39 | 只看该作者
本帖最后由 ccxlslr 于 2015-11-30 12:46 编辑
KaiXuan 发表于 2010-12-15 21:55
问题找到了,-0s一切正常
之前的代码如下
DATA1;

这是IO同步问题,在改变IO方向后,数据不能马上读出。要等一段时间,等待同步。这个时间最大为1个半时钟同期。这看似与优化有关。其实是时序设计问题。就算可以上读出。也可能因为操作,在导线较长时,也可能导致电平不稳。这个与单片机无关。

不知道你频率多少,如果过快,接几米线,你就会发现不工作了。只是这个刚好介于开启优化,不工作,不开能工作。所以会让你误解以为编译器的问题。

使用特权

评论回复
17
jinxiang1981| | 2016-3-6 22:22 | 只看该作者
ccxlslr 发表于 2015-11-30 12:39
这是IO同步问题,在改变IO方向后,数据不能马上读出。要等一段时间,等待同步。这个时间最大为1个半时钟同 ...

说的太好了  !!!     加一点延时  我的问题也解决了   :victory:@ccxlslr

使用特权

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

本版积分规则

0

主题

14

帖子

0

粉丝