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

C - Dogrywanie funkcji do podstawowego wsadu uruchomionego w MCU - da się?

29 Lis 2016 11:03 702 9
  • Poziom 30  
    Witam szanownych kolegów! :)
    Miałem dylemat, czy temat zakładać tutaj, czy w mikrokontrolerach, ale zdecydowałem się tutaj, bo zagadnienie jest bardziej ogólne, nie na konkretny typ MCU (choć pewnie będzie ARM CM4). W razie czego proszę o przeniesienie do właściwszego działu.

    Może macie doświadczenie w poniżej opisanych operacjach lub chociaż jesteście w stanie rzucić hasłem, pod jakim tego szukać?

    Ale do rzeczy... W jednym z projektów bardzo by mi się przydała możliwość niezależnej kompilacji fragmentu kodu w C, zawierającego jakiś algorytm/filtr i wrzucania/modyfikowania go niezależnie od podstawowego wsadu.
    Idea byłaby taka, że cały kod bazowy mikrokontrolera, obsługa wszystkich peryferiów oraz funkcjonalność byłyby w kodzie podstawowym napisanym, skompilowanym i wgranym w standardowy sposób. Dodatkowo potrzebne by było powiązanie kilku funkcji wejść/wyjść na zasadzie podobnej do stosowania bibliotek, żeby dograny kod mógł w jakimś stopniu wykorzystywać oprogramowane zasoby MCU i wywoływać dostępne funkcje na zasadzie bibliotek.

    Jak mi się wydaje, że trzeba to zrobić, skorygujcie mnie i naprowadźcie, jeśli się mylę.

    1. Po stronie MCU
    - kod dogrywany należy wrzucić od jakiegoś predefiniowanego adresu, za kodem podstawowym
    - mikrokontroler we wsadzie podstawowym powinien mieć zaszyty "szkielet", w którym funkcje te są zadeklarowane i ich puste odpowiedniki umieszczone pod jakimś zdefiniowanym na sztywno adresem (?)
    - potrzebuję "mądrego" bootloadera, który będzie w stanie w razie potrzeby zaktualizować wsad podstawowy, albo podmienić tylko jedną z funkcji (dogrywanych algorytmów)

    2. Po stronie aplikacji PC
    - aplikacja obsługująca urządzenie powinna mieć okienko, w które można wstawić kod w C dogrywanej funkcji, albo możliwość zassania gotowego pliku .c z taką funkcją (lub kilkoma)
    - musiałby być jakiś skompilowany projekt z plikami nagłówkowymi, żeby dogrywana część potrafiła się dogadać z wsadem podstawowym? Ale istotna by była jakaś postać niejawna wsadu podstawowego... a może wystarczą same nagłówki?
    - fragment kodu należałoby skompilować z uwzględnieniem powyższego i powinien powstać plik .bin zawierający dogrywaną część
    - wysłanie pliku do urządzenia i zdanie się na update fragmentu flasha wykonany przez bootloader

    Jeszcze dodatkowe pytanie, czy trzeba deklarować maksymalną objętość poszczególnych funkcji przez definiowanie kolejnych sztywnych adresów, pod którymi funkcje się znajdują, czy można to jakoś zrobić na zasadzie aktualizacji tablicy wskaźników funkcji? Albo pojedynczego skoku do pierwszej funkcji, która domyślnie będzie pusta, a docelowo podmieniona kodem obsługi dodatkowych funkcji?

    W pierwszej kolejności poproszę o opinię, czy da się to zrobić i czy przytoczona koncepcja jest ok (lub jakie są lepsze) oraz mile widziane podpowiedzi z rodzaju jak :)

    Jeszcze inna rzecz, która mi przychodzi do głowy, to ewentualna kontrola nad takim wykonywanym kodem, żeby nie powodował on np. cyklicznego resetu, ubijając tym samym całe urządzenie... i tu do głowy przychodzi mi jakiś RTOS i tworzenie (i dogrywanie) wątków do niego, żeby ewentualnie ubić tylko problematyczny wątek ;)
  • Specjalista - Mikrokontrolery
    Na razie ściągnij sobie np UserManuala od LPC15xx i sprawdź jak to jest rozwiązane z wbudowanymi w ROM bibliotekami do obsługi peryferiów. Sprawdź czy ta koncepcja Ci odpowiada i czy o to Ci chodzi.
  • Poziom 30  
    Ok, poszukam, dzięki za cynk :spoko: . Póki co zacząłem również rozpoznanie na temat FreeRTOS, bo dotąd system nie był mi potrzebny, a w tym zastosowaniu może mieć zalety.
  • Specjalista - Mikrokontrolery
    krisRaba napisał:
    Jeszcze inna rzecz, która mi przychodzi do głowy, to ewentualna kontrola nad takim wykonywanym kodem, żeby nie powodował on np. cyklicznego resetu, ubijając tym samym całe urządzenie...
    krisRaba napisał:
    Póki co zacząłem również rozpoznanie na temat FreeRTOS, bo dotąd system nie był mi potrzebny, a w tym zastosowaniu może mieć zalety.

    Sam FreeRTOS nie da Ci tego czego oczekujesz, opisany przypadek porównaj do BSOD. Jak coś się dzieje nie tak, masz od tego wyjątki generowane przez CPU i w wyjątkach możesz szukać przyczyn i generować jakieś dane umożliwiające zidentyfikowanie problemu.
  • Poziom 30  
    Domyślam się, że nie będzie to działać na zasadzie wywrotki aplikacji pod Win ;) W sumie to rozpatrywałem to pod kątem możliwości działania funkcji podstawowych pomimo jakiejś pętli nieskończonej w algorytmie itp. Z drugiej strony fakt, jak to będzie działać na wskaźnikach, ktoś zrobi błąd i będzie wędrował i mieszał po całym RAMie, to podział na wątki niewiele mi tu pomoże ;) Musiałbym się jeszcze wgryźć, czy w tym kontekście są przewidziane jakieś ograniczenia, czy też na "babola" nie ma rady :)

    Faktycznie w ARMie jest szereg [coś]Fault'ów, więc można nawet zrobić mechanizm, który po jednym czy kilku fikołkach wyeliminuje problematyczny kod ustawiając jakąś flagę do czasu reakcji użytkownika lub wgrania nowego kodu i wcale nie trzeba do tego OS'a.
  • Specjalista - Mikrokontrolery
    krisRaba napisał:
    Z drugiej strony fakt, jak to będzie działać na wskaźnikach, ktoś zrobi błąd i będzie wędrował i mieszał po całym RAMie, to podział na wątki niewiele mi tu pomoże ;)

    Niektóre procesory z Cortexami od M3 mają MPU, więc na to też jest rada.
    krisRaba napisał:
    - potrzebuję "mądrego" bootloadera, który będzie w stanie w razie potrzeby zaktualizować wsad podstawowy, albo podmienić tylko jedną z funkcji (dogrywanych algorytmów)

    A nie lepiej dać jakąś kartę SD i ładować na bieżąco do RAMu i uruchamiać z RAMu?
  • Poziom 30  
    Poczytałem pobieżnie UM do LPC15xx i muszę przyznać, że ciekawe. Jeśli dobrze to zrozumiałem, to trochę tak jakby wrzucili do ROMu SPLa czy tam HALa, cokolwiek jest teraz na topie ;) I jeśli robią taką akcję, to ciężko już się wymiksować, że kod jest "for reference only" i dlatego optymalny nie jest ;) Mniej więcej o coś takiego mi chodzi, tylko jeszcze z własnymi funkcjami trochę wyższego poziomu.

    michalko12 napisał:
    A nie lepiej dać jakąś kartę SD i ładować na bieżąco do RAMu i uruchamiać z RAMu?

    Hmm, takie rzeczy, to dopiero rozgryzam. Widziałem kilkakrotnie opcję pracy z RAM i Flash w DS, szczególnie jak analizowałem zużycie prądu w poszczególnych trybach pracy, ale faktyczne wykorzystanie tych wariantów chyba jeszcze przede mną :). Możesz napisać coś więcej? Masz na myśli cały wsad? Czy tylko ten podmienialny fragment? Bo tak jak pisałem, podstawowy wsad nie powinien być dostępny.
  • Specjalista - Mikrokontrolery
    krisRaba napisał:
    to trochę tak jakby wrzucili do ROMu SPLa czy tam HALa, cokolwiek jest teraz na topie

    Dla procesorów LPC są biblioteki OpenLPC, w których jest właśnie zaimplementowana obsługa driverów w ROM, a to co jest w ROMie to raczej jakieś własne drivery producenta.
    krisRaba napisał:
    ożesz napisać coś więcej? Masz na myśli cały wsad? Czy tylko ten podmienialny fragment? Bo tak jak pisałem, podstawowy wsad nie powinien być dostępny.

    Raczej chodziło o dogrywany kod, bo do całego "wsadu" i tak musiałby być jakiś bootloader we flash no i odpowiednia ilość RAMu, ale też jest to do ogarnięcia. W takich przypadkach podstawą jest dobre panowanie nad skryptami linkera i ich zgranie z kodem źródłowym.
  • Poziom 30  
    Kiedyś robiłem wstępne rozeznanie dot. LPC, bo mam nawet jakąś płytkę z LPC1768, z tym że chwilowo temat umarł, bo to CM3 i nie ma FPU, a odbiorca chciałby mieć ;)
    Co do "reference only", to głównie opinie te słyszałem o SPL od ST ;) Może OpenLPC jest jakoś lepiej dopracowane.

    Karty SD raczej dokładać nie będę w tym projekcie, ale może jakąś kostkę pamięci zewnętrznej? Czemu nie. Choć jeszcze nie łapię zalet takiego rozwiązania względem wpisania tego po prostu we flash mikrokontrolera. Chyba że chodzi o możliwość wyjęcia tej karty, wrzucenia sobie na komputerze binarki, włożenia do urządzenia i algorytm się wykonuje. Tylko i tak "coś" musi chyba wiedzieć, że podstawowy wsad ma zaciągnąć z flasha, a potem dograć jeszcze ten z zewnętrznego źródła? Czy może do przerzutki podstawowego wsadu z flash do RAM jest automat, a potem wsad sprawdza pamięć zewnętrzną i w RAMie sobie koryguje odpowiedni fragment?
  • Poziom 30  
    @michalko12: Mógłbyś jeszcze coś napisać o Twoim pomyśle?
    michalko12 napisał:
    Raczej chodziło o dogrywany kod, bo do całego "wsadu" i tak musiałby być jakiś bootloader we flash no i odpowiednia ilość RAMu, ale też jest to do ogarnięcia. W takich przypadkach podstawą jest dobre panowanie nad skryptami linkera i ich zgranie z kodem źródłowym.

    krisRaba napisał:
    Chyba że chodzi o możliwość wyjęcia tej karty, wrzucenia sobie na komputerze binarki, włożenia do urządzenia i algorytm się wykonuje. Tylko i tak "coś" musi chyba wiedzieć, że podstawowy wsad ma zaciągnąć z flasha, a potem dograć jeszcze ten z zewnętrznego źródła? Czy może do przerzutki podstawowego wsadu z flash do RAM jest automat, a potem wsad sprawdza pamięć zewnętrzną i w RAMie sobie koryguje odpowiedni fragment?