Projektowanie

Mikrokontrolery wielordzeniowe w urządzeniach brzegowych IoT

Od deweloperów urządzeń brzegowych IoT wymaga się wdrażania coraz bardziej różnorodnych i wymagających funkcji, począwszy od komunikacji i próbkowania czujników, aż do wnioskowania i uczenia maszynowego (ML).

Od deweloperów urządzeń brzegowych IoT wymaga się wdrażania coraz bardziej różnorodnych i wymagających funkcji, począwszy od komunikacji i próbkowania czujników, aż do wnioskowania i uczenia maszynowego(ML). A jednocześnie oczekuje się utrzymania i redukcji zużycia energii. Powstaje potrzeba bardziej elastycznego podejścia do architektury konstrukcji rdzeni - czyli mikrokontrolera - które pozwoli deweloperom na wprowadzenie dodatkowych funkcji, a jednocześnie uzyskanie optymalnej równowagi między wydajnością, funkcjonalnością i zużyciem energii. Podejście do architektury takich systemów jest realizowane z użyciem mikrokontrolerów wielordzeniowych. Jak sama nazwa wskazuje, zawierają one wiele rdzeni procesorowych w jednej obudowie. Jednak samo zwiększenie liczby rdzeni nie rozwiązuje problemów. Deweloperzy muszą rozumieć różnice pomiędzy symetrycznymi i asymetrycznymi procesorami wielordzeniowymi, podejście do rozdziału funkcji oraz sposób skutecznego programowania. Artykuł przedstawia koncepcję mikrokontrolerów wielordzeniowych, a następnie omawia sposoby, w jakie deweloperzy mogą je wykorzystywać do zrównoważenia wymagań wydajności i ograniczeń zużycia energii. Jako przykłady posłużą mikrokontrolery wielordzeniowe z linii STM32H7 firmy STMicroelectronics. W artykule przeanalizowano również kilka przykładów użycia przetwarzania wielordzeniowego, pozwalającego deweloperom na podział zadań między wiele rdzeni.

Wprowadzenie do mikrokontrolerów wielordzeniowych

Jak sama nazwa wskazuje, mikrokontrolery wielordzeniowe posiadają więcej niż jeden rdzeń przetwarzania. Istnieją dwa typy często używanych konfiguracji: przetwarzanie symetryczne i asymetryczne. Konfiguracje rdzeni symetrycznych zawierają dwa lub więcej całkowicie identycznych rdzeni przetwarzania. Na przykład mogą to być dwa procesory Arm® Cortex®-M4. Z kolei układy asymetryczne rdzeni mogą zawierać procesor Arm Cortex-M7 i procesor Arm Cortex-M4. Mogą one również zawierać procesor Arm Cortex-M4 i procesor Arm Cortex-M0+. Możliwych jest wiele kombinacji, które uzależnione są od zastosowania i wymagań projektowych.

Mikrokontrolery wielordzeniowe są interesujące dla deweloperów IoT ponieważ umożliwiają odrębne ich stosowanie w różnych dziedzinach działania. Odrębne dziedziny działania pozwalają na precyzyjne sterowanie parametrami danej aplikacji, jej funkcjami i zapotrzebowaniem na energię. Na przykład: jeden rdzeń może obsługiwać interakcję z użytkownikiem za pośrednictwem wyświetlacza wysokiej rozdzielczości i panelu dotykowego, a drugi może służyć do zarządzania potrzebami systemu w czasie rzeczywistym, na przykład sterując silnikami, przekaźnikami oraz czujnikami próbkującymi.

Istnieje wiele sposobów, na jakie deweloper może podzielić aplikację, jednak najczęściej stosowane są dwa podejścia do podziału:

  • bogactwo funkcji / czas rzeczywisty
  • czas rzeczywisty / zabezpieczenia

W pierwszym podejściu (bogactwo funkcji / czas rzeczywisty), system jest dokładnie taki, jak opisano w poprzednim akapicie. Jeden z rdzeni obsługuje bogate w funkcje komponenty aplikacji, takie jak np. wyświetlacz, uczenie maszynowe, wnioskowanie, odtwarzanie audio lub pamięć. Drugi rdzeń zajmuje się natomiast funkcjami czasu rzeczywistego, takimi jak sterowanie silnikami, pomiary i stosy komunikacyjne (ilustracja 1).

