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
  • If you define the body of a function in the .h file, then you get multiple copies of the function, one copy everywhere that #include's the file. Header files generally contain only declarations of names, not the actual definitions of those objects. __inline is a special case because the compiler has to be able to see the body of the function in order to inline it. You'd expect the inline function to be inserted many times, while you'd expect the regular function call to insert only a call to only one body of the function.

Reply
  • If you define the body of a function in the .h file, then you get multiple copies of the function, one copy everywhere that #include's the file. Header files generally contain only declarations of names, not the actual definitions of those objects. __inline is a special case because the compiler has to be able to see the body of the function in order to inline it. You'd expect the inline function to be inserted many times, while you'd expect the regular function call to insert only a call to only one body of the function.

Children
  • 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
    

  • " I was thinking that the #ifndef, #define in the .h files files would stop the repetition"

    No, they don't.

    They stop the definition being repeated in the same source file if the same header is accidentally (or otherwise) included multiple times...