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

pin writes optimized out

I am pretty new to this stuff, but I am usually able to work out problems on my own. I am trying to interface to some humidity sensor that uses it's own proprietary 2-wire serial interface (clock line and a data line). To make things easier, I declared sbits for each pin (SCK and DATA). When I try to compile and execute code like this:

.
.
DATA = 1;
SCK = 1;
error = DATA;
SCK = 0;
.
.

the compiler omits the line "SCK = 1". This is just an example, and it happens sporadically throughout the code. I read on some other posts that sbits are automatically volatile, and similar rumors, but the compiler is optimizing necessary lines out anyway. My compiler version is 6.20a. Thanks

Parents
  • When I compiled your example, I got the following:

    ASSEMBLY LISTING OF GENERATED OBJECT CODE
    
    
                 ; FUNCTION L?0006 (BEGIN)
    0000 C2C8              CLR     SCK
    0002 120000      R     LCALL   Hold
    0005 D2C8              SETB    SCK
    
    ; The above executes
    ;   SCK = 0;
    ;   Hold ();
    ;   SCK = 1;
    ; and then falls into the Hold routine
    
    
                 ; FUNCTION Hold (BEGIN)
                                               ; SOURCE LINE # 9
                                               ; SOURCE LINE # 10
                                               ; SOURCE LINE # 12
    ;---- Variable 'i' assigned to Register 'R7' ----
    0007 7FFF              MOV     R7,#0FFH
    0009         ?C0001:
    0009 DFFE              DJNZ    R7,?C0001
                                               ; SOURCE LINE # 13
    000B         ?C0004:
    000B 22                RET
                 ; FUNCTION Hold (END)
    
                 ; FUNCTION StartTX (BEGIN)
                                               ; SOURCE LINE # 15
                                               ; SOURCE LINE # 16
                                               ; SOURCE LINE # 17
    ;---- Variable 'SFRPAGE_SAVE' assigned to Register 'R6' ----
    
    
    char SFRPAGE_SAVE = SFRPAGE;
    0000 AE84              MOV     R6,SFRPAGE
                                               ; SOURCE LINE # 18
    SFRPAGE = CONFIG_PAGE;
    0002 75840F            MOV     SFRPAGE,#0FH
                                               ; SOURCE LINE # 19
    DATA = 1;
    0005 D2C9              SETB    DATA
                                               ; SOURCE LINE # 20
                                               ; SOURCE LINE # 21
                                               ; SOURCE LINE # 22
                                               ; SOURCE LINE # 23
    SCK = 0;
    Hold ();
    SCK = 1;
    Hold ();
    0007 120000      R     LCALL   L?0006
                                               ; SOURCE LINE # 24
    DATA = 0;
    000A C2C9              CLR     DATA
                                               ; SOURCE LINE # 25
    Hold ();
    000C 120000      R     LCALL   Hold
                                               ; SOURCE LINE # 26
                                               ; SOURCE LINE # 27
                                               ; SOURCE LINE # 28
                                               ; SOURCE LINE # 29
    SCK = 0;
    Hold ();
    SCK = 1;
    Hold ();
    000F 120000      R     LCALL   L?0006
                                               ; SOURCE LINE # 30
    DATA = 1;
    0012 D2C9              SETB    DATA
                                               ; SOURCE LINE # 31
    Hold ();
    0014 120000      R     LCALL   Hold
                                               ; SOURCE LINE # 32
    SCK = 0;
    0017 C2C8              CLR     SCK
                                               ; SOURCE LINE # 33
    SFRPAGE = SFRPAGE_SAVE;
    0019 8E84              MOV     SFRPAGE,R6
                                               ; SOURCE LINE # 34
    001B 22                RET
                 ; FUNCTION StartTX (END)
    

    The compile did not optimize out the instructions you indicate. Instead, it created common functions for them.

    I labeled each instruction with the lines of the C program that are executed.

    Jon

Reply
  • When I compiled your example, I got the following:

    ASSEMBLY LISTING OF GENERATED OBJECT CODE
    
    
                 ; FUNCTION L?0006 (BEGIN)
    0000 C2C8              CLR     SCK
    0002 120000      R     LCALL   Hold
    0005 D2C8              SETB    SCK
    
    ; The above executes
    ;   SCK = 0;
    ;   Hold ();
    ;   SCK = 1;
    ; and then falls into the Hold routine
    
    
                 ; FUNCTION Hold (BEGIN)
                                               ; SOURCE LINE # 9
                                               ; SOURCE LINE # 10
                                               ; SOURCE LINE # 12
    ;---- Variable 'i' assigned to Register 'R7' ----
    0007 7FFF              MOV     R7,#0FFH
    0009         ?C0001:
    0009 DFFE              DJNZ    R7,?C0001
                                               ; SOURCE LINE # 13
    000B         ?C0004:
    000B 22                RET
                 ; FUNCTION Hold (END)
    
                 ; FUNCTION StartTX (BEGIN)
                                               ; SOURCE LINE # 15
                                               ; SOURCE LINE # 16
                                               ; SOURCE LINE # 17
    ;---- Variable 'SFRPAGE_SAVE' assigned to Register 'R6' ----
    
    
    char SFRPAGE_SAVE = SFRPAGE;
    0000 AE84              MOV     R6,SFRPAGE
                                               ; SOURCE LINE # 18
    SFRPAGE = CONFIG_PAGE;
    0002 75840F            MOV     SFRPAGE,#0FH
                                               ; SOURCE LINE # 19
    DATA = 1;
    0005 D2C9              SETB    DATA
                                               ; SOURCE LINE # 20
                                               ; SOURCE LINE # 21
                                               ; SOURCE LINE # 22
                                               ; SOURCE LINE # 23
    SCK = 0;
    Hold ();
    SCK = 1;
    Hold ();
    0007 120000      R     LCALL   L?0006
                                               ; SOURCE LINE # 24
    DATA = 0;
    000A C2C9              CLR     DATA
                                               ; SOURCE LINE # 25
    Hold ();
    000C 120000      R     LCALL   Hold
                                               ; SOURCE LINE # 26
                                               ; SOURCE LINE # 27
                                               ; SOURCE LINE # 28
                                               ; SOURCE LINE # 29
    SCK = 0;
    Hold ();
    SCK = 1;
    Hold ();
    000F 120000      R     LCALL   L?0006
                                               ; SOURCE LINE # 30
    DATA = 1;
    0012 D2C9              SETB    DATA
                                               ; SOURCE LINE # 31
    Hold ();
    0014 120000      R     LCALL   Hold
                                               ; SOURCE LINE # 32
    SCK = 0;
    0017 C2C8              CLR     SCK
                                               ; SOURCE LINE # 33
    SFRPAGE = SFRPAGE_SAVE;
    0019 8E84              MOV     SFRPAGE,R6
                                               ; SOURCE LINE # 34
    001B 22                RET
                 ; FUNCTION StartTX (END)
    

    The compile did not optimize out the instructions you indicate. Instead, it created common functions for them.

    I labeled each instruction with the lines of the C program that are executed.

    Jon

Children
No data