Performance 在硬件中从半字节接受字节的最快方法(8051)

Performance 在硬件中从半字节接受字节的最快方法(8051),performance,assembly,optimization,microcontroller,8051,Performance,Assembly,Optimization,Microcontroller,8051,我有一个较小的8051微控制器(AT89C4051)连接到一个较大的微控制器(AT89S52),较大的一个正在运行较小的一个的时钟。大晶体的晶体速度为22.1184Mhz。文件表明,由于ALE线控制较小的micro,其时钟速度限制为3.6Mhz 两个微型计算机之间仅通过4条I/O线和一条中断线进行通信。我试图使接收字节的速度尽可能快,但我提出的代码使我认为我没有选择最佳解决方案,但以下是我迄今为止得到的结果: org 0h ljmp main ;run initialization + prog

我有一个较小的8051微控制器(AT89C4051)连接到一个较大的微控制器(AT89S52),较大的一个正在运行较小的一个的时钟。大晶体的晶体速度为22.1184Mhz。文件表明,由于ALE线控制较小的micro,其时钟速度限制为3.6Mhz

两个微型计算机之间仅通过4条I/O线和一条中断线进行通信。我试图使接收字节的速度尽可能快,但我提出的代码使我认为我没有选择最佳解决方案,但以下是我迄今为止得到的结果:

org 0h
ljmp main ;run initialization + program

org 13h         ;INT1 handler - worse case scenario: 52uS processing time I think?
  push PSW      ;save old registers and the carry flag
  mov PSW,#18h  ;load our register space
  mov R7,A      ;save accumulator (PUSH takes an extra clock cycle I think)
  mov A,P1      ;Grab data (wish I could grab it sooner somehow)
  anl A,#0Fh     ;Only lowest 4 bits on P1 is the actual data. other 4 bits are useless
  djnz R2,nonib2   ;See what nibble # we are at. 1st or 2nd?
        orl A,R6   ;were at 2nd so merge previously saved data in
        mov @R0,A  ;and put it in memory space
        inc R0     ;and increment pointer
        mov R2,#2h ;and reset nibble number
  nonib2:
  swap A           ;exchange nibbles to prevent overwriting nibble later
  mov R6,A         ;save to R6 high nibble
  mov A,R7         ;restore accumulator
  pop PSW          ;restore carry and register location
reti               ;return to wherever

main:
  mov PSW,#18h ;use new address for R0 through R7 to not clash with other routines
  mov R1,#BUFCMD ;setup start of buffer space as R1
  mov R2,#2h     ;set # nibbles needed to process byte
  mov PSW,#0h
  mov IE,#84h    ;enable external interrupt 1
  ..rest of code here...
我们必须假设这可以在任何时候由硬件触发,即使在使用所有寄存器和累加器的时间敏感LCD字符处理例程中也是如此


我可以对这段代码执行哪些优化以使其运行得更快?

不需要在中断中执行半字节处理。只需在4位输入时存储它们

假设您可以全局分配R0,代码可以如下所示:

org 13h 
mov @r0, p1
inc r0
reti
不会比这更快了


如果您绝对不能保留R0,但您至少可以安排使用在单个位上不同的寄存器组,例如#0和#1,那么您可以使用位设置/清除在2个周期内切换,对于
push psw方法,不是5。

但我需要进行处理,因为我实际上是通过半字节通道传输字节,而且我的寄存器也用于其他目的。例如,如果我在同一个芯片上进行内存到内存的复制操作,那么我将使用地址R0和R1将字节从一个空间传输到另一个空间,您提供的代码将不适用于我。您可以用普通代码进行处理。您也没有在中断中显示任何其他处理。至于分配R0,一切都是有代价的。你可以在没有它的情况下进行内存到内存的复制,它只会更慢。您可以决定要制作fast的是ISR还是副本;)