avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] GCC problem, volatile


From: David Brown
Subject: Re: [avr-gcc-list] GCC problem, volatile
Date: Fri, 12 Mar 2004 16:33:12 +0100

I find it is always worth using extra typedefs for these things - that way
you can't go wrong (either when writing the code, or when trying to read it
six months later).  I try to avoid having more than one modifier to a type
in a single statement.

    typedef _RX_BUFFER *p_RX_BUFFER;
    static volatile p_RX_BUFFER _rx_decode_buffer;

mvh.,

David



----- Original Message -----
From: "Dave Hylands" <address@hidden>
To: "Andreas Becker" <address@hidden>; <address@hidden>
Sent: Friday, March 12, 2004 4:16 PM
Subject: RE: [avr-gcc-list] GCC problem, volatile


Hi Andreas,

I believe that you declared the thing that _rx_decode_buffer points to
as being volatile and not the pointer itself.

Read pointer declarations from right to left, and you see that:

    static volatile _RX_BUFFER *_rx_decode_buffer;

Is a pointer to a volatile _RX_BUFFER. If you want a volatile pointer
then you need to use:

    static _RX_BUFFER * volatile _rx_decode_buffer;

If you also want the contents to be volatile, then you need to use:

    static volatile _RX_BUFFER * volatile _rx_decode_buffer;

--
Dave Hylands
Vancouver, BC, Canada
http://www.DaveHylands.com/


> -----Original Message-----
> From: address@hidden
> [mailto:address@hidden On Behalf Of Andreas Becker
> Sent: Friday, March 12, 2004 5:49 AM
> To: address@hidden
> Subject: [avr-gcc-list] GCC problem, volatile
>
>
> Hi All,
>
> I'm using AVR-GCC 3.3.2
> I have got a a problem with the the optimisation the Compiler
> does. The C File:
>
> #include <stdlib.h>
> #include <avr/signal.h>
> #define _RX_BUFFER_SIZE 30
> #define _RX_BUFFER_NUMBER 5
>
> typedef struct
> {
> char buffer[_RX_BUFFER_SIZE];
> char elements;
> } _RX_BUFFER;
>
> static _RX_BUFFER _rx_buffers[_RX_BUFFER_NUMBER];
>
> static volatile _RX_BUFFER *_rx_decode_buffer;
>
> SIGNAL(SIG_ADC)
> {
> _rx_decode_buffer++;
> }
>
> extern int main (void)
> {
> while(1)
> {
> if (_rx_decode_buffer != NULL)
> {
> _rx_decode_buffer = NULL;
> }
> }
> }
>
> If I use Optlevel 0 everything works fine.
>
> ASSEMBLER CODE from the .lss File:
> while(1)
> {
> if (_rx_decode_buffer != NULL)
>   d2: 80 91 fb 00 lds r24, 0x00FB
>   d6: 90 91 fc 00 lds r25, 0x00FC
>   da: 00 97       sbiw r24, 0x00 ; 0
>   dc: d1 f3       breq .-12     ; 0xd2
> {
> _rx_decode_buffer = NULL;
>   de: 10 92 fc 00 sts 0x00FC, r1
>   e2: 10 92 fb 00 sts 0x00FB, r1
>   e6: f5 cf       rjmp .-22     ; 0xd2
>
>
> If I use Optlevel 1 the Compiler does't reloads the _rx_decode_buffer
> Pointer. Compare the Line 0xdc (Optlevel 0) and Line
> 0xce (Optlevel 1).
> The Destination of the Jump is another.
>
> ASSEMBLER CODE from the .lss File:
> while(1)
>   c4: 80 91 fb 00 lds r24, 0x00FB
>   c8: 90 91 fc 00 lds r25, 0x00FC
> {
> if (_rx_decode_buffer != NULL)
>   cc: 00 97       sbiw r24, 0x00 ; 0
>   ce: f1 f3       breq .-4      ; 0xcc
> {
> _rx_decode_buffer = NULL;
>   d0: 80 e0       ldi r24, 0x00 ; 0
>   d2: 90 e0       ldi r25, 0x00 ; 0
>   d4: fb cf       rjmp .-10     ; 0xcc
>
>
> Is it my fault, or is there something wrong with the
> Compiler?
>
> --
> Dipl.-Ing.(FH) Andreas Becker
> Entwicklung
>
> dSys e.K.
> Soeflinger Str. 100
> D-89077 Ulm
> Tel:  +49.731.151579-1
> Fax: +49.731.151579-9
> web: www.dsys.de
>
> _______________________________________________
> avr-gcc-list mailing list
> address@hidden
> http://www.avr1.org/mailman/listinfo/avr-gcc-> list
>
>


_______________________________________________
avr-gcc-list mailing list
address@hidden
http://www.avr1.org/mailman/listinfo/avr-gcc-list




_______________________________________________
avr-gcc-list mailing list
address@hidden
http://www.avr1.org/mailman/listinfo/avr-gcc-list


reply via email to

[Prev in Thread] Current Thread [Next in Thread]