fushiqi 发表于 2007-11-30 00:39:18

项目进行中,但发生了两次功能增加导致FLASH不够需要更换AVR芯片,有什么解决方法?

我公司正在做一个项目,之前预研是用ATMEGA169P,但是后来发现FLASH不够用,换329P,代码用C写的,功能已经基本实现了,32K的FLASH用了31.4K,可是现在客户那边突然要求增加了功能,要将保存大量数据到外部EEPROM(内部1K不够),听到这个消息脑袋都大了,对外部EEPROM读写肯定需要很多K的空间去实现了,329P已经不可能了,想换649P,但是据说649很不好买,也问了深圳的一些代理商,连样片都搞不到,现在真的不知道该怎么办了,对汇编也不熟悉,不知道该汇编能不能省出空间,我的代码是C,编译器用GCC(WinAVR-20070525),TWI代码还没加进去,现在大概1400行左右的代码量,不知道TWI代码量会占多大?请各位帮忙分析分析,有没有什么好方法可以解决的?

以下蓝色文字由站长:armok 于:2007-11-30,09:01:18 加入。你的原标题:“<font color=black>项目危机!求助!” 不合符规定。请更改成能说明帖子大意的标题
试想一下,如果本论坛的帖子标题清一色的‘帮助!’,‘ADC求救!’等笼统的标题,你在阅读的过程中会造成许多麻烦。
所以本论坛规定:一定要起一个能说明帖子大意的标题。不允许“关于 AVR 的 ADC 使用!”这种笼统标题。作为标题,必须说明清楚:
 ①你是在请教问题,还是在介绍有关的知识?
 ②ADC的问题有许多,你是想说那方面的内容?
注意以上两点,标题应该改成如:“请教:ADC 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。
./bbs_upload/files_6/armok01122228.gif

avruser 发表于 2007-11-30 00:44:34

对外部EEPROM读写应该代码量不大
TWI也不会很大

首先还是看看你原来的代码有没有可以精简的地方吧

zhonghua_li 发表于 2007-11-30 00:45:02

32.7K-31.4K = 1.3K TWI肯定够了。
建议还是精简代码,32k 可以干不少事了。

zhuzi1441 发表于 2007-11-30 00:57:40

1400行左右代码,就有32.7K吗?并且怎么知道的这么精确?楼主不会是看的那个.hex文件吧,如果果真是的话那就嘘惊一场了,实际可不10K左右吧。

ilan2003 发表于 2007-11-30 00:59:34

程序肯定可以精简的如果用了大量的浮点运算就会占用很大的空间

ATmega32 发表于 2007-11-30 08:51:05

用IAR,最大代码优化。

suncq 发表于 2007-11-30 08:55:16

面对用户的需求变化不要自慌手脚,要冷静的分析,不要轻易的换芯片.否则会出现"加水-加面-加水"的一团糟局面.

heky 发表于 2007-11-30 09:12:51

1400行代码编译出31k的程序啊,真是佩服你了.空间小就不要用WinAVR了,用iar吧.我也只剩下1.5k空间了,最大压缩了.

fsclub 发表于 2007-11-30 09:16:59

如果你看的是HEX文件的大小,那你错了.你用网上下个小工具,把HEX转成BIN格式后,那个才是在FLASH中实际的大小.

benladn911 发表于 2007-11-30 09:34:27

1400行C代码,不太可能有 31K的程序,注意这31K你可能是直接看HEX文件的,你最好直接看WINAVR编译成功后的信息提示看看是多少。

FLASH的空间以BIN文件为准

feiyue 发表于 2007-11-30 09:39:46

1、楼主有空学习一下汇编、编译器相关的资料,在一个小范围内进一步减少代码空间总是存在可能性的。代码空间和海绵、时间以及女人的乳沟差不多,如果肯花力气总可以挤出来一点的!
2、GCC中使用-s优化;
3、改用IAR,采用空间优化。

Oliver 发表于 2007-11-30 09:45:01

烧程序时,一般软件有"编辑功能",点开看程序排到了什么地址就知道了,

我一不用浮点,就是运算控制,1000行才3K.近万行的程序我都写过,也没这么大啊

MCUAVR 发表于 2007-11-30 09:46:10

如果编译器没有显示ROM占用容量时,笨办法,把HEX文件读到编程器中可看到真实的占用容量.1400行有30K,不太可能的.

fsclub 发表于 2007-11-30 10:16:49

或者直接读到编程软件的缓存中,点"编辑",一般就能看到数据在内存中的分布,一目了然.

kent_gwk 发表于 2007-11-30 10:48:56

10楼这句经典"代码空间和海绵、时间以及女人的乳沟差不多,如果肯花力气总可以挤出来一点的! "

benladn911 发表于 2007-11-30 10:51:00

