|
用C语言进行51编程实在是非常方便,但是你往往会遇到这样的尴尬的境地:你的内部128字节RAM不够用啦! 天下没有免费的午餐,为了节约RAM你可能得牺牲点速度了,呵呵!鱼和熊掌看你要哪一样了! 下面我们来看个例子教你如何来减小内存使用: 1、首先,查看M51文件,看看内存区块分配情况,看看向谁开刀。 DATA 003BH 000EH UNIT _DATA_GROUP_ IDATA 0049H 0080H UNIT _IDATA_GROUP_ 上面两行是M51文件的头部内存分配表中的内容,这两行表示的内存区域是用来作为函数的 零时变量使用的(相当与PC中的函数栈Frame)。本程序使用了大量的idata类型零时变量,这是由于程序中有个必须使用的零时数组作为缓冲区,在实际中已经无法再缩小。看来应该向DATA临时变量开刀了。 2、看看各个函数的零时变量内存使用情况。 SEGMENT BIT_GROUP DATA_GROUP IDATA_GROUP +--> CALLED SEGMENT START LENGTH START LENGTH START LENGTH -------------------------------------------------------------------------------- ?PR?_M500PCDCMD?RC500 0026H.0 0000H.1 0046H 0003H 007BH 0002H +--> ?PR?_WRITEIO?RC500 +--> ?PR?_SETBITMASK?RC500 +--> ?PR?_READIO?RC500 +--> ?PR?_START_TIMEOUT?RC500 +--> ?PR?STOP_TIMEOUT?RC500 可以看出来,_M500PCDCMD这个函数使用了3个字节的data类型,看来是它将_DATA_GROUP_撑大的,但是他仅仅使用了5个字节的idata类型。如果我们能够将让使用data类型的临时变量改用idata 类型可以节省3个字节。 3、看看源程序: byte M500PcdCmd( byte send, byte rcv, byte info) { byte idata count=0; bool readaction = false; byte idata status ; ... } 但是看了源程序后,我们发现已经把变量都定义成idata类型的了!这到底是怎么回事?问题出在函数参数传递中。请看: 4、翻译后的汇编: ; FUNCTION _M500PcdCmd (BEGIN) ; SOURCE LINE # 309 0006 8F00 R MOV send,R7 0008 8D00 R MOV rcv,R5 000A 8B00 R MOV info,R3 原来编译器自动定义了send, rcv, info三个临时变量!而且他们是data类型的。那怎么办呢? 5、解决方法 只要你强制把这三个变量设置为idata类型就行了,具体做法如下: byte M500PcdCmd( byte send, byte rcv, byte info) { byte idata count=0; bool readaction = false; byte idata status ; byte idata sendbk=send; byte idata rcvbk=rcv; byte idata infobk=info; ... } |