Śledzenie programu na Arduino Zero Pro z GDB i openOCD

Arduino dzięki swej prostocie ma mnóstwo zalet. Osobom mającym doświadczenie z programowaniem na początku może sprawiać problem brak debugera, czyli narzędzia pozwalającego podglądać działanie programu w kontrolerze. Można podejrzeć/zmieniać wartości zmiennych, wykonywać komendy krok po kroku. Mówiąc krótko sprawdzić, czemu program nie działa jak powinien. Przy bardziej złożonych programach jest to nieoceniona pomoc.
Arduino nie dysponuje takim narzędziem. Jedyna dostępna metoda to wysyłanie komunikatów przez obiekt Serial.

Arduino Zero Pro na ratunek

Od dziś dostępny na Nettigo jest nowy model Arduino Zero Pro. Płytka ta ma na pokładzie 32 bitowy procesor ARM Cortex-M0. Nowością jest złącze do śledzenia działania programów.
Arduino Zero Pro jest wyposażony w dodatkowy układ, który przez dodatkowy port USB daje funkcjonalność debugowania bezpośrednio na płytce.

Jak zacząć śledzenie

Testy prowadziliśmy na komputerze z Linuxem, jednakże, całość oprogramowania niezbędnego do pracy jest częścią Arduino IDE, i dlatego metoda opisana powinna działać na każdym OS na którym działa Arduino IDE.

Arduino ORG

Pierwsza ważna sprawa, musimy mieć zainstalowane Arduino IDE ze strony Arduino.org a nie jak dotychczas z Arduino.cc – w tej chwili (maj 2015) tylko to IDE ma wsparcie dla Arduino Zero Pro.

Ściagamy i instalujemy Arduino IDE 1.7.3 lub nowsze. Następnie potrzebujemy, by IDE było bardziej rozgadane niż zazwyczaj, dlatego otwieramy ustawienia (Ctrl+,) i szukamy opcji Show verbose option during i zaznaczamy przy compilation.

Do testów na warsztat weźmiemy szkic Blink. Otwieramy go (menu Files/Examples/01. Basic/Blink). Arduino Zero podłączamy kablem micro USB do portu PROGRAMMING, w IDE wybieramy płytkę i port (też programming) i wgrywamy program na płytkę (Ctrl+U).

OpenOCD

Konsorcjum ARM opracowało dla procesorów Cortex-M0 standard komunikacji nazwany CMSIS (dla ciekawskich – link) i istnieje otwarte oprogramowanie obsługujący ten standard.

Pozwólcie że przedstawię – OpenOCD. Arduino IDE jest dostarczane razem z OpenOCD, dlatego nic nie trzeba instalować.

Uruchomienie OpenOCD

Mając wgrany na Arduino nasz Blink, przechodzimy do katalogu, gdzie rozpakowaliśmy Arduino IDE i wydajemy komendę (to jest jedna linia):

./hardware/tools/OpenOCD-0.9.0-dev-arduino/bin/openocd -s hardware/tools/OpenOCD-0.9.0-dev-arduino/share/openocd/scripts/ -f hardware/arduino/samd/variants/arduino_zero/openocd_scripts/arduino_zero.cfg

Uruchamiasz OpenOCD. Paramter po -s wskazuje na katalog, w którym jest zestaw plików konfiguracji samego OpenOCD. Po -f jest lokalizacja pliku konfigurującego OpenOCD dla Arduino Zero. Prawidłowy rezultat powinien wyglądać tak:

Open On-Chip Debugger 0.9.0-dev-g1deebff (2015-02-06-13:06)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'cmsis-dap'
adapter speed: 500 kHz
adapter_nsrst_delay: 100
cortex_m reset_config sysresetreq
Info : CMSIS-DAP: SWD  Supported
Info : CMSIS-DAP: JTAG Supported
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : CMSIS-DAP: FW Version = 01.1F.0118
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 0 nRESET = 1
Info : DAP_SWJ Sequence (reset: 50+ '1' followed by 0)
Info : CMSIS-DAP: Interface ready
Info : clock speed 500 kHz
Info : IDCODE 0x0bc11477
Info : at91samd21g18.cpu: hardware has 4 breakpoints, 2 watchpoints

GDB

OpenOCD jest gotowe do pracy. Nasłuchuje one na portach 4444 i 3333. Do tego pierwszego możemy się podłączyć telnetem, ten drugi jest dla protokołu GDB.

