在8051中扩展循环缓冲区的存储空间

时间:2018-07-19 00:28:50

标签: logic buffer microcontroller 8051 cyclic

我正在尝试找出是否有一种方法可以扩展我的缓冲区,而无需使用比较语句。

到目前为止,这是我的代码,其中一个函数将数据从累加器存储到缓冲区的开头,另一个函数从累加器的末尾返回数据。

我了解我没有缓冲区溢出检查机制,但这不是我关心的问题。

我只是想知道是否有办法增加缓冲区的大小,同时仍然使用与逻辑(如果超出了结束则返回到缓冲区的开头)。

  BUF equ 40h      ;Start of buffer at address 40
  BUFMASK equ 5Fh  ;Buffer ends at address 5F

  IR0 equ 0h       ;R0 is address 0
  IR1 equ 1h       ;R1 is address 0

  initialize:
    mov R0,#BUF
    mov R1,#BUF
    ;normal code here
  sjmp $

  storebyte:
    mov @R0,A
    inc R0 
    anl IR0,#BUFMASK ;Same as going to 40h if 60h is reached
  ret

  getbyte:
    mov A,@R1
    inc R1
    anl IR1,#BUFMASK ;Same as going to 40h if 60h is reached
  ret

到目前为止,我能看到的唯一方法是将所有与anl相关的语句替换为以下内容:

cjne IRx,#BUFMASK+1,notend
    mov Rx,#BUF
notend:

但是如果可能的话,我想避免这种情况,因为它至少需要6个额外的ROM空间用于cjne字节,并且每次到达缓冲区末端时都需要2个时钟周期。

对我来说,我认为选择不同口罩的问题。

对于当前的RAM使用情况,我仅使用地址20h-23h和0h-7h,堆栈位于8h,并且不使用任何调用,因此我认为必须有一种简单的方法来使用30h-7Fh对于没有上述比较语句的缓冲区,我认为也许具有正确逻辑运算的正确位掩码可以解决问题,但是我还没有弄清楚。

硬件为AT89C2051,因此无法将超过7Fh的地址用于常规RAM。

那么我最终还是会坚持使用cjne还是可以使用更好的位掩码和逻辑运算来节省时钟周期?

0 个答案:

没有答案