mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++;
}
....

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank,

ich werde es gleich mal ausprobieren.

Beste Grüße
Thomas

Autor: Tobias Eckhardt (doenges2)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.