Использование меньшего количества байтов для хранения данных — 8051

В настоящее время я работаю над кодом для процессора 8051 и пытаюсь найти лучшие способы хранения данных в непосредственной оперативной памяти, не используя так много байтов дискового пространства. Данные в основном случайные, но иногда некоторые данные нулевые.

Например, у меня есть устройство, подключенное к моему чипу, которое ожидает 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

Я обращаюсь к следующему веб-сайту за инструкциями: http://www.keil.com/support/man/docs/is51/is51_mov.htm

и, судя по моему коду, мне понадобился 21 байт, чтобы сохранить это в ПЗУ. Один байт для 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

Теперь проблема в том, что у меня не так много оперативной памяти, поэтому я не могу позволить себе сохранять одинаковые значения в оперативной памяти для всей программы. Если бы я мог, я бы реализовал такой код:

 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

Теперь этот код будет стоить мне всего 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 параметр не может быть жестко запрограммированным значением.

Итак, учитывая все, что я представил, как я могу использовать меньше байтов ПЗУ для хранения данных во внутренней памяти?


person Mike -- No longer here    schedule 17.04.2018    source источник


Ответы (1)


"Например, у меня есть устройство, подключенное к моему чипу, которое ожидает 7 байт данных для обработки" Зачем вам данные в ОЗУ? Вы можете скопировать данные прямо из ПЗУ. Например, если вы хотите отправить данные через UART (не проверено, если работает):

sendData:
MOV   DPTR, constData   ;pointer to data in ROM
MOV   R0, #7            ;number of data to send
sendMore: 
MOVC  A, @DPTR          ;move data to accumulator
MOV   SBUF, A           ;send data via UART
JNB   TI, $             ;wait for TI flag
CLR   TI                ;clear TI flag
INC   DPTR              ;increment pointer
DJNZ  R0, sendMore      ;decrement couter and jump if not zero

constData: DB #12h, #34h, #56h, #41h, #33h, #77h, #00h ;constants stored in ROM

Если вам действительно нужны данные в оперативной памяти, вы можете использовать функцию копирования памяти, которая выглядит примерно так:

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
person MIKIsoft    schedule 02.05.2018