Ilustracja 1: Jedno z podejść do projektowania aplikacji z użyciem mikrokontrolerów wielordzeniowych polega na przypisaniu bogatych w funkcje komponentów aplikacji do jednego rdzenia, a komponentów czasu rzeczywistego do drugiego. (Źródło obrazu: © STMicroelectronics)

Drugie podejście polega na rozdzieleniu aplikacji na funkcje czasu rzeczywistego i zabezpieczeń. Pierwszy rdzeń może służyć aplikacji do obsługi wyświetlacza, dostępu do pamięci i odtwarzania audio w czasie rzeczywistym. Z kolei drugi rdzeń może służyć wyłącznie jako procesor zabezpieczeń. Drugi rdzeń obsługuje zatem przechowywanie danych o znaczeniu krytycznym, takich jak np. klucze sieciowe, szyfrowanie, bezpieczny program ładujący i wszelkie inne funkcje zaliczane do kategorii oprogramowania zabezpieczeń (Ilustracja 2).

Ilustracja 2: Inne podejście do projektowania aplikacji z użyciem mikrokontrolerów wielordzeniowych polega na przypisaniu komponentów czasu rzeczywistego aplikacji do jednego rdzenia, a komponentów zabezpieczeń do drugiego. (Źródło obrazu: © STMicroelectronics)

Możliwe jest wykorzystywanie przestrzeni aplikacji mikrokontrolerów wielordzeniowych na wiele sposobów, jednak wspomniane dwa podejścia wydają się najpopularniejsze wśród deweloperów Internetu rzeczy (IoT). Dobór płytki rozwojowej mikrokontrolera wielordzeniowego Mikrokontrolery wielordzeniowe stają się coraz bardzie popularne, jednak nie można ich zaliczyć do zastosowań głównego nurtu, dlatego dobór może być problematyczny. Dla dewelopera interesującego się mikrokontrolerami wielordzeniowymi najlepszym wyborem są płytki rozwojowe o następujących cechach:

  • Wyświetlacz LCD do obsługi aplikacji bogatych w funkcje
  • Rozszerzenia wejścia-wyjścia
  • Niski koszt
  • Sprawdzony ekosystem zawierający przykładowe kody, fora społecznościowe i dostęp do doświadczonych inżynierów FAE

Ilustracja 3: Płytka STM32H745I-DISCO integruje szeroką gamę wbudowanych czujników i funkcje pamięci, umożliwiając deweloperom próby mikrokontrolerów dwurdzeniowych działających z prędkościami 480MHz oraz 240MHz. (Źródło obrazu: © STMicroelectronics)

Ilustracja 4: Płytka STM32H757I-EVAL zapewnia deweloperom szerokie opcje rozbudowy, łatwy dostęp do peryferiów oraz ekran LCD, umożliwiając rozpoczęcie pracy z aplikacjami wielordzeniowymi. (Źródło obrazu: © STMicroelectronics)

Przyjrzyjmy się kilku przykładowym układom firmy STMicroelectronics, zaczynając od STM32H745I-DISCO (ilustracja 3). Płytka ta bazuje na mikrokontrolerze dwurdzeniowym STM32H745ZIT6, zawierającym rdzeń Arm Cortex-M7 pracujący z prędkością 480MHz i drugi rdzeń Arm Cortex-M4 pracujący z prędkością 240MHz. Układ zawiera jednostkę zmiennoprzecinkową podwójnej precyzji oraz pamięć podręczną L1 o pojemności 16kB na dane i 16kB na instrukcje. Ta płytka rozwojowa jest szczególnie interesująca, ponieważ zawiera dodatkowe funkcje, takie jak:

  • Kodek audio SAI
  • Mikrofon mikroelektromechaniczny (MEMS)
  • Wbudowany interfejs QUAD SPI Flash
  • 4GB pamięci eMMC
  • Rozszerzenia płytek pomocniczych
  • Ethernet
  • Listwy do podłączania audio i słuchawek

