В настоящее время я использую семейство микроконтроллеров 8051 и создаю большую программу, которая позволяет мастеру и нескольким клиентам обмениваться данными.Из-за ограниченности памяти и мощности процессора я решил разрешить клиенту отправлять до 4-х байтов данных на сервер за один раз.
В редких случаях клиенту необходимо отправлять 16 байтов на сервер.Для этого я создал функцию фрагмента (частично показана), которая позволяет серверу получать 4 байта за раз, но куски могут поступать в любом порядке.
Я прихожу сюда, потому что пытаюсьчтобы найти менее интенсивный способ для записи сервера, когда он получил фрагмент.
В настоящее время у меня есть код, проверяющий значение аккумулятора, когда функция do_fragment начинается, так как она уникальна для каждого фрагмента, затем я проверяю каждое возможное значение и устанавливаю бит, если это то значение.Как только все 4 бита установлены (все полученные фрагменты), функция должна перейти к проверке пакета.
Есть ли способ сжать этот код, чтобы мне не приходилось сравнивать значение аккумулятора до4 раза просто установить бит в маске?
К сожалению, доступные мне места памяти не находятся в пространствах битовых областей 8051 (20-2Fh)
Я имею в виду, если естьмежду этими двумя строчками я могу сделать какую-нибудь причудливую математику:
movx A,@DPTR
;special math here
movx @DPTR,A
тогда я бы лучше сделал это.Я имею в виду фактическую математику, которая принимает значение аккумулятора и устанавливает уникальный бит на основе значения аккумулятора.
Вот мой соответствующий код к вопросу:
;FRAGMENTS format: High byte = fragment number 0 to 255
; Low byte = E0h + Fragment byte.
; Each fragment = 16 bytes
FRAGMENTS equ 00E0h
;R6 = Fragment number to use
do_function:
anl A,#7h
mov DPTR,#task
jmp @A+DPTR
next_stage:
;program continues here after function complete
task:
org task+0
ljmp do_fragment
org task+4
ljmp do_fragment
org task+8
ljmp do_fragment
org task+12
ljmp do_fragment
org task+16
ljmp do_something
org task+20
ljmp do_something
org task+24
ljmp do_something
org task+28
ljmp do_something
org task+32
do_fragment:
mov R7,A
mov DPTR,#FRAGMENTS
orl DPH,R6
movx A,@DPTR
djnz R7,nfrag4
setb ACC.3
nfrag4:
djnz R7,nfrag3
setb ACC.2
nfrag3:
djnz R7,nfrag2
setb ACC.1
nfrag2:
djnz R7,nfrag1
setb ACC.0
nfrag1:
movx @DPTR,A
cjne A,#0Fh,frags
lcall validate_full_fragment
frags:
lcall store_fragment
ljmp next_stage
do_something:
;Something else here
ljmp next_stage