eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaBiblioteka standardowa time.h i mikrokontrolery › Re: Biblioteka standardowa time.h i mikrokontrolery
  • Data: 2018-09-12 16:47:51
    Temat: Re: Biblioteka standardowa time.h i mikrokontrolery
    Od: "Grzegorz Niemirowski" <g...@p...onet.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Atlantis <m...@w...pl> napisał(a):
    > To rozwiązanie charakterystyczne dla STM32, czy stanowi ogólnie przyjęty
    > standard i mogę się spodziewać, że tak samo będzie się to robiło także w
    > przypadku innych rodzin MCU, a PIC32 jest tutaj jakimś wyjątkiem?

    ARM, nie STM32, dla ścisłości. Kompilator (gcc-arm-none-eabi) nawet nie wie,
    że jest takie coś jak STM32.
    Nie wiem jak jest na innych architekturach, z 32-bitowych używam tylko
    STM32. Ale w każdym razie z kompilatorem (jako programem) dostarczana jest
    też biblioteka języka C. Popularną biblioteką C dla mikrokontrolerów ARM
    jest newlib. I ona wymaga własnie _gettimeofday(), inaczej będzie błąd
    linkowania. Widocznie w bibliotece rozprowadzanej z kompilatorem dla PIC32
    to jest uproszczone, nie ma dodatkowych warstw w postaci _gettimeofday_r() i
    _gettimeofday() i trzeba od razu napisać time().

    > W ogóle istnieje gdzieś jakiś zasób, który tłumaczyłby w jaki sposób
    > spiąć niskopoziomowo standardową bibliotekę C z własnym sprzętem?

    Ogólnie jest tak, że w przypadku standardowych funkcji C komunikujących się
    z tym, co jest na zewnątrz aplikacji (czas, pliki, standardowe we/wy,
    dynamiczna alokacja pamięci), funkcje te wywołują funkcje systemu
    operacyjnego (system calls - syscalls). Ponieważ na mikrokontrolerze nie ma
    systemu operacyjnego, trzeba właśnie te funkcje systemowe napisać samemu.
    Dlatego jeśli chodzi o ARM GCC, możesz napotkać na posty ludzi, którym
    linker wywala brak funkcji _write(), _read(), czy _sbrk(). Więc odpowiadając
    na Twoje pytanie, to nie znam takiego jednego zasobu, ale googlałbym po
    słowach kluczowych newlib syscalls arm. Można znaleźć np.
    https://balau82.wordpress.com/2010/12/16/using-newli
    b-in-arm-bare-metal-programs/
    Przykładowy plik syscalli z minimalnymi funkcjami:
    https://github.com/ROBOTIS-GIT/OpenCR/blob/master/ar
    duino/opencr_develop/opencr_bootloader/common/bsp/op
    encr/cfg/syscalls.c
    Dzięki temu, że piszesz własną implementację syscalli możesz np.
    przekierować printf() (bo on woła pod spodem _write()) na port szeregowy
    albo konsolę semihostingu:
    int _write(int file, char *ptr, int len)
    {
    if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) {
    for (int DataIdx = 0; DataIdx < len; DataIdx++)
    {
    SH_SendChar(*ptr++);
    }
    }
    return len;
    }

    --
    Grzegorz Niemirowski
    https://www.grzegorz.net/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: