2012-10-25 36 views
7

Pracuję nad stworzeniem systemu wbudowanego (Cortex M3). Aby przesłać niektóre dane z urządzenia do portu szeregowego (aby pokazać na ekranie komputera), używam niektórych własnych funkcji za pomocą metody putchar().Dowolna funkcja zamiast sprintf() w C? rozmiar kodu jest zbyt duży po kompilacji

Kiedy chcę wysłać całkowitą lub pływak, używać sprintf() w celu przekształcenia ich do łańcucha znaków i wysyłając je do portu szeregowego.

Problem polega na tym, że używam Keil uVision IDE i jest to wersja limitowana z maks. 32 KB. Ilekroć wywołuję sprintf() w różnych funkcjach, nie wiem, dlaczego rozmiar kodu po kompilacji wzrosła zbyt wiele. Przeszedłem już 32 KB i zastanawiam się, że muszę zmienić niektóre z moich funkcji i użyć czegoś innego zamiast sprintf!

Jakaś wskazówka?

+7

Staraj się unikać "float", ponieważ ich elementy biblioteki wykonawczej są w większości przypadków dość duże i wolne. – glglgl

+1

Rodzina printf jest bardzo kosztowna, ponieważ wymaga dużej ilości kodu, szczególnie w przypadku zmiennoprzecinkowej. Liczba całkowita printf jest niewielka, ale wciąż kosztowna. Czy naprawdę myślisz, że potrzebujesz printf() w swoim wbudowanym kodzie mikrokontrolera? Możesz wdrożyć własne, znacznie tańsze rozwiązania. –

+0

Zobacz także dostępne biblioteki dostawców kompilatora. Często zdarza się, że wiele bibliotek C-std ma wiele zalet, a funkcjonalność jest mniejsza. Na przykład sprintf, który obsługuje int i float, ale nie notację naukową. –

Odpowiedz

0

Możesz wypróbować lub ftoa() i zaimplementować je jako swoje wymaganie. Mam na myśli, że konwertując je do postaci wewnątrz samej definicji, należy użyć bezpośrednio do drukowania putchar().

To powinno działać, jak sądzę.

+3

Nie ma funkcji zwanej itoa ani ftoa w języku C. – Lundin

+0

@Lundin: można zapisać jako swoje wymaganie ... lub dołączyć te pliki ... itoa i ftoa są w tych plikach nagłówkowych lub Omkant

+0

nie ma tu Itoa() i ftoi() w C. (Nie wiem, czy to naprawdę istnieje w C++) – Django

6

Jeśli chcesz, aby był wydajny, najlepszym sposobem jest prawdopodobnie samodzielne jego kodowanie lub odnalezienie w nim już napisanego kodu. Int konwersji ciąg jest jednak bardzo proste, każdy programista może napisać, że w mniej niż 30 minut. Konwersja Float na string jest nieco bardziej skomplikowana i zależy od użytego formatu zmiennoprzecinkowego.

Dla wygody, o to prosty algorytm int do łańcucha do zastosowań mikrokontrolerów:

void get_dec_str (uint8_t* str, size_t len, uint32_t val) 
{ 
    uint8_t i; 
    for(i=1; i<=len; i++) 
    { 
    str[len-i] = (uint8_t) ((val % 10UL) + '0'); 
    val/=10; 
    } 

    str[i-1] = '\0'; 
} 
+2

Nie jestem pewien, czy jest to szalenie szybka/wydajna funkcja, jeśli twoje mikro nie ma dzielnika sprzętowego ... (lub modulusa :). Chociaż nie mam lepszej opcji z mojej głowy! –

+3

@MartinThompson Nie jestem pewien, czy jest wiele do zrobienia, dziesiętne są oparte na 10, ale komputery wolą 2/4/8/16/32-based. Poza tym wolałbym pozostawić optymalizację kompilatorowi. – Lundin

+1

fair comment re: pozostawienie optymalizacji kompilatorowi –

9

Dwa potencjalne ofiary (z których żadna nie użyłem sobie - moi dostawcy kompilator zwykle dostarczają uproszczoną printf dla osadzonego użytku):

http://eprintf.sourceforge.net/ - [wrzesień 2017: niestety, wydaje się, że odszedł, ale kod źródłowy nadal tutaj: https://sourceforge.net/projects/eprintf/files/]

http://www.sparetimelabs.com/tinyprintf/index.html - 2 pliki, około 1,4 KB kodu. Opcja włączenia "longs" (oznacza większy rozmiar kodu). Obsługuje wiodące zera i szerokości pól. Brak wsparcia zmiennoprzecinkowego.

+1

Ponieważ strona 'eprintf' nie ma odnośników do rzeczywistego kodu, tutaj znajduje się link do projektu sourceforge eprintf: http://sourceforge.net/projects/eprintf/ –

+0

Podczas gdy link może odpowiedzieć na pytanie, lepiej w tym miejscu umieścić istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ recenzja/niskiej jakości-posts/17459102) – StoryTeller

+0

@StoryTeller - zwykle zgadzam się, ale nie jestem pewien, czy podsumowanie treści pomaga, jeśli linki znikają (jak widzę jeden z mają one :(- kiedy po prostu oferuję linki do kodu źródłowego zamiast prawdziwej "odpowiedzi". –