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

LPC2148 - sprawdzony projekt bez FreeRTOS, kompilacja pod GCC

Szymon Tarnowski 18 Mar 2015 23:41 1224 10
REKLAMA
  • #1 14542220
    Szymon Tarnowski
    Poziom 27  
    Posty: 1292
    Pomógł: 61
    Ocena: 181
    Witam,
    Mam moduł z propoxu LPC2148 i kawałek płytki bez JTAGa. Podczas próby napisania czegokolwiek lepszego niż miganie diodą LED czy wysyłanie znaków po UART napotkałem problem z brakiem jakiegoś sprawdzonego zestawu: header procesora, skrypt linkera, newlib/syscalls. Niby wszystko jest dostępne w sieci, ale jak trzeba to poskładać to wychodzi potrzeba poprawiania, a diagnozowanie swoich poprawek na cudzym kodzie, który nie ma gwarancji że zadziała przypomina walkę z wiatrakami. Czy może ktoś polecić jakiś sprawdzony przykładowy projekt który da się skompilować pod GCC i nie będzie używał FreeRTOS (czy innnego systemu)?
  • REKLAMA
  • REKLAMA
  • #4 14542567
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Ale pewnie zobaczysz LPC2103. Różnice między tymi dwoma układami są kosmetyczne - w całym projekcie będziesz musiał poprawić sobie tylko rozmiar pamięci w skrypcie linkera. Istnieje pewna bardzo niewielka szansa, że kod włączający PLL czy GPIO będzie miał jakieś różnice, ale nie sądzę, a poza tym i tak nie powinno Ci to przeszkadzać, skoro szukasz szablonu a nie projektu migającego diodami.

    No chyba że szukasz rozwiązania podanego na talerzu, to faktycznie go tam nie znajdziesz...

    4\/3!!
  • #5 14544652
    Szymon Tarnowski
    Poziom 27  
    Posty: 1292
    Pomógł: 61
    Ocena: 181
    Chyba się nie zrozumieliśmy, ten projekt to mniej więcej tyle samo co napisałem samemu. Brakuje implementacji funkcji z syscalls np _sbrk() a na tym utknąłem. Jeśli źle sformułowałem pierwotne zapytanie to przepraszam.
  • REKLAMA
  • #6 14544984
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Szymon Tarnowski napisał:
    Brakuje implementacji funkcji z syscalls np _sbrk() a na tym utknąłem.

    Implementacja funkcji _sbrk_r() (funkcjonalna) i pozostałych syscallsów (niefunkcjonalne - "stuby") do pobrania z mojej strony w dziale Download > ARM > Różne > syscalls. Funkcja _sbrk_r() dopasowana jest do skryptów linkera z przykładów, w przykładzie dla LPC2103 mogą występować jakieś minimalne różnice w nazwach, bo ten przykład jest dosyć stary.

    4\/3!!
  • #7 14545012
    Szymon Tarnowski
    Poziom 27  
    Posty: 1292
    Pomógł: 61
    Ocena: 181
    Freddie Chopin napisał:
    Implementacja funkcji _sbrk_r() (funkcjonalna) i pozostałych syscallsów (niefunkcjonalne - "stuby") do pobrania z mojej strony w dziale Download > ARM > Różne > syscalls. Funkcja _sbrk_r() dopasowana jest do skryptów linkera z przykładów, w przykładzie dla LPC2103 mogą występować jakieś minimalne różnice w nazwach, bo ten przykład jest dosyć stary.
    Tak zgadzam się odkryłem to dwa dni temu, w sumie Twoja wersja niewiele się różni od innych wersji z internetu, ale nadal nie udało się tak dopasować wszystkie pliki żeby zadziałały. Projekt się builduje ale zawiesza przy wykonaniu printf'a, próbowałem implementację printf'a wkleić na żywca do swojego kodu i debugować go LEDami, ale wyglądało jakby się zawieszał na czymś trywialnym np na warunku pętli for.
    Dlatego poszukuję sprawdzonego kompletnego "gotowca", a najlepiej jeszcze takiego którego emIDE łyknie od ręki.
  • #8 14545113
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    printf() używa okrutnych ilości RAM, więc zacząłbym od tego. Jeśli nie wyświetlasz liczb z przecinkiem, to użyj iprintf() - wersja ta nie obsługuje zmiennego przecinka, ale za to zajmuje mniej pamięci flash i chyba trochę mniej RAM. Do tego printf() wymaga funkcjonalnego syscallsa _write_r(), więc na "pierwszy ogień" lepiej zacząć od sprintf() (lub siprintf()).

    Gwarantuję Ci, że _sbrk_r() który jest udostępniony działają prawidłowo (w połączeniu z odpowiednim skryptem linkera) - sam używam go od lat.

    4\/3!!
  • #9 14545165
    Szymon Tarnowski
    Poziom 27  
    Posty: 1292
    Pomógł: 61
    Ocena: 181
    Freddie Chopin napisał:
    printf() używa okrutnych ilości RAM, więc zacząłbym od tego. Jeśli nie wyświetlasz liczb z przecinkiem, to użyj iprintf() - wersja ta nie obsługuje zmiennego przecinka
    W projekcie potrzebuje liczb z przecinkami, niekoniecznie muszą być float'y bo to tylko temperatura, więc w ostateczności mógłbym customizować jakiegoś printf'a żeby w integery wstrzeliwał mi przecinek. Nie wiem jeszcze jak zrobić własny odpowiednik sscanf'a bo nie próbowałem nawet, ale pewnie dałby się też napisać własną implementację. Tylko po to chciałem użyć gotowych printf/sscanf żeby przynajmniej do prototypu się nie narobić.

    Freddie Chopin napisał:
    Gwarantuję Ci, że _sbrk_r() który jest udostępniony działają prawidłowo (w połączeniu z odpowiednim skryptem linkera) - sam używam go od lat.
    Wierze Tobie, ten plik nie jest jakoś odkrywczy, w sieci jest wiele wersji które różnią się pewnym detalami jak nazwami stałych heap z linkera, czy sposobem dogrzebania do SP, ale koncepcja jest taka sama.

    Właśnie eksperymentuje z http://pages.cs.wisc.edu/~klingens/files/rprintf.c i procesor mi zdycha gdzieś w okolicy
    do {
          *cp++ = digits[(int)(num % base)];
          } while ((num /= base) > 0);
    Kod pewnie bardzo podobny do tej domyślnej implementacji którą dają w bibliotekach gnu i pewnie na tym samym się wywala. Mnie to pachnie problemami ze stosem, ale to dopiero jutro będę dalej walczyć.
  • REKLAMA
  • #10 14545382
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Szymon Tarnowski napisał:
    w ostateczności mógłbym customizować jakiegoś printf'a żeby w integery wstrzeliwał mi przecinek

    Nie ma co "customizować", wystarczy odpowiednio wyświetlić. Przykładowo jakbyś chciał 2 miejsca po przecinku:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ze scanf() da się zrobić podobnie - czyli wczytać dwie liczby do dwóch zmiennych, tyle że trzeba zapisywać do dodatkowej zmiennej ile było znaków po kropce. Można to osiągnąć specyfikatorem %n, który musiałby zostać użyty dwukrotnie - przed częścią po kropce i za częścią po kropce - coś takiego: "%u.%n%u%n".

    4\/3!!

Podsumowanie tematu

✨ Użytkownik poszukuje sprawdzonego projektu dla modułu LPC2148, który można skompilować pod GCC bez użycia FreeRTOS. Napotyka trudności w implementacji funkcji syscalls, takich jak _sbrk(), oraz w poprawnym działaniu printf(). Odpowiedzi sugerują, że różnice między LPC2148 a LPC2103 są kosmetyczne, a implementacje syscalls można znaleźć w sieci. Użytkownik eksperymentuje z różnymi wersjami printf() i rozważa własne implementacje, aby dostosować funkcjonalność do swoich potrzeb. Wskazówki dotyczą również optymalizacji pamięci przy użyciu iprintf() oraz metod wyświetlania liczb z przecinkami.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA