Memory 使用更少的字节存储数据-8051
我目前正在为8051处理器编写代码,并试图找出更好的方法,在不使用太多字节rom空间的情况下,将数据存储在即时RAM中。数据大部分是随机的,但有时有些数据是空的Memory 使用更少的字节存储数据-8051,memory,optimization,storage,8051,rom,Memory,Optimization,Storage,8051,Rom,我目前正在为8051处理器编写代码,并试图找出更好的方法,在不使用太多字节rom空间的情况下,将数据存储在即时RAM中。数据大部分是随机的,但有时有些数据是空的 例如,我有一个设备连接到我的芯片上,需要处理7字节的数据。假设我想向该设备发送以下数据: 12h 34h 56h 41h 33h 77h 00h 对我来说,最快的方法是如下所示: DATABLOCK equ 30h MOV DATABLOCK,#12h MOV DATABLOCK+1,#34h MOV DATABLOCK+2
例如,我有一个设备连接到我的芯片上,需要处理7字节的数据。假设我想向该设备发送以下数据:
12h 34h 56h 41h 33h 77h 00h
对我来说,最快的方法是如下所示:
DATABLOCK equ 30h
MOV DATABLOCK,#12h
MOV DATABLOCK+1,#34h
MOV DATABLOCK+2,#56h
MOV DATABLOCK+3,#41h
MOV DATABLOCK+4,#33h
MOV DATABLOCK+5,#77h
MOV DATABLOCK+6,#00h
有关说明,请访问以下网站:
根据我的代码,我需要21个字节来存储在rom中。一个字节用于MOV,一个字节用于目标(DATABLOCK+x),一个字节用于值(xxh)。将总数乘以7=21
问题是,我经常使用这种命令,因为它速度快,但我在芯片上的可用空间有限
我想到了以下几点,但没有真正的帮助。见鬼,我想它需要额外的两个字节:
DATABLOCK equ 30h
MOV R0,#DATABLOCK
MOV @R0,#12h
INC R0
MOV @R0,#34h
INC R0
MOV @R0,#56h
INC R0
MOV @R0,#41h
INC R0
MOV @R0,#33h
INC R0
MOV @R0,#77h
INC R0
MOV @R0,#00h
然后我想到了这个,它可能会变得疯狂,我认为它需要更多的字节:
DATABLOCK equ 30h
mov R1,SP
MOV SP,#DATABLOCK-1
MOV A,#12h
PUSH ACC
MOV A,#34h
PUSH ACC
MOV A,#56h
PUSH ACC
MOV A,#41h
PUSH ACC
MOV A,#33h
PUSH ACC
MOV A,#77h
PUSH ACC
MOV A,#00h ;could use CLR A but what if value isn't 0h?
PUSH ACC
MOV SP,R1
现在的问题是我也没有那么多的ram,所以我不能在ram中为整个程序保留相同的值。如果可以,我将实现如下代码:
FIND12H equ 70h
FIND34H equ 60h
FIND56H equ 50h
FIND41H equ 55h
FIND33H equ 66h
FIND77H equ 22h
FIND00H equ 2Ah
DATABLOCK equ 30h
mov R1,SP
MOV SP,#DATABLOCK-1
PUSH FIND12H
PUSH FIND34H
PUSH FIND56H
PUSH FIND41H
PUSH FIND33H
PUSH FIND77H
PUSH FIND00H
MOV SP,R1
ARRAY_START equ 30h
ARRAY_LEN equ 7h
MOV R0, ARRAY_START ;set pointer to start array
MOV DPTR, SrcTable ;pointer to data in ROM
copyMore:
MOVC A, @DPTR ;move data to acumulator
MOV @R0, A ;move data to RAM destination
INC DPTR ;increment source pointer
INC R0 ;increment destination pointer
CJNE R0, ARRAY_START+ARRAY_LEN, copyMore
SrcTable: DB #12h, #34h, #56h, #41h, #33h, #77h, #00h ;constants stored in ROM
现在那里的代码只需要花费我大概12个字节。这大约节省了9个字节(超过1/3),但问题是我使用的是绝对值,而不是内存位置。如果以下内容与8051一起使用,那么我的问题将得到回答:
mov A,SP
MOV SP,#DATABLOCK-1
PUSH #12h
PUSH #34h
PUSH #56h
PUSH #41h
PUSH #33h
PUSH #77h
PUSH #0h
MOV SP,A
但对于push命令,参数不能是硬编码值
那么,考虑到我所介绍的内容,如何使用更少的rom字节将数据存储到内存中呢 “例如,我的芯片上连接了一个设备,它需要7字节的数据来处理”为什么需要RAM中的数据?您可以直接从ROM复制数据。例如,如果您希望通过UART发送数据(如果工作,则不检查):
如果您确实希望RAM中的数据,可以使用内存复制功能,该功能如下所示:
FIND12H equ 70h
FIND34H equ 60h
FIND56H equ 50h
FIND41H equ 55h
FIND33H equ 66h
FIND77H equ 22h
FIND00H equ 2Ah
DATABLOCK equ 30h
mov R1,SP
MOV SP,#DATABLOCK-1
PUSH FIND12H
PUSH FIND34H
PUSH FIND56H
PUSH FIND41H
PUSH FIND33H
PUSH FIND77H
PUSH FIND00H
MOV SP,R1
ARRAY_START equ 30h
ARRAY_LEN equ 7h
MOV R0, ARRAY_START ;set pointer to start array
MOV DPTR, SrcTable ;pointer to data in ROM
copyMore:
MOVC A, @DPTR ;move data to acumulator
MOV @R0, A ;move data to RAM destination
INC DPTR ;increment source pointer
INC R0 ;increment destination pointer
CJNE R0, ARRAY_START+ARRAY_LEN, copyMore
SrcTable: DB #12h, #34h, #56h, #41h, #33h, #77h, #00h ;constants stored in ROM