Płytka rozwojowa posiada szereg wbudowanych możliwości, które znakomicie ułatwiają rozpoczęcie eksperymentów z mikrokontrolerami wielordzeniowymi i skalowanie aplikacji.

Dla deweloperów poszukujących płytki rozwojowej z dodatkowymi możliwościami i rozszerzeniami wejścia-wyjścia, lepszym rozwiązaniem może być płytka STM32H757I-EVAL (ilustracja 4). STM32H757I-EVAL oferuje dodatkowe możliwości płytki ewaluacyjnej, takie jak:

  • Pamięć SRAM 8 M x 32-bity
  • Interfejs 1 Gbit Twin Quad SPI NOR Flash
  • Wbudowany blok ETM (Embedded Trace Macrocell) do śledzenia instrukcji
  • Potencjometr
  • Diody LED
  • Przyciski (naruszenie, dżojstik, wybudzenie)

Dodatkowe możliwości, a zwłaszcza rozszerzenia wejść-wyjść, są szczególnie użyteczne dla zainteresowanych deweloperów.

Skoro przeanalizowaliśmy kilka płytek rozwojowych, przejdźmy teraz do zaleceń dotyczących pierwszych kroków z aplikacjami mikrokontrolerów wielordzeniowych.

Od czego zacząć pierwszą aplikację wielordzeniową

Bez względu na to, którą z dwóch płytek rozwojowych STM32H7 wybrano, na początek potrzebne są dwa główne narzędzia. Pierwsze z nich to bezpłatne zintegrowane środowisko tworzenia aplikacji (IDE) STM32CubeIDE firmy STMicroelectronics, które pozwala deweloperom na kompilowanie kodów aplikacji i ich umieszczanie w płytce rozwojowej. Środowisko STM32CubeIDE zawiera również zasoby niezbędne przy debugowaniu aplikacji i dostępne jest dla głównych systemów operacyjnych, takich jak Windows, Linux oraz MacOS.

Drugim narzędziem jest pakiet oprogramowania układowego STM32H7 firmy STMicroelectronics. Zawiera on przykłady, które umożliwiają płytkom rozwojowym STM32H7:

  • Przetwarzanie wielordzeniowe
  • Korzystanie z sytemu FreeRTOS
  • Sterowniki peryferiów
  • FatFS (system plików)

Deweloperzy mogą pobrać pakiet aplikacji oprogramowania układowego i zapoznać się z przykładami obsługiwanymi przez wybraną płytkę rozwojową. Deweloperzy powinni zwrócić uwagę na dwa foldery. Pierwszy z nich to folder aplikacji, który zawiera dwa przykłady użycia środowiska OpenAMP (ilustracja 5). Przykłady te ilustrują sposób przesyłania danych pomiędzy rdzeniami mikrokontrolera poprzez wysłanie danych z jednego rdzenia do drugiego, który następnie przesyła je z powrotem do pierwszego rdzenia. Każdy z tych przykładów realizuje to zadanie w inny sposób. Jeden z nich wykorzystuje konfigurację bare-metal (bez systemu operacyjnego), a drugi używa systemu FreeRTOS.

Ilustracja 5: STM32Cube_FW_H7 zawiera kilka przykładów demonstrujących pierwsze kroki w przetwarzaniu wielordzeniowym z użyciem środowiska. (Źródło ilustracji: © Beningo Embedded Group)

Drugi przykład demonstruje sposób konfiguracji obydwu rdzeni z użyciem systemu RTOS i bez niego (ilustracja 6). Jeden przykład demonstruje sposób uruchomienia systemu FreeRTOS na każdym z rdzeni, natomiast drugi demonstruje użycie systemu RTOS na jednym rdzeniu oraz użycie drugiego rdzenia w konfiguracji bare-metal. Pakiet oprogramowania układowego zawiera kilka innych przykładów demonstrujących inne funkcje, jednak dobrze jest zacząć od omówionych wyżej przykładów.

