This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to get C51 to generate a DJNZ loop?

I want a fast and simple delay routine:

#pragma OT(8,SPEED)    // Switch to speed optimization for this routine
void my_delay(BYTE count)
{
        register BYTE i;
        for (i=count; i; i--);
}


Is the best so far and becomes:

B02:0xB1F1  EF       MOV      A,R7
B02:0xB1F2  6003     JZ       B02:B1F7
B02:0xB1F4  1F       DEC      R7
B02:0xB1F5  80FA     SJMP     I2C_delay(B02:B1F1)
B02:0xB1F7  22       RET


but I was hoping there was a way to get C51 to do just a DJNZ instead of 4 instructions for each loop.

Is there a magic coding style or optimization level that will generate the DJNZ?

Parents
  • So you want the fastest 1ms delay the world has ever seen? :)

    One thing to think about, is that you should always try to use pre-increment/pre-decremented whenever possible.

    With post-increment, you are telling the compiler to keep a copy of the variable _before_ the increment, because you plan to use the old value after you have incremented.

Reply
  • So you want the fastest 1ms delay the world has ever seen? :)

    One thing to think about, is that you should always try to use pre-increment/pre-decremented whenever possible.

    With post-increment, you are telling the compiler to keep a copy of the variable _before_ the increment, because you plan to use the old value after you have incremented.

Children