Чтение определенного байта в памяти без потери места в коде - 8051 - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь придумать более эффективный метод для чтения серии байтов из расширенной памяти в микроконтроллере AT89S52.

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

Storage1 equ 0C000h ;bank 1 for unit 1 = C0:00h to C0:FFh
                    ;bank 1 for unit 2 = C1:00h to C1:FFh
                    ;bank 1 for unit 3 = C2:00h to C2:FFh
                    ...
                    ;bank 1 for unit 16 = CF:00h to CF:FFh

Storage2 equ 09000h ;bank 2 for unit 1 = 90:00h to 90:FFh
                    ;bank 2 for unit 2 = 91:00h to 91:FFh
                    ;bank 2 for unit 3 = 92:00h to 92:FFh
                    ...
                    ;bank 2 for unit 16 = 9F:00h to 9F:FFh

Здесь каждая единица для каждого банка имеет 256 байтов.В настоящее время я могу получить доступ к каждому устройству с помощью следующего кода:

StorageN equ 0C000h
UnitNo equ 2h

mov DPTR,#StorageN
mov A,#UnitNo
orl DPH,A
movx A,@DPTR

После оценки этого кода с помощью онлайн-документации от Keil для этого кода требуется 8 байт дискового пространства.

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

Storage1Status equ 0C0FEh ;255th byte of all units in bank1=status
Storage2Status equ 0C0FBh ;252nd byte of all units in bank2=status

Если бы я должен был получить статус единицы хранения 2 избанк 1 и поместите результат в блок хранения 5; банк 2, я бы использовал следующий код:

mov DPTR,#Storage1Status
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR
mov R7,A ;save status

mov DPTR,#Storage2Status
mov A,#5h ;unit 5
orl DPH,A
mov A,R7
movx @DPTR,A

. Для обновления одного значения из одного местоположения в другое требуется каждый раз около 18 байт кодового пространства.

Большую часть времени в моем приложении номера единиц остаются неизменными, но банки часто меняются.поэтому я использую такой код для доступа к банкам:

mov DPTR,#Storage2
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR

mov DPTR,#Storage1
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR

mov DPTR,#StorageN
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR

...

mov DPTR,#StorageX
mov A,#1h ;unit 1
orl DPH,A
movx A,@DPTR

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

...