Nut/OS na Linuksie i MMnet104

Tydzień temu pisałem o przywróceniu do życia modułu MMnet104. Dziś opiszę krótko instalację i uruchomienie środowiska, które pozwoli oprogramować ten moduł pod Linuksem z użyciem systemu operacyjnego Nut/OS.

Nut/OS jest modularnym systemem operacyjnym czasu rzeczywistego (RTOS) opracowanym w ramach projektu Ethernut. Ethernut jest projektem typu „open source hardware”, mającym na celu udostępnienie systemów wbudowanych obsługujących Ethernet.

Nas w tej chwili interesuje jednak tylko część software’owa tego projektu, czyli Nut/OS, udostępniający gotowy stos TCP/IP i obsługę protokołów takich jak DHCP, DNS, SMTP, a nawet HTTP czy FTP. Nut/OS bardzo dobrze wspiera kompilator AVR-GCC, a poza tym autorzy projektu przewidzieli możliwość pracy na Linuksie, więc czas przystąpić do dzieła.

Zaczynamy od ściągnięcia źródeł, rozpakowania i uruchomienia konfiguracji:

$ tar jxvf ethernut-4.8.2.tar.bz2
$ cd ethernut-4.8.2
$ ./configure

Powinniśmy zobaczyć m.in.:

configure: nutconfgui is enabled

co oznacza, że będziemy mogli skorzystać z konfiguratora graficznego. W innym wypadku zapewne będziemy musieli doinstalować wxWidgets lub inną bibliotekę, której brak wskaże nam konfigurator.

Ja napotkałem inny problem, związany ze specjalną biblioteką wxPropertyGrid, wymaganą przez narzędzie nutdisc, czyli Discoverera:

configure: WARNING: wxpropgrid not found
[…]
configure: nutdisc requires propgrid

Discoverer nie jest na szczęście niezbędny, jest to dodatkowy program, umożliwiający odnalezienie w sieci Ethernet nie do końca skonfigurowanych hostów, pracujących pod kontrolą Nut/OS-a.

Niestety, u mnie Ethernut najpierw nie widział skompilowanej biblioteki, a po wprowadzeniu zmian w configure i tak kończył kompilację z błędem. Koniec końców zignorowałem więc brak Discoverera i odpaliłem:

$ make
$ make check
$ su -c "make install"

Podczas kompilacji może nas jednak spotkać kolejna przykra niespodzianka: proces przerwie się niespodziewanie, sypiąc błędami, zapoczątkowanymi przez komunikat

error: wx/setup.h: Nie ma takiego pliku ani katalogu

Na szczęście i na to jest prosta rada:

# ln -s /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h /usr/include/wx-2.8/wx/setup.h

Teraz make clean i jazda od nowa z kompilacją!

Po zainstalowaniu nie zmieniamy katalogu, tylko uruchamiamy nutconf i wybieramy plik konfiguracyjny MMnet104.conf.

Następnie klikamy Edit -> Settings. W zakładce Build Source Directory powinien wskazywać na katalog, do którego rozpakowaliśmy źródła, zaś Platform powinien mieć wartość avr-gcc. Jako Build Directory podałem katalog ~/test/build, zaś jako Install Directory~/test/build/lib. W zakładce Samples wskazałem ~/test/samples.

Teraz klikamy Build -> Build Nut/OS i Build -> Create Sample Directory. W efekcie uzyskujemy gotowe środowisko pracy: jądro RTOS, liczne biblioteki i przykładowe aplikacje. Możemy zacząć np. od serwera HTTP — po wydaniu komendy make w katalogu samples/httpd powinniśmy otrzymać HEX-a gotowego do wgrania do naszego mikrokontrolera.

Przy okazji wspomnę, iż warto skorzystać z debugowania za pomocą interfejsu RS232. Interfejs ten coraz rzadziej spotyka się w komputerach, jeżeli jednak korzystamy z płytki wyposażonej w konwerter RS232<->USB na bazie układu scalonego FTDI, Linux powinien nam automatycznie wykryć port i przypisać go do urządzenia /dev/ttyUSB0. Na PC-cie wystarczy uruchomić terminal RS232, np. GTKTerm czy CuteCom (baudrate odczytamy z kodu źródłowego; w moim przypadku parametry transmisji wynosiły 115200, 8N1), a w kodzie programu mikrokontrolera umieścić wywołania printf() czy puts(), raportujące stan urządzenia.

Jedyną niedogodnością jest fakt, iż po odłączeniu kabla lub zasilania płytki oba terminale zawieszają się, zajmując przy okazji całą moc CPU PC-ta. Dlatego w takich sytuacjach warto pamiętać o wcześniejszym rozłączeniu połączenia w terminalu.

Dodawanie komentarzy

XHTML: Możesz używać tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">