logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[STM32F0X] [STM32F0X][C][Eclipse] - Jak dodać sprintf bez floatów i rozwiązać brak _sbrk?

xadamus 02 Kwi 2014 12:52 1104 8
REKLAMA
  • #1 13468062
    xadamus
    Poziom 10  
    Posty: 53
    Ocena: 1
    Witam.
    Chcialem uzyc funkcji sprintf w kodzie, ale najwyrazniej program wymaga dołączenia jakis bibliotek.
    Standardowe bibliotek nie wystaczają, linker nie moze znalezc funkcji _sbrk itp.
    Czy ktos moglby wyjasnic o co dokladnie chodzi ?
    Dodatkowo sa tez zoptymalizowane funkcje sprintf bez uzycia floatow (oszczednosc miejsca) - jak spowodowac ze doda sie do projektu zamiast funkcji standarowych ?
  • REKLAMA
  • #2 13468096
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    słowo kluczowe: syscalls
  • #3 13468109
    xadamus
    Poziom 10  
    Posty: 53
    Ocena: 1
    Rozumiem ze w syscalls sa callbacki z funkcji bibliotecznych do obslugi alokacji pamieci itp.

    Jesli nie uzywam alokacji to czemu linker ich potrzebuje ? Przeciez linker ma mozliwosc usuwania nieuzywanych sekcji, wiec czemu tego nie robi ?
  • REKLAMA
  • #4 13468141
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    bo użyłeś printf?
  • #5 13468192
    xadamus
    Poziom 10  
    Posty: 53
    Ocena: 1
    To printnf alokuje dynamicznie pamiec ? nie uzywa stosu do przechowania parametrow ?
  • REKLAMA
  • REKLAMA
  • #7 13468286
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    Trzeba dodać funkcję:
    [/code]
    caddr_t _sbrk (int size)
    {
    extern char __heap_start;
    extern char __heap_end;
    static char *current_heap_end = &__heap_start;
    char *previous_heap_end;

    previous_heap_end = current_heap_end;

    if (current_heap_end + size > &__heap_end)
    {
    errno = ENOMEM;
    return (caddr_t) -1;
    }

    current_heap_end += size;

    return (caddr_t) previous_heap_end;
    }
    [code]
  • #8 13468352
    xadamus
    Poziom 10  
    Posty: 53
    Ocena: 1
    Skompilowalo sie i zlinkowalo.

    Wciaz jednak nie do konca rozumiem czemu tak sie zadziało w poprzednim przypadku. Czy jest mozliwosc uzycia bibliotek standardowych ktore nie uzywaja alokacji pamieci ?
  • #9 13468421
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    xadamus napisał:
    Skompilowalo sie i zlinkowalo.

    Wciaz jednak nie do konca rozumiem czemu tak sie zadziało w poprzednim przypadku. Czy jest mozliwosc uzycia bibliotek standardowych ktore nie uzywaja alokacji pamieci ?


    A co ci syscalls przeszkadza skoro już musisz z prinff korzystać?

Podsumowanie tematu

✨ Użytkownik napotkał problemy z użyciem funkcji sprintf w projekcie opartym na STM32F0X, ponieważ linker nie mógł znaleźć funkcji _sbrk, co sugerowało brak odpowiednich bibliotek. W odpowiedziach wyjaśniono, że syscalls są wymagane do obsługi alokacji pamięci, nawet jeśli użytkownik nie korzysta z dynamicznej alokacji. Zaproponowano również stworzenie własnej funkcji printf, aby uniknąć standardowych bibliotek, oraz dodanie funkcji _sbrk do projektu, co pozwoliło na skompilowanie i zlinkowanie kodu. Użytkownik pytał o możliwość użycia bibliotek standardowych, które nie wymagają alokacji pamięci.
Wygenerowane przez model językowy.
REKLAMA