Обнаружение границ и сброс кругового указателя буфера в обоих направлениях - PullRequest
0 голосов
/ 24 сентября 2018

Я работаю с микроконтроллером 8051, но мой вопрос более специфичен для алгоритма.

Я создал кольцевой буфер в памяти для случайных входящих данных из внешних источников.Предположим, размер буфера составляет 32 байта, и я получил 34 байта данных.Да, я справлюсь с тем, что два байта отброшены, но если я захочу прочитать последние 5 байтов, мне придется как-то снова обернуться до конца буфера, чтобы прочитать более 2 байтов.

Вот пример в коде 8051 того, чего я пытаюсь достичь:

BUFFER equ 40h     ;our buffer = 40-5Fh (32 bytes)
BUFFERMASK equ 5Fh ;Mask so buffer doesn't go past 32nd byte

initialization:
mov R1,#BUFFER ;R1=our buffer pointer

mov @R1,#xxh ;Add some incoming data 
inc R1
anl R1,#BUFFERMASK

mov @R1,#xxh ;Add some incoming data 
inc R1
anl R1,#BUFFERMASK
...
mov @R1,#xxh ;Add some incoming data 
inc R1
anl R1,#BUFFERMASK

;At this point we filled a large chunk of the buffer with data.
;Lets assume the buffer wrapped around and address is 41h
;and we want to read the data in reverse

mov A,@R1 ;Get last byte at 41h
dec R1
??? R1,??? (anl won't work here :( )

mov A,@R1 ;Get byte at 40h
dec R1
??? R1,??? (anl won't work here :( )

mov A,@R1 ;Get byte at 5Fh (how do we jump with a logic statement?)
dec R1
??? R1,??? (anl won't work here :( )

Я понимаю, что я мог бы избежать CJNE (сравнивать и прыгать, если не равны), но недостатки этого утверждения: 1.) потребность в метке для каждого CJNE, 2.) и флаг переноса, изменяемый после выполнения, и 3.) дополнительный тактовый цикл теряется при достижении границы.

Есть ли способЯ мог бы осуществить это с помощью простой логики anl / orl (AND or OR)?Я готов изменить адрес памяти циклического буфера, если это создает преимущество в моей ситуации.

...