经典:“减少代码空间总是存在可能性的。代码空间和海绵、时间以及女人的乳沟差不多,如果肯花力气总可以挤出来一点的”

RedStone 发表于 2007-11-30 10:51:58

可以想法存到内部Flash里

ilan2003 发表于 2007-11-30 11:53:51

楼上的几位都实践过吗? 哈哈 ^_^

liyaofeng2000 发表于 2007-11-30 12:00:46

呵呵,采用IAR肯定没错,高质量的产品项目一定不要用免费的开发环境,至少去搞个盗版嘛!用IAR编译,采用空间最优化,最大优化级别,我相信如果对c理解稍微强一点,对avr的结构精通,编译出来的代码精炼程度绝对比一个两三年的软件工程师用汇编写的代码优化相当多。这个是经验,我对avr的编译器做过实际分析,代码简化以及复用程度是相当高的。

mig29 发表于 2007-11-30 13:06:43

对同样的功能,
首先是程序结构和算法决定了代码量,
其次才是优化的作用。

楼主应该对着汇编码看看到底是哪一块编译的效率低,改进一下写法。
如果不是使用了浮点运算和大量的数据表,1000行是不可能编译到30k的。

而浮点运算基本上都可以对应地化简成定点运算。比如要乘以pai(3.14),最简单的是乘以 314再除于100,最高效的是 乘以 201再除于64(即使你写成 /64,稍微好一点的编译器都会将它变成 >>6 来处理)。

gingin 发表于 2007-11-30 18:18:47

1.优化算法和代码
2.avr-gcc的优化不是只有-0s一个参数而已
3.除了更换有更大flash的avr芯片外,也可以外扩flash芯片,无外部总线的avr芯片可以外扩spi接口的flash芯片,可以把常数数组/设置放到那里读写。
gcc同样可以做出高质量的产品项目,关键在于使用者。

Laber 发表于 2007-11-30 18:29:43

代码空间和海绵、时间以及女人的乳沟差不多,如果肯花力气总可以挤出来一点的!
-------技术性总结!

bozai 发表于 2007-11-30 18:43:28

1000多行30多k有问题的,估计被人说中了,错把hex大小看成程序大小,另外楼主启动了winavr的-s级压缩了吗?

favr 发表于 2007-11-30 19:30:44

不可能吧?用Bascom 1千多行也不会超过8K,用C 1400行怎么可能超过30K呢?肯定把HEX当BIN了,要这代码量估计169也没问题。

ghost2 发表于 2007-12-1 19:58:32

我最近的项目,800行有效代码,刚好放到Mega48里去。

fushiqi 发表于 2007-12-1 23:08:35

非常感谢大家的热心回复,看了大家的帖子后,总算明白到底是怎么回事了,我的确是看的.HEX文件。按照大家的说法,我通过看编译器的FLASH BUFFER,结果显示,真的只有11.4k,太高兴了,现在不但不需要担心FLASH不够,而且,原来的169P也够用了,非常感谢,这么多热心的朋友!自己真的是井底之蛙,差点误了大事!

fushiqi 发表于 2007-12-2 17:54:25

以下是我的部分硬件连接,现在要对外部EEPROM 读写,看了ATMEGA169P的DATASHEET,但是没有关于TWI的描述,里面只讲到USI的两线模式,估计也就是TWI了,我看了论坛里很多有关TWI的例程,多数都是M16的,其中iom16.h文件里有有关TWI积存器的定义,如TWSR、TWBR、TWAR、TWCR等,可是ATMEGA169P的头文件iom169.h中没有这些积存器的设置啊,这个USI两线模式应该怎么用呢?
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_184601.JPG

powerful 发表于 2007-12-2 18:00:53

楼主,果真如此,太不应该了。
TWI是ATMEL为了避免给I2C付费而另起的一个名字

bing0110 发表于 2007-12-2 18:31:07

ICC 2350行也只有16K

fushiqi 发表于 2007-12-2 18:46:45

我清楚TWI的概念,可我不是很清楚在ATMEGA169上怎么用TWI(I2C),因为芯片手册中只有讲到USI,而TWI是USI中的一种(两线模式),M16用TWI很简单,因为有TWI相关的积存器,但M169P就没有,它只有USI相关的三个积存器USIDR、USISR、USICR,如何实现类似M16 TWI的操作是我现在比较困惑的问题,希望大家能给点建议,谢谢!

fsclub 发表于 2007-12-3 08:30:54

兄弟,你仔细看看DATASHEET不行吗?

xuebingsmart 发表于 2016-3-3 13:24:04

感谢分享,琢磨研究
页: [1]
查看完整版本: 项目进行中,但发生了两次功能增加导致FLASH不够需要更换AVR芯片,有什么解决方法?