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

Consistant code

I tried to small program to see the code produced by the compiler.

This is the C code:
unsigned char loop;

while (1) {

P3 = 0xFF;

for(loop=0xff; loop>0; loop--) {}

P3 = 0x00;

for(loop=0xff; loop>0; loop--) {}

}

This is the disassembly:

25: unsigned char loop;

26:

27: while (1) {

28:

29: P3 = 0xFF;

C:0x0800 75B0FF MOV P3(0xB0),#0xFF

30: for(loop=0xff; loop>0; loop--) {}

C:0x0803 7FFF MOV R7,#0xFF

C:0x0805 DFFE DJNZ R7,C:0805

31: P3 = 0x00;

C:0x0807 E4 CLR A

C:0x0808 F5B0 MOV P3(0xB0),A

32: for(loop=0xff; loop>0; loop--) {}

C:0x080A 7FFF MOV R7,#0xFF

C:0x080C EF MOV A,R7

C:0x080D D3 SETB C

C:0x080E 9400 SUBB A,#0x00

C:0x0810 40EE JC main(C:0800)

C:0x0812 1F DEC R7

C:0x0813 80F7 SJMP C:080C

C:0x0815 787F MOV R0,#0x7F

C:0x0817 E4 CLR A

C:0x0818 F6 MOV @R0,A

C:0x0819 D8FD DJNZ R0,C:0818

C:0x081B 758107 MOV SP(0x81),#0x07

C:0x081E 020800 LJMP main(C:0800)

Why is the second timing loop so different than the first ??

What can I do so both are the same ???

Thank you

Donald

Parents
  • Drew, thank you for the explanation, that makes it crystal clear. I was thinking that the #ifndef, #define in the .h files files would stop the repetition and the compiler built a list from the 1st definition it found. Thats what happens with .c files isn't it?

    I lucked out using the __inline it seems, but I wanted inline code, sad the compiler didn't oblige.

    #ifndef _delay
    #define _delay
    
    #pragma arm
    __inline void Delay4(uint32_t loops)
    {
    __asm {
    loop1:  SUBS loops, loops, #1    // 1 cycle
                    BNE loop1                                // 3 cycles true, 1 cycle false
          }
    }
    #pragma thumb
    
    #endif \\ _delay
    

Reply
  • Drew, thank you for the explanation, that makes it crystal clear. I was thinking that the #ifndef, #define in the .h files files would stop the repetition and the compiler built a list from the 1st definition it found. Thats what happens with .c files isn't it?

    I lucked out using the __inline it seems, but I wanted inline code, sad the compiler didn't oblige.

    #ifndef _delay
    #define _delay
    
    #pragma arm
    __inline void Delay4(uint32_t loops)
    {
    __asm {
    loop1:  SUBS loops, loops, #1    // 1 cycle
                    BNE loop1                                // 3 cycles true, 1 cycle false
          }
    }
    #pragma thumb
    
    #endif \\ _delay
    

Children