GDB to otwarte oprogramowanie do śledzenia wykonywania programu (debugger). Jest również dołączone do Arduino IDE. To jest o tyle istotne, że GDB musi być skompilowane ze wsparciem dla architektury ARM.

By móc śledzić program potrzebujemy pliku w formacie ELF z programem i informacjami opisującymi jego strukturę.
Plik taki powstaje podczas kompilacji kodu i jest przechowywany w tymczasowym katalogu. By uzyskać plik, jeszcze raz skompilujemy program, tym razem tylko weryfikacja (Ctrl+R). W jednej z ostatnich linii pojawi się ścieżka do pliku z rozszerzeniem .elf.

Poglądowy obrazek (zwróć uwagę, że konsola została przesunięta w prawo. bo linie się nie zawijają automatycznie):
image

Uruchamiamy GDB, w katalogu gdzie jest arduino IDE wydajemy komendę:

./hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin/arm-none-eabi-gdb -d examples/01.Basics/Blink/

Katalog podany po opcji -d jest miejscem, gdzie GDB będzie szukało kodu naszego programu, by móc wyświetlać nam informacje o wykonywanym kodzie w przyjazny dla nas sposób. Po uruchomieniu GDB powinniśmy otrzymać linię poleceń tego programu.

GNU gdb (GNU Tools for ARM Embedded Processors (Arduino build)) 7.6.0.20140228-cvs
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-none-eabi".
For bug reporting instructions, please see:
.
(gdb) 

Ninejszy artykuł nie jest instrukcją jak korzystać z GDB, pokażę tylko niezbędne rzeczy by rozpocząć śledzenie programu na Arduino.

Teraz poinformujemy GDB gdzie znajdzie skompilowany program, który będziemy śledzić:

(gdb) file /tmp/build4557814640826011475.tmp/Blink.cpp.elf
Reading symbols from /tmp/build4557814640826011475.tmp/Blink.cpp.elf...done.
(gdb) 

Komenda file służy do podania ścieżki do tego pliku, ścieżka to ta skopiowana z konsoli Arduino IDE.

GDB musimy powiedzieć, że nasz program jest wykonywany gdzie indziej:

