ARM LPC2104 float to string???

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Tripp
Inlägg: 397
Blev medlem: 29 januari 2004, 08:14:39
Ort: Tullinge
Kontakt:

ARM LPC2104 float to string???

Inlägg av Tripp »

Hej jag har kört fast på en sak i c till ARM.

Detta blir mitt första ARM program.


Jag har installerat WINARM, kompilerat ett test program som skickar ut data på uart0, detta funkar fint.

Kod: Markera allt

uart0Puts("ARM LPC2104 Test by tripp 2007-02-02.\r\n");
men när jag försöker skicka ut en variabel blir det problem.
Redan när jag försöker att göra om min float till string
går det inte att kompilera.

Kod: Markera allt

   	float pi = 3.141596;
   	char chstring[8];
   	sprintf(chstring, "%f", pi);
Jag har googlat ett par timmar på detta men kan inte se löningen.

vet nån vad jag gör för fel.

Mvh Tripp
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

Kod: Markera allt

float pi = 3.141596;
char chstring[8];
sprintf(chstring, "%f", pi);
Accepterar verkligen sprintf() flera strängarguent???
Prova med:

Kod: Markera allt

float pi = 3.141596;
char chstring[8];
sprintf("%s%f", *chstring, pi);
cosmox
EF Sponsor
Inlägg: 3856
Blev medlem: 6 januari 2004, 02:11:54
Ort: Hjälteby - Tjörn

Inlägg av cosmox »

Eller:

Kod: Markera allt

float pi = 3.141592.....
Användarvisningsbild
Icecap
Inlägg: 26660
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Stinrew: din syntax för sprintf är fel!

Enl. "C - A reference manual" (ISBN 0-13-109802-0) är den:
sprintf(char * s, char * format <,additional argumenst>);

Alltså skriver Tripp rätt.

Tripp:
"Redan när jag försöker att göra om min float till string går det inte att kompilera."

Vad får du av felmeddelande då? Om du inte ens kan kompilera är det något annat fel, fel i float-rutinerna visar sig i run-time annars.
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

3.141596 = 8 ”char” men du reserverar bara för 7 tecken + avslutnings tecknet
Försök med att reservera 9 char istället så du får plats med avslutnings tecknet också.
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Sedan kan man även ange hur många decimaler som ska skrivas ut: %1.4f (1 siffra framför decimalavgränsaren och 4 efter) osv...
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Löser det sig inte med sprintf() kan du väl använda dtostrf() eller motsvarande...
Användarvisningsbild
ucadv
Inlägg: 203
Blev medlem: 29 januari 2007, 23:13:49

Inlägg av ucadv »

går inte att kompilera? vad får du för felmeddelande?

använder du IAR måste du välja att länka med "huge" biblioteket (eller vad den nu heter) för att få in stöd för flyttal i *printf(). troligen likadan i GCC och Keil.

du kan också skriva din egen float_to_string(), och spara några KB flash :)
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Tripp > Redan när jag försöker att göra om min float till string går det inte att kompilera.

Får du något felmeddelande? Där står antagligen vad du gjort för fel. Det spar enormt med tid om man postar eventuella felmeddelanden i samband med att man frågar på forumet. Det kan visa sig att det är en helt annan del av programmet som är fel än vad man tror.

Har du inkluderat/länkat rätt bibliotek för flyttal, om sådant finns?
Användarvisningsbild
Tripp
Inlägg: 397
Blev medlem: 29 januari 2004, 08:14:39
Ort: Tullinge
Kontakt:

Inlägg av Tripp »

Hej igen,

Tack för alla svar. :)

Jag har provat det ni tipsat om, men det vill inte ändå?

Som sagt e det mitt första program i c, så jag har inte full koll på tex linking och makefile.

Programet jag utgår ifrån är ett uart exempel.

Här kommer felmeddelandet:

Kod: Markera allt

Linking: main.elf
arm-elf-gcc -mcpu=arm7tdmi -I. -gdwarf-2 -DROM_RUN  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -MD -MP -MF .dep/main.elf.d main.o uart.o crt0.o  --output main.elf -nostartfiles -Wl,-Map=main.map,--cref -lc  -lm -lc -lgcc -TLPC2106-ROM.ld
c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(freer.o): In function `_malloc_trim_r':
mallocr.c:(.text+0x48): undefined reference to `_sbrk_r'
mallocr.c:(.text+0x64): undefined reference to `_sbrk_r'
mallocr.c:(.text+0x84): undefined reference to `_sbrk_r'
c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(makebuf.o): In function `__smakebuf':
makebuf.c:(.text+0x3c): undefined reference to `_fstat_r'
makebuf.c:(.text+0x110): undefined reference to `isatty'
c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(mallocr.o): In function `_malloc_r':
mallocr.c:(.text+0x424): undefined reference to `_sbrk_r'
mallocr.c:(.text+0x4cc): undefined reference to `_sbrk_r'
c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(stdio.o): In function `__sclose':
stdio.c:(.text+0xc): undefined reference to `_close_r'
c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(stdio.o): In function `__sseek':
stdio.c:(.text+0x30): undefined reference to `_lseek_r'
c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(stdio.o): In function `__swrite':
stdio.c:(.text+0x84): undefined reference to `_lseek_r'
stdio.c:(.text+0xac): undefined reference to `_write_r'
c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(stdio.o): In function `__sread':
stdio.c:(.text+0xd0): undefined reference to `_read_r'
collect2: ld returned 1 exit status
make.exe: *** [main.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:02
hoppas nån förstår vad detta betyder.

//Tripp
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Jag tycker det ser ut som du inte länkar med en del bibliotek som du tydligen använder i din kod. Nu kan jag inte mycket om just ARM specifika bilbliotek men det verkar vara bibliotek för standard I/O (stdio) och minne (mallocr) och sedan något med "makebuf" vad det nu är.

Kan vara att du har olika/fel versioner av biblioteken också. Det verkar hursomhelst att den linkern inte hittar vissa funktioner som används. Någon med mer erfarenhet av C-programmering på ARM kanske kan reda ut bättre vadför bibliotek som saknas.

Har du inkluderat alla nödvändiga "#include" filer i din källkod (<stdio.h> <memory.h> m.fl)?

EDIT: Hittade en länk till någon som ser ut att ha liknande problem nedan:
http://www.embeddedrelated.com/groups/A ... w/2008.php
Användarvisningsbild
ucadv
Inlägg: 203
Blev medlem: 29 januari 2007, 23:13:49

Inlägg av ucadv »

newlib som ersätter libc i mindre inbyggada behöver enligt dokumentationen några systemspecifika funktioner:

Kod: Markera allt

3.37 printf, fprintf, asprintf, sprintf, snprintf---format output 
Synopsis  	#include <stdio.h>

int printf(const char *format [, arg, ...]);
int fprintf(FILE *fd, const char *format [, arg, ...]);
int sprintf(char *str, const char *format [, arg, ...]);

...

Supporting OS subroutines required: close, fstat, isatty, lseek, read, sbrk, write.

Det kan hända att -lnewlib-lpc löser dina problem. Finns här, om din ARM-GCC installation saknar den. Ta även en titt på den här länken.


Edit: Kaggen hann före :)
Skriv svar