打印

代码如何写生成的烧写文件才更小

[复制链接]
4038|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
galton1982|  楼主 | 2010-10-27 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于目前很少会有人涉及到这个问题,都是小了就换大的,所以一直也没有注意过。
现在这个遇到问题了,又不好换MCU,想请问下,怎么写代码生成的烧写文件会小,汇编不会,主要是C,用的KEIL,鞠躬

相关帖子

沙发
z_no1| | 2010-10-27 16:10 | 只看该作者
提高编译优化等级,再则优化自己的代码。还不行就只能换MCU了。

使用特权

评论回复
板凳
galton1982|  楼主 | 2010-10-27 16:17 | 只看该作者
楼上的虾,优化自己代码主要可以从哪些方面着手?
比如说类似uchar i;i=0;弄成uchar i=0;还有一些一个语句完成的任务什么的,由于以前没怎么考虑过,所以无知啊。
就是因为MCU不好换,才有这个念头的。
拜谢

使用特权

评论回复
地板
galton1982|  楼主 | 2010-10-27 16:25 | 只看该作者
大量运用指针,多层函数嵌套之类的,会不会引起烧写文件增加呢

使用特权

评论回复
5
AV693| | 2010-10-27 17:02 | 只看该作者
优化代码这样吧.
看MCU的总线宽度,如8位MCU,如果可以,多用8位宽的变量可以减少代码.用整形数比用浮点数可减小代码.
重复功能的代码就提取成子函数.
多层函数嵌套会占用堆栈空间,代码多占用一个是参数的传递,一个是调用开销

使用特权

评论回复
6
galton1982|  楼主 | 2010-10-27 17:49 | 只看该作者
谢谢楼上的大虾,请楼下继续啊。。。

使用特权

评论回复
7
coody| | 2010-10-27 18:29 | 只看该作者
优化流程,优化算法

使用特权

评论回复
8
batsong| | 2010-10-27 20:49 | 只看该作者
时不时的就反汇编看看每个语句生成什么指令

少用库,尽量自己实现

使用特权

评论回复
9
ejack| | 2010-10-28 08:05 | 只看该作者
优化代码一定要结合汇编的,要了解MCU的指令特性。
举个很小很小的例子来说,对于C51来说,如果for循环的参数不参与数组或指针下标,那么
for(i=xx; i; i--)
要比
for(i=0; i<xx; i++)
效率高。

使用特权

评论回复
10
ayb_ice| | 2010-10-28 08:34 | 只看该作者
良好的程序架构是解决问题的根本之道
当然基本的写法,算法也是有效的
....

使用特权

评论回复
11
huangqi412| | 2010-10-28 08:44 | 只看该作者
纠结在节约1个2个字节中的单片机,整体看的工资肯定低。。。

LZ赶紧加油提高档次用不必考虑节约几个字节的单片机。

使用特权

评论回复
12
5880527| | 2010-10-28 09:09 | 只看该作者
楼上说的在理;P

使用特权

评论回复
13
galton1982|  楼主 | 2010-10-28 10:23 | 只看该作者
44b0  2440也都有用过  场合不同而已嘛 呵呵
单片机用的是NORDIC的24LE1 因为是带2.4G的 本身有16K的FLASH 所以不想换其他的型号
用单片机带L01也可以 但是功耗稍高
求给推荐个工资高的。。。。

使用特权

评论回复
14
jack_shine| | 2010-10-28 10:36 | 只看该作者
当公务员:lol

使用特权

评论回复
15
galton1982|  楼主 | 2010-10-28 10:57 | 只看该作者
公务员还可以生娃开车撞人呢。。。可惜没机会当啊

使用特权

评论回复
16
yulri| | 2010-10-28 11:23 | 只看该作者
DINGQI!!

使用特权

评论回复
17
老鱼探戈| | 2010-10-28 12:35 | 只看该作者
不管你用的MCU有多大的ROM都要考虑程序的优化
尽量不要有冗沉的代码,影响效率
精简算法:比如用加减法代替乘除法等
可以试着内嵌汇编,
让程序结构化、状态化。

使用特权

评论回复
18
galton1982|  楼主 | 2010-10-28 14:32 | 只看该作者
麻烦问一下,要是实在不行需要外扩ROM的话,该如何弄啊?以前都用的ARM之类,或者单片机不够ROM了就换型号,实在是没弄过这个啊。。。

使用特权

评论回复
19
li_mu| | 2010-10-28 14:45 | 只看该作者
本帖最后由 li_mu 于 2010-10-28 15:20 编辑

首先要考虑程序架构
如果用散列表结构而不是用那些if之类的,肯定节约空间

另外,代码重用一定要考虑,这样省时间省金钱(对一段代码在输入不同标志位时候执行不同功能等等,就是多入多出....)

注意:
首先:是程序结构优化(事务处理过程的优化)这个是需求分析的总体设计师,常常能省掉不少钱
其次:是算法的优化,好算法和差算法速度和占用空间差的可能是数量级的
第三步:才考虑指针还是数组等等。这个好坏的效率与空间差别大概是1:1.2到1:5的差别
第四步:终极优化----在以上三项都做好的情况下,有时为了量产,需要对存储空间做字节级的优化
       例如某项目,如果全用一个芯片,不另开模,则当量达到每月几百k且功能多变时候,新开一个片子
开光罩成本会很高(相对于重用同一个芯片来说)。此时,如果能把一个大程序或者新功能装到原来的芯片
里面,则成本要省掉不少,此时必须进行指令级别的优化!
例如跳转的长短、跳转的条件判断(例如很多MCU的JNZ类比JZ类要省空间,这是由于其MCU芯片设计时候硬件决定的)

第四步是万不得已,批量很大,功能多变,老板对利润要求很高等几种因素共同决定的不得不采用的招数
能够使用这种招数的前提是你对此MCU的汇编指令集非常熟悉,你的产品批量非常大,你的老板非常抠门,
你的程序由你维护(这种程序经常是非常丑陋,不符合教科书式的软件工程规范,可维护性差,别人不愿意
接手,对原编程人员保护性好,哈哈哈)

使用特权

评论回复
20
li_mu| | 2010-10-28 15:01 | 只看该作者
其实如果以上几条做好了,在8位MCU上
用几十kBflash+2kRAM可以实现一个很大的系统(包括图形显示、键盘、高精度浮点运算、串行通讯等等)

使用特权

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

本版积分规则

14

主题

174

帖子

0

粉丝