(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x00000000 in ?? ()
(gdb) 

Teraz jesteśmy gotowi przejąć kontrolę nad programem, spójrzcie na ten zapis sesji z GDB:

(gdb) monitor reset halt
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x21000000 pc: 0x000028b8 msp: 0x20002c08
(gdb) monitor reset init
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x21000000 pc: 0x000028b8 msp: 0x20002c08
(gdb) l loop
19    // initialize digital pin 13 as an output.
20    pinMode(13, OUTPUT);
21  }
22  
23  // the loop function runs over and over again forever
24  void loop() {
25    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
26    delay(1000);              // wait for a second
27    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
28    delay(1000);              // wait for a second
(gdb) b 25
Breakpoint 1 at 0x4120: file Blink.ino, line 25.
(gdb) cont
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.

Breakpoint 1, loop () at Blink.ino:25
25    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
(gdb) c
Continuing.

Breakpoint 1, loop () at Blink.ino:25
25    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
(gdb) 

I tak monitor reset halt wysyła komendę do zdalnego urządzenia, aby zatrzymało wykonywanie programu (po wydaniu tej komendy dioda na Arduino Zero przestaje migać). monitor reset init przywraca procesor do stanu ‘zerowego’ tak by rozpocząć pracę na nowo.

l loop wyświetla nam kod funkcji loop (dlatego potrzebowaliśmy wskazać GDB, gdzie jest katalog z naszym szkicem). Polecenie b 25 ustawia punkt przerwania wykonywania w linii 25, a polecenie cont wznawia (a ponieważ wykonaliśmy monitor reset init to rozpocznie działanie od początku) wykonywanie programu na Arduino.

Jednak nim zapali się dioda, to procesor dotrze do linii 25, której kod ma właśnie zaświecić tę diodę i debugger zatrzyma wykonywanie programu. Kolejne polecenie c to skrót od cont wznowi działanie programu. Wykona się pełen cykl, dioda się zaświeci na sekundę, zgaśnie i procesor znowu dotrze do lini 25 i zatrzyma wykonywanie programu.

Co dalej?

To była bardzo prosta demonstracja jak korzystać z możliwości, jakie otwiera przed Wami Arduino Zero Pro. Osoby mające doświadczenie z GDB mogą już śmiało zamówić Zero. Pozostałych zachęcamy do prób, bo GDB warto opanować, ten krótki film pokaże Wam, jak wyglądało debugowanie Blinka na żywo.

Gdy działa już GDB nie ma problemu, by skorzystać z graficznego interfejsu, jakie istnieją do tego programu. Na przykład DDD (tym razem musicie doinstalować ten program, nie jest on częścię Arduino IDE)

By go uruchomić, trzeba tylko wskazać mu właściwą wersję GDB (tą z Arduino IDE):

ddd --debugger "hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin/arm-none-eabi-gdb -d examples/01.Basics/Blink/"

Arduino Zero vs Teensy 3.1

Na stronie Arduino pojawiła się oficjalna specyfikacja Arduino Zero.

image
Arduino Zero – Zdjęcie pochodzi ze strony Arduino.cc

Sama płytka nie jest jeszcze dostępna. Twórcy oznaczyli ją opisem “Comming soon” [wkrótce]. Biorąc pod uwagę to, że Arduino Tre ma takie oznaczenie już chyba z pół roku, nie potrafię przewidzieć kiedy nastąpi oficjalna premiera.

Płytka ma być następczynią popularnych i znanych modeli UNO i Leonardo, obsługując ten sam format płytki.

Parametry techniczne przedstawiają się następująco:

  • Procesor: ATSAMD21G18 – 32 bitowy ARM M0+
  • Zegar: 48 MHz
  • Pamięć FLASH (programu): 256 kB
  • Pamięć SRAM (danych): 32 kB
  • Pamięć EEPROM (konfiguracji): 16 kB (udawana we FLASH)
  • Poziomy logiczne o napięciu 3,3 V
  • 14 wejść/wyjść cyfrowych
  • 12 wyjść PWM
  • 6 wejść analogowych o rozdzielczości 12 bitów
  • wyjście analogowe o rozdzielczości 10 bitów
  • maksymalne obciążenie wyjść cyfrowych 7 mA
  • cena: nieznana

Chyba największą zaleta płytki jest złącze debug, pozwalające na podgląd działania programu w kontrolerze w celu łatwiejszego wykrywania błędów. Oczywiście to tylko teoria, bo nie wiadomo jak to będzie działać. Może się okazać, że trzeba wykupić jakieś oprogramowanie, albo używać dziwnych skomplikowanych narzędzi.

Z drugiej strony mamy dostępną płytkę Teensy 3.1 stworzoną przez Paula z pjrc.com

image
Teensy 3.1 – Zdjęcie pochodzi ze strony pjrc.com

Mimo innego wyglądu płytka jest zbliżona funkcjonalnie do Arduino Zero. Programuje się ją za pomocą Arduino IDE z obsługą jego bibliotek. Paul dużo pracował ze społecznością nad zapewnieniem kompatybilności bibliotek.

Prametry techniczne Teensy 3.1:

  • Procesor: MK20DX256 – 32 bitowy ARM M4
  • Zegar: 72 MHz (możliwość przełączenia na 96 MHz)
  • Pamięć FLASH (Programu): 256 kB
  • Pamięć SRAM (Danych): 64 kB
  • Pamięć EEPROM (konfiguracji): 2 kB
  • Poziomy logiczne o napięciu 3,3 V, Toleruje napięcie 5 V
  • 34 wejścia/wyjścia cyfrowe
  • 12 wyjśc PWM
  • 21 wejść analogowych
  • 12 wejść dotykowych
  • 3x Serial, 2x i2c, 1x SPI
  • cena: 84 zł

Płytki Teensy dostępne w Nettigo.pl

sprae

Arduino Zero trafia do testów

image
Zdjęcie pochodzi z bloga Arduino

Jeśli jeszcze nie wiesz co to jest Arduino Zero, zapraszam do poprzednich wpisów:

Zespół Arduino po udanych testach Arduino TRE, postanowił objąć programem beta-testów Arduino Zero.

Do testowania przeznaczono 20 płytek. Swoją kandydaturę można zgłosić do 17 sierpnia 2014.

sprae

Arduino Zero – kolejne ciekawostki

Redakcja Hack a day natrafiła podczas targów Maker Faire na stoisko firmy Atmel na którym Bob zdradził im kilka szczegółów dotyczących Arduino Zero.

Oprócz tego co znasz z poprzedniego wpisu o Arduino Zero, Bob zdradził dodatkowo:

  • Arduino Zero ma natywny port USB podłączony bezpośrednio do kontrolera. Jak w Leonardo może on udawać różne urządzenia. Może też pracować jako Host USB i kontrolować inne urządzenia jak aparaty fotograficzne, klawiatury, myszy, smartfony.
  • Port debug będzie używał otwartego protokołu debugu i będzie współpracował z programami Atmel Studio, OpenOCD oraz GDB. Arduino IDE też ma obsługiwać, ale na razie tego nie robi.
  • Jak pisałem wcześniej kontroler ma 6 interfejsów szeregowych. Bob zdradził, że można każdemu wybrać protokół z dostępnych Serial, TWI, SPI. Dodatkowo każdy interfejs można podpiąć do dowolnego pinu kontrolera. Za wyjątkiem pinów USB.
  • Dowiedzieliśmy się też po co jest tajemnicze złącze SWD znajdujące się w prawym dolnym rogu Arduino Zero. Służy ono do programowania i debugowania urządzeń, które zbudujesz na bazie kontrolera SAMD21. Więc dodają za “free” programator.

Niestety Bob nie zdradził kiedy dokładnie pojawi się AZ i ile będzie kosztować.

Wpis o Arduino Zero na Hack a day

Arduino Zero – klasyka w nowym wydaniu na blogu Nettigo

sprae

Arduino Zero – klasyka w nowym wydaniu

Po wypasionym Arduino Tre z zespołu Arduino wyszła jeszcze jedna niespodzianka. Jest nią Arduino Zero.
To odnowiona wersja klasycznej linii Arduino jaką znasz z modeli UNO, Leonardo lub dawnej niezniszczalnej Duemilanove.

image

Zdjęcie pochodzi z bloga Arduino

Nowa płytka ma nowy procesor. W miejsce 8 bitowych kontrolerów ATmega z rdzeniem AVR, wchodzi nowa 32-bitowa rodzina SAMD21 z rdzeniami ARM-M0+. Nowy procesor będzie pracował z częstotliwością 48 MHz (3x większą niż wcześniejsze). Do twojej dyspozycji będzie 256 kB pamięci Flash (8x więcej) i 32 kB pamięci RAM (16x więcej).

Nowe płytki pracują z napięciem 3,3 V tak jak Arduino DUE. Biorąc pod uwagę, że większość tworzonych dzisiaj elementów pracuje z takim napięciem, to raczej zaleta niż wada. Niestety wyjścia cyfrowe mają mały prąd obciążenia – 10 mA w stanie niskim i 7 mA w stanie wysokim. Przez to ciężko będzie podłączyć bezpośrednio diody LED i rozświetlić je w pełni (20 mA). 

Obserwując zdjęcia płytki można zauważyć, że teraz mamy wyjścia PWM na każdym pinie cyfrowym, oprócz pinów Serial. Reszta pinów ma takie samo znaczenie jak wcześniej.

Zauważyć też można, że są dwa złącza micro USB. Jedno jest tradycyjnym wirtualnym portem szeregowym, do komunikacji programu z komputerem.
Drugie oznaczone jest napisem Debug.

Debug pozwala na podglądanie działania programu na kontrolerze. Nie wiem na ile pozwoli Arduino IDE, ale tradycyjny debug pozwala na:

  • Wykonywanie programu krok po kroku – program wykonuje kolejne linie kodu w tempie jakim chcemy obserwować co się dzieje z kontrolerem.
  • Pokazanie gdzie się wywalił program.
  • Zatrzymanie programu w dowolnym momencie (breakpoint) i podgląd wartości wszystkich zmiennych.

W nocie katalogowej kontrolera można dostrzec o wiele więcej peryferiów niż oferuje płytka, lecz bez schematu nie wiadomo czy ich sygnały będą dostępne.
Te, które chciałbym wyróżnić to:

  • 6 portów szeregowych
  • Interfejs cyfrowego dźwięki i2s
  • 14 wejść analogowych o rozdzielczości 12 bitów (4096 poziomów)
  • 10 bitowe wyjście analogowe
  • 12 kanałów DMA – pozwalają na automatyczne bez udziału procesora komunikowanie się między urządzeniami kontrolera
  • Zegar RTC – automatycznie zlicza godziny, minuty i sekundy oraz obsługuje budzik
  • CRC32 – automatycznie tworzy sumę kontrolną do weryfikacji danych.

Zatem będzie co hackować 😉

Opis Arduino Zero na blogu Arduino

Opis Arduino Zero na blogu Atmel

Nota katalogowa kontrolera SAMD21G

Duże zdjęcie Arduino Zero

sprae