LabVIEW Embedded Development Module dla ARM7TDMI
Mikrokontrolery i mikroprocesory z rdzeniami ARM są idealną platformą sprzętową dla systemów operacyjnych (jak choćby Linux czy RTOS-y pokroju eCOS-a), a także dla zaawansowanych systemów projektowych jak na przykład LabVIEW. O tym jak wykorzystać to narzędzie do przygotowania aplikacji dla ARM-ów pokażemy w artykule.
Dysponując środowiskiem projektowym wysokiego poziomu dość łatwo jest napisać skomplikowaną aplikację. Naszym przykładowym środowiskiem wysokiego poziomu będzie pakiet LabVIEW, a platformą (w tym przypadku wielkie słowo!) sprzętową – mikrokontroler LPC2148. Wykorzystanie LabVIEW jako narzędzia projektowego dla mikrokontrolerów jest możliwe dzięki nowemu modułowi tego systemu – tytułowemu LV Embedded Development Module. Wzbogaca on funkcjonalność LV o generator kodu ANSI C z plików .vi (źródłowych plików LabVIEW). Schematy ilustrujące sposób tworzenia aplikacji z wykorzystaniem LV przedstawiono na rys. 1 i 2.
Rys. 1. Sposób tworzenia aplikacji dla mikrokontrolera z wykorzystaniem LV Embedded Development Module (za National Instruments)
Rys. 2. Idea działania LV Embedded Development Module (za National Instruments)
Język ANSI C został wybrane nieprzypadkowo. Jest to najbardziej bezpieczny wybór z możliwych. Obecnie ciężko jest znaleźć rodzinę 32-bitowych kontrolerów, do których nie jest dostępny kompilator C. Po generacji kodu z pliku .vi kończy się właściwie rola opisywanego modułu. Od tej pory reszta zależy od użytkownika.
Ponieważ kod wygenerowany z .vi zawiera specyficzne dla LabVIEW komponenty, do korzystania z prezentowanego narzędzia jest konieczne środowisko uruchomieniowe (runtime, w dalszej części tekstu będę posługiwał się tym właśnie terminem). W przypadku modułu LV EDM dostarczane są kody źródłowe runtime’u (oczywiście w języku ANSI C). Śledząc sytuację przedstawioną na rys. 2 widać, że na pewnym etapie realizacji projektu jest konieczna kompilacja zarówno kodu źródłowego programu jak i runtime’u LabVIEW.
Kompilacji dokonujemy narzędziem, o które sami musimy się zatroszczyć! National Instruments nie dostarcza kompilatorów C, a więc przed użyciem modułu musimy być w stanie sami skompilować program napisany w C. Po kompilacji do akcji wkracza linker (znów z naszego pakietu narzędzi). W tym momencie musimy podjąć też ważną decyzję, a mianowicie czy aplikacja będzie działać natywnie czy pod kontrolą systemu operacyjnego. Jeśli zdecydujemy się na system operacyjny, to podczas kompilacji i linkowania musimy uwzględnić biblioteki jądra systemu operacyjnego. Kiedy dysponujemy już plikiem wykonywalnym, możemy go załadować do mikrokontrolera. Oczywiście, aby cały łańcuch projektowy był kontrolowany, musimy zapewnić sobie możliwość debugowania pracy programu, tym jednak nie będziemy się teraz zajmować, skupimy się najpierw na uruchomieniu najprostszej aplikacji napisanej w LabVIEW.
Platforma
Ponieważ omawiany moduł przeznaczony jest wyłącznie dla kontrolerów 32-bitowych, to układy LPC2000 firmy Philips stały się naturalnym wyborem. Jedynym problemem pojawiającym się na samym początku były dość duże wymagania modułu co do pojemności pamięci RAM procesora – National Instruments zaleca przynajmniej 256 kB RAM. Nie oznacza to jednak, że dysponując kontrolerem z 32 kB wewnętrznej pamięci RAM nie uda nam się uruchomić aplikacji napisanej w LabVIEW, co postaram się udowodnić.
Do eksperymentu wybrałem platformę KAMAMI ZL9ARM wraz z modułem dipARM (ZL10ARM) z procesorem LPC2148. Układ ten posiada 32 kB podstawowej wewnętrznej pamięci RAM oraz 512 kB pamięci Flash.
System operacyjny
Znakomitym ułatwieniem podczas przenoszenia LV na nową platformę są przykłady dostarczone przez National Instruments. Wszystkie one bazują na systemach operacyjnych eCOS bądź WxWorks. Wśród przykładów znajdziemy także dwa, przeznaczone do uruchamiania aplikacji w konsoli systemowej – jeden dla Unixa drugi dla Windows. Mogą one służyć w celach edukacyjnych do zrozumienia ogólnej idei działania modułu LV EDM. Jako, że WxWorks jest systemem komercyjnym, zdecydowałem się na zastosowanie darmowej wersji eCOS-a.
Narzędzia
Ponieważ eCOS (Easy Configurable Operating System) został napisany i zoptymalizowany pod kompilator GCC, to wybór był oczywisty. Oprócz samego GCC potrzebujemy do dalszych działań zestawu dodatkowych narzędzi. Najważniejsze z nich to linker i oczywiście assembler. Całość nosi nazwę GNU Binutils. Dopełnieniem tego zestawu jest GNU Newlib – biblioteka C, przeznaczona dla systemów wbudowanych, a więc dla takich, które posiadają nieduże zasoby sprzętowe. Ten cały zestaw zapewni nam możliwość wygenerowania pliku wykonywalnego .hex, natomiast do jego załadowania do pamięci mikrokontrolera posłuży nam dobrze znany LPC2000 Flash Utility w wersji 2.2.3.
Wszystko w tym momencie wygląda dobrze, poza jednym szczegółem: wymienione narzędzia GNU z założenia przeznaczone są dla Linuksa, będziemy, zatem potrzebowali jego emulatora. Z pomocą przychodzi Cygwin, a więc zestaw bibliotek DLL dostarczających funkcjonalności konsoli Linuksa w systemie Windows.
LabVIEW Embedded Edition
LabVIEW Embedded Developement Module jest dostarczany z wraz ze specjalną wersją LabVIEW 7.1 Embedded Edition. Podobna sytuacja miała miejsce przy pierwszej wersji modułu LabVIEW RT. Wersja 2.0 LV EDM ma być już dostępna jako plugin do standardowej edycji LabVIEW 8. Obecnie instalacja specjalnej wersji LabVIEW jest pewnym utrudnieniem, ale nie powoduje ona żadnych konfliktów z ewentualnie zainstalowanymi wersjami LabVIEW.
Po starcie ukaże się okno powitalne, w którym nie będzie widocznej platformy sprzętowej KAMAMI, którą sami musimy dodać.
W tym celu w menu Tools wybieramy Create Embedded Target. Następnie zostaniemy poproszeni o wskazanie lokalizacji platformy, która posłuży nam jako szablon (podobna sytuacja wystąpiła już przy konfiguracji eCOS-a), o podanie nazwy naszej platformy (KAMAMI ZL9ARM z LPC2148) oraz o podanie lokalizacji katalogu, w którym umiejscowione zostaną pluginy sterujące narzędziami. Proces tworzenia nowej platformy polega na kopiowaniu i zmiany nazw pluginów z platformy, którą wskazaliśmy jako szablonową. Po zakończeniu kopiowania zostaniemy poinformowani ze cały proces przebiegł pomyślnie. Musimy teraz zamknąć obecną sesję LabVIEW. Po ponownym stracie nasza platforma będzie widoczna w rozwijanym menu. Następnie należy zaadoptować pluginy do pracy z zestawem narzędzi. Modyfikacji muszą/mogą ulec takie rzeczy jak flagi kompilatora i linkera, czy sposób ładownia pliku wykonywalnego do układu. W katalogu platformy w podkatalogu libs\install znajdują się katalogi lib oraz include. Musimy w nich umieścić zawartości folderów utworzonych podczas budowy jądra eCOS-a.
Jeśli dobrnęliśmy od tego miejsca, możemy spróbować napisać pierwszą aplikację na nową platformę. Aplikacja nie będzie wyjątkowo efektowna, ale będzie stanowić doskonałe uwieńczenie trudów portowania LV: nasza testowa aplikacja będzie włączała i wyłączała diodę LED0.
Do tego zadania podejdziemy tradycyjnie: po pierwsze ustalimy kierunek pinu, do którego podłączony jest bufor diody (P1.16) a następnie go sterować (pin). Przygotujemy w tym celu dwa pliki .vi. Jeden odpowiedzialny za ustalanie kierunku pinów portu P1 (kod na rys. 3) a drugi za ich wysterowywanie (kod na rys. 4).