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

[LPC1768][CodeSourcery lite/Yagarto] Wykorzystanie sprintf, kłopoty z działaniem

morurd 18 Lis 2011 16:51 2410 10
REKLAMA
  • #1 10153136
    morurd
    Poziom 11  
    Posty: 44
    Pomógł: 1
    Ocena: 1
    Witam!
    Mam nietypowy problem.
    Otóż postanowiłem wykorzystać w trakcie programowania biblioteki standardowe, głównie funkcję sprintf która bardzo przypadła mi do gustu. Mnóstwo problemów miałem, aby zostało skompilowane (problem z "_sbrk"), ale w końcu się udało. I tutaj kolejny poważny problem... którego niestety nie jestem w stanie przeskoczyć.

    Kiedy używam funkcji sptintf do zmiany na ciąg znaków liczby typu int nie ma problemu. Kłopoty się pojawiają kiedy chce to samo zrobić z floatem. Program wywala się i ucieka do Hard Fault'a. Jakieś pomysły? Mi się wszystkie skonczyly
    próbowałem głównie bawić się flagami kompilatora
    aktualne ustawienie:
    COMPILER_FLAGS=-c -g -mcpu=cortex-m3 -O0 -Wall -ffunction-sections -fdata-sections -mthumb -mfix-cortex-m3-ldrd -Iinc -Ilib/Core/CM3 -Idrivers/inc

    sprawdzalem też 2 różne kompilatory... niestety nie dziala.
  • REKLAMA
  • #2 10153233
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Stosy muszą być wyrównane do 8, a _sbrk() musi działać prawidłowo. Przykładowe projekty z mojej stronki + syscalls (również do pobrania) obsługują (s)printfa bezproblemowo (pomijając rozmiar tej biblioteki, więc stworzyłem też kiedyś "zalążek" prostszego printfa do łatwej rozbudowy - również do pobrania [; ).

    4\/3!!
  • REKLAMA
  • #3 10153311
    morurd
    Poziom 11  
    Posty: 44
    Pomógł: 1
    Ocena: 1
    Freddie Chopin napisał:
    Stosy muszą być wyrównane do 8

    nie za bardzo rozumiem o co chodzi... wrzucę skrawek linkera
       .text :
       {
          _stext = .;          /* Provide the name for the start of this section */
          
          CREATE_OBJECT_SYMBOLS
          KEEP(*(.vectors))
          
          *(.text)
          *(.text.*)
                
          . = ALIGN(4);        /* Align the start of the rodata part */
          *(.rodata)
          *(.rodata.*)
          
          . = ALIGN(4);        /* Align the end of the section */
       } > FLASH = 0
       _etext = .;             /* Provide the name for the end of this section */


    chodzi o ALIGN ?


    Freddie Chopin napisał:
    _sbrk() musi działać prawidłowo. Przykładowe projekty z mojej stronki + syscalls (również do pobrania) obsługują (s)printfa bezproblemowo

    pobrałem Twoje syscalls... i tu moje pytanie, troche mi głupio, ale jaką flage trzeba dodać, aby kompilator ignorował przypisywanie do samego siebie?


    Freddie Chopin napisał:
    pomijając rozmiar tej biblioteki, więc stworzyłem też kiedyś "zalążek" prostszego printfa do łatwej rozbudowy - również do pobrania [;

    to co stworzyleś nie potrzebuje już nic więcej? jak tylko dotrę do domu przejrzę to dokładnie i sprawdzę czy działa
  • #4 10153726
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    morurd napisał:
    chodzi o ALIGN ?

    Dokładnie, chodzi o ALIGN, ale nie tylko, bo generalnie ALIGNem wyrównujesz początek, a chodzi o wyrównanie końca... <: Wszystko zależy od konkretnej konstrukcji skryptu linkera i startupa... Zobacz jak to jest zrobione w moich przykładach (stm32).

    Cytat:
    jaką flage trzeba dodać, aby kompilator ignorował przypisywanie do samego siebie?

    On je ignoruje przecież - nie jest do tego generowany kod, a takowa konstrukcja wyłącza warninga który by się pojawił na temat nieużywanego parametru.

    Cytat:
    to co stworzyleś nie potrzebuje już nic więcej?

    Potrzebna jest implementacja itoa na przykład - również do ściągnięcia. To co tam zrobiłem obsługuje tylko stringi, chary oraz inty, ale dołożenie dodatkowych elementów jest w miarę proste - konstrukcja jest łatwa do "ogarnięcia". Floaty na string skonwertujesz np funkcją gvcvt() albo gcvtf(), tyle że one pewnie nie są zbyt lekkie i wymagają różnych syscalls, więc zawsze możesz napisać coś swojego [; Sprintf jest fajny, bo obsługuje wszystkie możliwe opcje, kombinacje i wyjątkowe sytuacje, ale... 20kB kodu, około 700B stosu + obsługa malloc() itd.

    4\/3!!
  • #5 10157104
    morurd
    Poziom 11  
    Posty: 44
    Pomógł: 1
    Ocena: 1
    Witam ponownie! Odkopuję temat. użyłem Twojego skryptu linkera od stm32 (zmienilem tylko sekcję memory i o dziwo działa), do tego wrzuciłem Twoje callbacki. niestety... wywala mnie przy sprintf. mało tego wcześniej działał dla zmiennych typu int, a przy floatach się wywalal.. teraz niestety wywala się przy obu... jeszcze jakies propozycję? generalnie obejdę się bez tej funkcji.. ale strasznie mnie drażni fakt, że nie mogę tego zrobić :/
  • #6 10157247
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Poza skryptem linkera istotny jest jeszcze startup (; Generalnie większość tych bazowych plików w jakiś sposób jest zależna od siebie nawzajem. Do sprintfa potrzebujesz około 1kB pamięci na stosie (na samego sprintfa!), więc szukaj problemu np tam.

    4\/3!!
  • REKLAMA
  • #7 10157293
    morurd
    Poziom 11  
    Posty: 44
    Pomógł: 1
    Ocena: 1
    hmmm no nic, przekopie jeszcze Twoje przykłady... generalnie potrzebuje tego do sprawdzenia poprawności... najwyżej sam coś napiszę, to nie tak problem ;). A 1kB przy 512 to nie tak wiele ;). Jutro napiszę co i jak udało mi się zrobić.
    A co do startupa, uzywam jakiegos armowego pliku C. przyjżę się Twojemu i wtedy moze cos wlasnego napiszę
  • REKLAMA
  • #8 10157391
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    morurd napisał:
    A 1kB przy 512 to nie tak wiele

    1kB pamięci RAM na stos, bo flasha printf zajmuje ze 20kB.

    Generalnie "sypanie" się programu sugerowałoby przepełnienie stosu, bo wszystkie pozostałe problemy skutkowały głupimi wynikami (typu zawsze zero albo jakieś totalnie abstrakcyjne wartości).

    4\/3!!
  • #9 10164891
    morurd
    Poziom 11  
    Posty: 44
    Pomógł: 1
    Ocena: 1
    Witam ponownie!
    Postanowiłem zostawić narazie temat printf'a, ze względu na niski dla mnie priorytet tej funkcji, spokojnie obchodzę się bez niej. Natomiast pojawił się kolejny problem, którego juz nie moge obejść/przeskoczyć/oszukać. Postanowiłem podpiąć go do tego tematu, ponieważ myślę, że przyczyna jest ta sama.
    Przy wywoływaniu funkcji z math.h (sqrt, asin, atan2 itp.) program ucieka do hard faulta i teraz za chiny nie wiem dlaczego... normalne działania na liczbach typu float mogę wykonywać, po wywolaniu tych funkcji ucieka mi do HF... używam linkera od Freddiego i jego syscalls. Do tego startup z jakiś przykładów pisany w C, nie moge znaleźć narazie źródła, jak się dokopię to wrzucę tutaj. może ktoś miał podobny problem? Interesuje mnie wykorzystanie tego proca jako DSP, więc matma by się przydała... z LPC2000 nie mialem w tej kwestii żadnych problemów...
  • Pomocny post
    #10 10164907
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Weź wszystkie podstawowe pliki (startup, skrypt linkera, tablicę wektorów, Makefile) z jednego źródła, bo jak je mieszasz to nigdy nie wiadomo co nie zadziała.

    4\/3!!
  • #11 10171620
    morurd
    Poziom 11  
    Posty: 44
    Pomógł: 1
    Ocena: 1
    Witam po raz ostatni. Pomogło wykorzystanie Twojego skryptu do spółki z Twoim linkerem. Bazowałem na projekcie z stm32. Działa teraz bez zarzutu. Wielkie dzięki!

Podsumowanie tematu

✨ Użytkownik napotkał problemy z używaniem funkcji sprintf w kontekście programowania na mikrokontrolerze LPC1768, szczególnie przy konwersji typów float, co prowadziło do błędów typu Hard Fault. Po początkowych problemach z kompilacją i funkcją _sbrk, użytkownik próbował różnych flag kompilatora oraz skryptów linkera. Ostatecznie, po zastosowaniu skryptu linkera i syscalls z projektu STM32, problem został rozwiązany. Użytkownik zauważył, że do poprawnego działania sprintf potrzebne jest odpowiednie wyrównanie pamięci oraz wystarczająca ilość pamięci RAM na stos. Dodatkowo, pojawił się nowy problem z funkcjami matematycznymi z biblioteki math.h, które również prowadziły do Hard Fault, co sugerowało problemy z konfiguracją plików startowych i linkera.
Wygenerowane przez model językowy.
REKLAMA