Наименее ресурсоемкий метод для указания полученного фрагмента данных - PullRequest
0 голосов
/ 27 февраля 2019

В настоящее время я использую семейство микроконтроллеров 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
...