Forum: Mikrocontroller und Digitale Elektronik lpc2294: Fehlermeldung bei der Verwendung von sprintf


von Thomas (Gast)


Lesenswert?

Hallo Zusammen,

ich versuche gerade einen ADC  auszulesen und das Ergebnis über den UART 
zu schicken. (Ähnlich wie das bei einem Beispiel auf der nxp-Seite 
gezeigt wird.http: 
//www.standardics.nxp.com/support/documents/microcontrollers/pdf/tn06004 
.pdf  ).  Dazu habe ich einen Feld definiert, in den ich die 
Zeichenkette mit sprintf() einlese. Das klappt auch so lange, wie ich 
nur einen fest definierten Zeichensatz ausgebe. Sobald ich jedoch die 
Werte des ADC einlesen will (mit %2.2f) bekomme ich beim Compilieren den 
angehängten Fehler:
Ich arbeite mit dem YAGARTO-IDE (Eclipse).
Seltsam an der Sache ist, dass ich nirgends das Verzeichnis 
"newlib-1.14.0" finden kann. Nach ein wenig suchen im Netz, habe ich 
diese auch gefunden (http://sourceware.org/newlib/), weiss aber leider 
nicht, wie ich diese unter Windows und Eclipse einbinden  bzw. 
kompilieren soll. Ich bin um jede Hilfe und jeden Hinweis dankbar.

beste Grüße
Thomas

...
arm-elf-gcc -c -mcpu=arm7tdmi -O0 -gdwarf-2 -mthumb-interwork 
-fomit-frame-pointer -Wall -Wstrict-prototypes -fverbose-asm 
-Wa,-ahlms=src/adc.lst   -MD -MP -MF .dep/adc.o.d -I . -I ./inc 
src/adc.c -o src/adc.o
arm-elf-gcc ./src/crt.o ./src/main.o ./src/time.o ./src/serial.o 
./src/blinky.o ./src/adc.o -mcpu=arm7tdmi -nostartfiles 
-T./prj/olimex_lpce2294_ram.ld 
-Wl,-Map=test.map,--cref,--no-warn-mismatch    -o test.elf
c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:  region ram is full (test.elf section .text)
c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:  section .text [40000000 -> 40008a2b] overlaps section .data 
[40000000 -> 40000823]
c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:  section .bss [40000824 -> 400011ff] overlaps section .text 
[40000000 -> 40008a2b]
c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:  test.elf: section .text lma 0x40000000 overlaps previous 
sections
c:/programme/yagarto/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/li 
b\libc.a(syscalls.o):  In function `_sbrk':
../../../../../../newlib-1.14.0/newlib/libc/sys/arm/syscalls.c:500: 
undefined reference to `end'
collect2: ld returned 1 exit status
make: *** [test.elf] Error 1
make: Target `all' not remade because of errors.


Der Quellcode, an dem es wohl scheitert ist folgender:

...
char hallo[100];
Value1 = ADC_read(1);                   //Convert AIN0
word=((double)Value1) * (3.3/1024);
counter = sprintf(hallo, "%2.2f", word) ;
//Die einzelne char-Zeichen senden.
while(i<counter)
{
  putchar_1(hallo[i]);
  i++;
}
....

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Thomas wrote:
>...Ich arbeite mit dem YAGARTO-IDE (Eclipse).
> Seltsam an der Sache ist, dass ich nirgends das Verzeichnis
> "newlib-1.14.0" finden kann. Nach ein wenig suchen im Netz, habe ich
> diese auch gefunden (http://sourceware.org/newlib/), weiss aber leider
> nicht, wie ich diese unter Windows und Eclipse einbinden  bzw.
> kompilieren soll. Ich bin um jede Hilfe und jeden Hinweis dankbar.

Newlib ist in Yagarto bereit enthalten (die Dateien heissen libc.a und 
libm.a (für verschiedene Varianten).

> In function `_sbrk':
> ../../../../../../newlib-1.14.0/newlib/libc/sys/arm/syscalls.c:500:
> undefined reference to `end'

Im Linkerscript muss ein "end" bereitgestellt werden, welche die 
Startaddresse des Heaps festlegt (sbrk ist die "Verbindung" der libc zum 
Heap-Speicher. Üblicherweise durch eine Zeile PROVIDE (end = .); je nach 
Memory-Layout nach der Linker-Section für .bss oder die stacks.

Martin Thomas

von Thomas (Gast)


Lesenswert?

Hallo Martin,

vielen Dank für die Hilfe. Zumindest tritt der Fehler jetzt nicht mehr 
auf. Allerdings überschreibe ich wohl mehrmals den gleichen RAM? 
Zumindest laut Fehlermeldung:

c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:
region ram is full (test.elf section .text)
c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:
section .text [40000000 -> 40008a2b] overlaps section .data [40000000 ->
40000823]
c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:
section .bss [40000824 -> 400011ff] overlaps section .text [40000000 ->
40008a2b]
c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:
test.elf: section .text lma 0x40000000 overlaps previous sections

Ich verwende das Linker-Script, welches auf der Yagarto-Seite mit dem 
Test-Projekt "LPC2294Test.zip" dabei ist (Vgl. Anhang). Ich habe zwar 
nicht das Olimex-Board , sondern das von Phytec (lpc2295). woran kann 
das liegen. Bzw. wo finde ich Infos, um als "Laie" das Linker-Script 
anpassen kann.

Vielen Dank schon einmal.
Beste Grüße
Thomas

von mthomas (Gast)


Lesenswert?

c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:
region ram is full (test.elf section .text)
c:\programme\yagarto\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bi 
n\ld.exe:
section .text [40000000 -> 40008a2b] overlaps section .data [40000000 ->
40000823]

Sieht nach einem Linker-Skript aus, das auch den Programmcode in einen 
internen RAM-Speicherbereich legt (.text ab 0x40000000). Typisches 
Script für "RAM"-Debugging (da kein Flashen nötig weniger 
Einschränkgungen bei Breakpoints).stdio-Funktionen der newlib sind recht 
speicherhungrig, interner RAM-Speicher wohl zu klein dafür. 
Möglichkeiten u.a.
- Code in Flash-Speicher (Debugging "über JTAG" mühseliger)
- keine Fliesskommaformate in printf nutzen (als Integers vorberechnen): 
isprintf statt sprintf spart dann ein paar kB, evtl. dann sogar ganz auf 
stdio verzichten...
- kompakte ftoa-Funktion suchen und ausgabe per "uart_puts"
- vgl. Artikelsammlung Festkommaarithmetik

Martin Thomas

von Thomas (Gast)


Lesenswert?

Vielen dank,

ich werde es gleich mal ausprobieren.

Beste Grüße
Thomas

von Tobias E. (doenges2)


Lesenswert?

Hallo,


bin gerade auf diesen Forumbeitrag gestoßen.

Diesen Part versteh ich aber leider nicht: Im Linkerscript muss ein 
"end" bereitgestellt werden, welche die
Startaddresse des Heaps festlegt (sbrk ist die "Verbindung" der libc zum
Heap-Speicher. Üblicherweise durch eine Zeile PROVIDE (end = .); je nach
Memory-Layout nach der Linker-Section für .bss oder die stacks.

Ich benutze ein AT91 von ATMEL sowie die libc.a!

Mein Basispaket mit Linker usw habe ich aus einem Projekt namens "Using 
Open Source Tools for AT91SAM7S Cross Development revision C" dort lagen 
ein paar Beispiele bei. Yagarto - Ecplise ebenso.

Hat jemand einen Tip?
Vielen Dank im voraus.

Tobias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.