Я пытаюсь придумать более эффективный метод для чтения серии байтов из расширенной памяти в микроконтроллере 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
Но это большая часть байтов кода, которые тратятся впустую только для того, чтобы взять один байт из разных банков хранения.Есть ли способ выполнить такую обработку, не занимая так много места для хранения?