我目前正在使用8051系列微控制器,并且正在制作一个大型程序,允许一个主控制器和多个客户端进行通信。由于内存和CPU能力有限,我选择允许客户端一次向服务器发送最多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