Hi!
I use (with -O2 option) GCC from WinAVR 20090313 version 4.3.2.
unsigned char *p; unsigned short pp; cli(); 34e: f8 94 cli p = RingPointer; 350: f2 01 movw r30, r4 *p ++ = 0xFF; 352: d2 01 movw r26, r4 354: 8f ef ldi r24, 0xFF ; 255 356: 8d 93 st X+, r24 *p ++ = 0x04; 358: 84 e0 ldi r24, 0x04 ; 4 35a: 81 83 std Z+1, r24 ; 0x01 35c: fd 01 movw r30, r26 35e: 31 96 adiw r30, 0x01 ; 1 *p ++ = from; 360: 11 96 adiw r26, 0x01 ; 1 362: 2c 93 st X, r18 *p ++ = to; 364: 61 83 std Z+1, r22 ; 0x01 366: 32 96 adiw r30, 0x02 ; 2 pp = (unsigned short)p; if ( (pp >> 8) == ((RAM_END - 0x100) >> 8) ) p = ring_start; RingPointer = p; 368: 2f 01 movw r4, r30 sei(); 36a: 78 94 sei
register unsigned char * RingPointer asm( "r4" ); unsigned char * volatile ring_start = (unsigned char*) RAM_START;
Where is
if ( (pp >> 8) == ((RAM_END - 0x100) >> 8) ) p = ring_start;
?!
Does it work in new version of GCC? What with register variables in newer version of GCC?
Ilya
ps: This is work:
if ( (pp & 0xFF00) == ((RAM_END - 0x100) & 0xFF00) ) p = ring_start;