搜索
bottom↓
回复: 31

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

[复制链接]

出0入0汤圆

发表于 2007-11-30 00:39:18 | 显示全部楼层 |阅读模式
我公司正在做一个项目,之前预研是用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 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2007-11-30 00:44:34 | 显示全部楼层
对外部EEPROM读写应该代码量不大
TWI也不会很大

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

出0入0汤圆

发表于 2007-11-30 00:45:02 | 显示全部楼层
32.7K-31.4K = 1.3K TWI肯定够了。
建议还是精简代码,32k 可以干不少事了。

出0入0汤圆

发表于 2007-11-30 00:57:40 | 显示全部楼层
1400行左右代码,就有32.7K吗?并且怎么知道的这么精确?楼主不会是看的那个.hex文件吧,如果果真是的话那就嘘惊一场了,实际可不10K左右吧。

出0入4汤圆

发表于 2007-11-30 00:59:34 | 显示全部楼层
程序肯定可以精简的如果用了大量的浮点运算就会占用很大的空间

出0入0汤圆

发表于 2007-11-30 08:51:05 | 显示全部楼层
用IAR,最大代码优化。

出0入0汤圆

发表于 2007-11-30 08:55:16 | 显示全部楼层
面对用户的需求变化不要自慌手脚,要冷静的分析,不要轻易的换芯片.否则会出现"加水-加面-加水"的一团糟局面.

出0入0汤圆

发表于 2007-11-30 09:12:51 | 显示全部楼层
1400行代码编译出31k的程序啊,真是佩服你了.空间小就不要用WinAVR了,用iar吧.我也只剩下1.5k空间了,最大压缩了.

出0入0汤圆

发表于 2007-11-30 09:16:59 | 显示全部楼层
如果你看的是HEX文件的大小,那你错了.你用网上下个小工具,把HEX转成BIN格式后,那个才是在FLASH中实际的大小.

出0入0汤圆

发表于 2007-11-30 09:34:27 | 显示全部楼层
1400行C代码,不太可能有 31K的程序,注意这31K你可能是直接看HEX文件的,你最好直接看WINAVR编译成功后的信息提示看看是多少。

FLASH的空间以BIN文件为准

出0入0汤圆

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

出0入0汤圆

发表于 2007-11-30 09:45:01 | 显示全部楼层
烧程序时,一般软件有"编辑功能",点开看程序排到了什么地址就知道了,

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

出0入0汤圆

发表于 2007-11-30 09:46:10 | 显示全部楼层
如果编译器没有显示ROM占用容量时,笨办法,把HEX文件读到编程器中可看到真实的占用容量.1400行有30K,不太可能的.

出0入0汤圆

发表于 2007-11-30 10:16:49 | 显示全部楼层
或者直接读到编程软件的缓存中,点"编辑",一般就能看到数据在内存中的分布,一目了然.

出0入0汤圆

发表于 2007-11-30 10:48:56 | 显示全部楼层
10楼这句经典"代码空间和海绵、时间以及女人的乳沟差不多,如果肯花力气总可以挤出来一点的! "

出0入0汤圆

发表于 2007-11-30 10:51:00 | 显示全部楼层
经典:“减少代码空间总是存在可能性的。代码空间和海绵、时间以及女人的乳沟差不多,如果肯花力气总可以挤出来一点的”

出0入0汤圆

发表于 2007-11-30 10:51:58 | 显示全部楼层
可以想法存到内部Flash里

出0入4汤圆

发表于 2007-11-30 11:53:51 | 显示全部楼层
楼上的几位都实践过吗? 哈哈 ^_^

出0入0汤圆

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

出0入0汤圆

发表于 2007-11-30 13:06:43 | 显示全部楼层
对同样的功能,
首先是程序结构和算法决定了代码量,
其次才是优化的作用。

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

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

出0入0汤圆

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

出0入0汤圆

发表于 2007-11-30 18:29:43 | 显示全部楼层
代码空间和海绵、时间以及女人的乳沟差不多,如果肯花力气总可以挤出来一点的!
-------技术性总结!

出0入0汤圆

发表于 2007-11-30 18:43:28 | 显示全部楼层
1000多行30多k有问题的,估计被人说中了,错把hex大小看成程序大小,另外楼主启动了winavr的-s级压缩了吗?

出0入0汤圆

发表于 2007-11-30 19:30:44 | 显示全部楼层
不可能吧?用Bascom 1千多行也不会超过8K,用C 1400行怎么可能超过30K呢?肯定把HEX当BIN了,要这代码量估计169也没问题。

出0入0汤圆

发表于 2007-12-1 19:58:32 | 显示全部楼层
我最近的项目,800行有效代码,刚好放到Mega48里去。

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 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两线模式应该怎么用呢?

出0入0汤圆

发表于 2007-12-2 18:00:53 | 显示全部楼层
楼主,果真如此,太不应该了。
TWI是ATMEL为了避免给I2C付费而另起的一个名字

出0入0汤圆

发表于 2007-12-2 18:31:07 | 显示全部楼层
ICC 2350行也只有16K

出0入0汤圆

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

出0入0汤圆

发表于 2007-12-3 08:30:54 | 显示全部楼层
兄弟,你仔细看看DATASHEET不行吗?

出0入4汤圆

发表于 2016-3-3 13:24:04 | 显示全部楼层
感谢分享,琢磨研究
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 00:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表