[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x0
From: |
Senthil Kumar Selvaraj |
Subject: |
Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2 |
Date: |
Thu, 18 Apr 2013 10:47:49 +0530 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Wed, Apr 17, 2013 at 08:52:57PM -0400, Kirill Shklovsky wrote:
> Dear avr-gcc-ers:
>
> It appears that a global SRAM uint8_t variable is placed at address
> 0x060 by avr-gcc versions 4.6.2 and 7.3.2. The avr-gcc compiler was
> compiled on cygwin. For example, given the followign AVR cpp code:
>
> volatile uint8_t latchingFlag;
>
> int main() {
>
> LED_PORT &= ~(1<<LED_BIT);
> DDRD = 0xFF;
> for (;;) {
> latchingFlag=1;
> if (latchingFlag==0) {
> LED_PORT ^= 1<<LED_BIT; // Toggle the LED
> _delay_ms(100);
> latchingFlag = 1;
> }
> }
> }
>
> The disassembly for the conditional looks as follows:
>
> if (latchingFlag==0) {
> a0: 80 91 60 00 lds r24, 0x0060
> a4: 81 11 cpse r24, r1
> a6: fa cf rjmp .-12 ; 0x9c <main+0xc>
>
> At the same time, compiling this on avr-gcc 4.7.0 on Ubuntu I get:
>
> lds r24, 0x0100
>
> Presumably 0x0100 is correct, since on ATmega 0x0060 is actually
> mapped to the WDTCSR register, if I understand it correctly. Is this
> a problem with the way I built avr-gcc or is this not an avr-gcc
> issue?
>
I don't see the problem when I tried compiling the below code with 4.6.2.
Can you paste the command line you used, with -v and -Wl,--verbose turned on?
It would be helpful to know what version of binutils was used, as well as the
build steps.
#include <stdint.h>
volatile uint8_t x;
int main()
{
x = 1;
return x;
}
When I compile with
/proj/builds/3.4.0/avr/install/bin/avr-gcc -mmcu=atmega328p -v test.c
I get
COLLECT_GCC=/proj/builds/3.4.0/avr/install/bin/avr-gcc
COLLECT_LTO_WRAPPER=/data2/builds/3.4.0/avr/install/bin/../libexec/gcc/avr/4.6.2/lto-wrapper
Target: avr
Configured with: /proj/builds/3.4.0/avr/gcc-4.6.2/configure
--prefix=/proj/builds/3.4.0/avr/install --target=avr --enable-languages=c,c++
--disable-nls --disable-libssp --with-dwarf2
Thread model: single
gcc version 4.6.2 (GCC)
COLLECT_GCC_OPTIONS='-mmcu=atmega328p' '-v'
/data2/builds/3.4.0/avr/install/bin/../libexec/gcc/avr/4.6.2/cc1 -quiet -v
-imultilib avr5 -iprefix
/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/ test.c -quiet
-dumpbase test.c -mmcu=atmega328p -auxbase test -version -o /tmp/cctr0ZVY.s
GNU C (GCC) version 4.6.2 (avr)
compiled by GNU C version 4.1.2 20080704 (Red Hat 4.1.2-52), GMP
version 4.3.2, MPFR version 2.4.2, MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C (GCC) version 4.6.2 (avr)
compiled by GNU C version 4.1.2 20080704 (Red Hat 4.1.2-52), GMP
version 4.3.2, MPFR version 2.4.2, MPC version 0.8.2
COLLECT_GCC_OPTIONS='-mmcu=atmega328p' '-v'
/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/../../../../avr/bin/as
-mmcu=atmega328p -o /tmp/ccCbCXlO.o /tmp/cctr0ZVY.s
COMPILER_PATH=/data2/builds/3.4.0/avr/install/bin/../libexec/gcc/avr/4.6.2/:/data2/builds/3.4.0/avr/install/bin/../libexec/gcc/:/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/../../../../avr/bin/
LIBRARY_PATH=/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/avr5/:/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avr5/:/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/:/data2/builds/3.4.0/avr/install/bin/../lib/gcc/:/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/
COLLECT_GCC_OPTIONS='-mmcu=atmega328p' '-v'
/data2/builds/3.4.0/avr/install/bin/../libexec/gcc/avr/4.6.2/collect2 -m avr5
-Tdata 0x800100
/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avr5/crtm328p.o
-L/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/avr5
-L/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avr5
-L/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2
-L/data2/builds/3.4.0/avr/install/bin/../lib/gcc
-L/data2/builds/3.4.0/avr/install/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib
/tmp/ccCbCXlO.o -lgcc -lc -lgcc
The -Tdata 0x800100 tells the linker that the data segment starts from
0x800100. The disassembly looks like this
000000a6 <main>:
a6: cf 93 push r28
a8: df 93 push r29
aa: cd b7 in r28, 0x3d ; 61
ac: de b7 in r29, 0x3e ; 62
ae: 81 e0 ldi r24, 0x01 ; 1
b0: 80 93 00 01 sts 0x0100, r24
b4: 80 91 00 01 lds r24, 0x0100
b8: 88 2f mov r24, r24
ba: 90 e0 ldi r25, 0x00 ; 0
bc: df 91 pop r29
be: cf 91 pop r28
c0: 08 95 ret
> Any help would be appreciated.
>
> Kirill
>
> _______________________________________________
> AVR-GCC-list mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/avr-gcc-list
- [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2, Kirill Shklovsky, 2013/04/17
- Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2,
Senthil Kumar Selvaraj <=
- Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2, Kirill Shklovsky, 2013/04/18
- Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2, Senthil Kumar Selvaraj, 2013/04/18
- Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2, Kirill Shklovsky, 2013/04/18
- Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2, Senthil Kumar Selvaraj, 2013/04/18
- Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2, Kirill Shklovsky, 2013/04/18
Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2, Jan Waclawek, 2013/04/18