Sida 1 av 1

ARM LPC2104 float to string???

Postat: 3 februari 2007, 00:40:38
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

Postat: 3 februari 2007, 00:54:40
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);

Postat: 3 februari 2007, 03:59:45
av cosmox
Eller:

Kod: Markera allt

float pi = 3.141592.....

Postat: 3 februari 2007, 08:25:34
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.

Postat: 3 februari 2007, 08:54:02
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å.

Postat: 3 februari 2007, 09:12:22
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...

Postat: 3 februari 2007, 11:09:29
av karlstedt
Löser det sig inte med sprintf() kan du väl använda dtostrf() eller motsvarande...

Postat: 3 februari 2007, 11:22:23
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 :)

Postat: 3 februari 2007, 13:27:03
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?

Postat: 3 februari 2007, 19:50:16
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

Postat: 4 februari 2007, 03:58:51
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

Postat: 4 februari 2007, 12:43:59
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 :)