Ilustracja 6: STM32Cube_FW_H7 zawiera kilka przykładów demonstrujących sposób konfigurowania systemu operacyjnego w procesorach wielordzeniowych. (Źródło ilustracji: © Beningo Embedded Group)

Po załadowaniu przykładowego projektu deweloper widzi układ podobny do ukazanego na ilustracji 7. Jak widać projekt jest podzielony na kody aplikacji dla poszczególnych rdzeni. Konfigurację można również ustawić w taki sposób, że deweloper pracuje tylko z jednym rdzeniem w danej chwili. Na ilustracji 7 jest to uwidocznione przez pliki wyświetlane kolorem szarym.

Ilustracja 7: Przykładowy projekt OpenAMP Ping-Pong demonstruje deweloperom sposób tworzenia kanału komunikacji pomiędzy dwoma rdzeniami procesora. (Źródło ilustracji: © Beningo Embedded Group)

Pełny opis przykładowego kodu wykracza poza zakres niniejszego artykułu, jednak czytelnik może zapoznać się z plikami readme.txt, które towarzyszą poszczególnym przykładom i opisują ich działanie oraz analizują kod źródłowy, opisując faktyczną realizację komunikacji międzyprocesorowej (IPC).

Wskazówki i porady dotyczące pracy z mikrokontrolerami wielordzeniowymi

Pierwsze kroki z mikrokontrolerami wielordzeniowymi nie są trudne, ale wymagają od deweloperów innego sposobu myślenia w odniesieniu do projektowania aplikacji. Oto kilka „wskazówek i porad” ułatwiających rozpoczęcie pracy z mikrokontrolerami wielordzeniowymi:

  • Starannie przeanalizuj aplikację w celu ustalenia, jaki rozdział dziedzin aplikacji jest najsensowniejszy. Możliwe jest łączenie dziedzin w obrębie jednego procesora, jednak należy to stosować rozważnie, gdyż może pogarszać wydajność.
  • Poświęć czas na zbadanie możliwości środowiska OpenAMP i sposobu ich wykorzystania przez aplikację.
  • Pobierz przykładowe aplikacje dla procesorów STM32H7 i uruchom je na wybranej płytce rozwojowej. H747 zawiera dwa: jeden dla systemu FreeRTOS, a drugi dla OpenAMP. Podczas debugowania aplikacji nie zapomnij, że pracują dwa rdzenie! Upewnij się, że wybrany został prawidłowy wątek w środowisku debugowania, aby przeanalizować jego historię wywołań.
  • Wykorzystaj wbudowane zasoby sprzętowe, takie jak semafor sprzętowy, do synchronizacji wykonywania aplikacji w rdzeniach.
  • Deweloperzy, którzy stawiają pierwsze kroki korzystając z dobrze wyposażonej płytki rozwojowej oraz stosują się do powyższych wskazówek i porad, mogą zaoszczędzić sporo czasu i frustracji podczas pracy z pierwszymi mikrokontrolerami wielordzeniowymi.

Podsumowanie

Mikrokontrolery wielordzeniowe oferują deweloperom brzegowych rozwiązań sieciowych w systemach IoT możliwości lepszego zrównoważenia funkcjonalności, wydajności i zużycia energii oraz dopasowania do wymogów aplikacji. Mikrokontrolery te pozwalają deweloperom na rozdzielenie aplikacji między dziedziny bogactwa funkcji / czasu rzeczywistego lub czasu rzeczywistego / zabezpieczeń. Możliwość rozdzielenia aplikacji pomiędzy różne dziedziny pozwala deweloperom na wyłączanie jednego z rdzeni w celu oszczędzania energii, gdy dana dziedzina przetwarzania nie jest potrzebna oraz jego włączanie w celu zwiększenia wydajności aplikacji.

Widzimy, ze istnieje szereg różnych płytek rozwojowych, które można wykorzystać przy badaniu możliwości projektowania aplikacji mikrokontrolerów wielordzeniowych i pozwalających na pełną kontrolę nad ich wydajnością i zużyciem energii.

Artykuł opublikowano dzięki uprzejmości firmy © DigiKey