Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

morurd 18 Lis 2011 16:51 2038 10
  • #1 18 Lis 2011 16:51
    morurd
    Poziom 10  

    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:

    Code:
    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.

    0 10
  • #2 18 Lis 2011 17:13
    Freddie Chopin
    Specjalista - Mikrokontrolery

    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!!

    0
  • #3 18 Lis 2011 17:32
    morurd
    Poziom 10  

    Freddie Chopin napisał:
    Stosy muszą być wyrównane do 8

    nie za bardzo rozumiem o co chodzi... wrzucę skrawek linkera
    Code:
       .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

    0
  • #4 18 Lis 2011 19:10
    Freddie Chopin
    Specjalista - Mikrokontrolery

    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!!

    0
  • #5 19 Lis 2011 17:40
    morurd
    Poziom 10  

    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ć :/

    0
  • #6 19 Lis 2011 18:05
    Freddie Chopin
    Specjalista - Mikrokontrolery

    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!!

    0
  • #7 19 Lis 2011 18:15
    morurd
    Poziom 10  

    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ę

    0
  • #8 19 Lis 2011 18:32
    Freddie Chopin
    Specjalista - Mikrokontrolery

    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!!

    0
  • #9 21 Lis 2011 14:16
    morurd
    Poziom 10  

    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...

    0
  • Pomocny post
    #10 21 Lis 2011 14:21
    Freddie Chopin
    Specjalista - Mikrokontrolery

    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!!

    0
  • #11 22 Lis 2011 23:50
    morurd
    Poziom 10  

    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!

    0
  Szukaj w 5mln produktów