Teensy 3 vs Arduino – o ile szybsze?

Początkujący użytkownicy Arduino, jeżeli postawią sobie ambitne zadanie często docierają do ściany możliwości Arduino. Wydaje się za wolne, zbyt mało zasobów. Prawda jest taka, że często wystarczy napisać program w sposób bardziej efektywny i nagle Arduino może jeszcze całkiem sporo.

Jednak jak zawsze jest pokusa – zmieńmy Arduino na coś szybszego/większego. Nie pochwalam podejścia polegającego na „rzucaniu więcej MHz na problem”, ale czasem może warto? Każda sytuacja jest inna i  na etapie potwierdzenia wykonywalności projektu, czasem warto po prostu użyć czegoś szybszego.  Potem, jeśli będziemy realizować projekt docelowy to wtedy pisać jak należy? Wszystko zależy od priorytetów – jeśli czas jest najważniejszy to może warto?

teensy

OK, w tym kontekście pomówmy o czymś większym co może zastąpić Arduino. Paradoksalnie Teensy 3.2 jest mniejszy pod względami rozmiarów od Arduino, ale procesor ARM 72 MHz wygląda obiecująco :)Dla uściślenia – nie mam zamiaru porównywać wydajności procesora, bo to jest bez sensu, wiadomo, że przewaga jest po stronie ARM. Chcę zastanowić się o ile szybsze będzie Teensy użyte jak Arduino. A jak się używa Arduino? Jako maszynki do Blinka :) Blink jako taki nie ma sensu jako materiał porównawczy, ale jeśli postawimy sobie pytanie o ile szybciej Teensy jest w stanie zmieniać stan wyjścia niż Arduino, to będzie to już jakieś wartościowe porównanie.Kod jest bardzo prosty:

void loop() {
  while (1) {
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  };
}

Ładujemy kod na Arduino i Teensy, podłączamy oscyloskop no i jaki mamy rezultat?

DS1Z_QuickPrint6Jak widać Teensy (żółty) jest dużo szybszy niż Arduino (niebieski). Oscyloskop wyliczył, że sygnał wygenerowany przez Teensy ma częstotliwość 1.47 MHz a z Arduino 134 kHz. Wynika z tego, że Teensy jest 11 razy szybsze niż Arduino. Czemu aż tyle, skoro 72 MHz/16 MHz to tylko 4.5? Najwyraźniej digitalWrite jest o wiele efektywniej napisane w wersji dla ARM (albo po prostu mniej operacji wymaga) stąd nie dość że każda instrukcja (w kodzie maszynowym) na Teensy wykonuje się szybciej, to jeszcze mniej ich potrzeba niż na Arduino – dlatego mamy aż 11 krotną przewagę Teensy nad Arduino.

Ale to nie koniec. Teensy oferuje domyślnie opcję overclockingu, można wybrać prędkość pracy procesora przez opcję w menu Tools/CPU Speed. Zamiast 72 MHz optimized wystarczy wybrać 96 MHz optimized (overclock) i:

DS1Z_QuickPrint4

Tak, wiem trochę inne nastawy tego screenshota, ale już schowałem swój zestaw, a nie zauważyłem że ten ma inną podstawę czasową. Jednak jak widać w przy 96 MHz zegara oscyloskop wyliczył nam sygnał wygenerowany przez Teensy ma 2 MHz.

Jednak nie zawsze zmiana Arduino na Teensy przyniesie przyspieszenie. Zwróciłeś uwagę że w kodzie użyliśmy pętli while by zmieniać cały czas stan wyjścia. Jednak jeżeli użyjemy takiego kodu:

void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
}

Przebieg obu sygnałów (z Arduino i Teensy) będzie wyglądać tak:

DS1Z_QuickPrint1

Coś dziwnego dzieje się w kodzie Teensy. Co? Odpowiedź kryje się w tym kodzie (funkcja main dla Teensy3). W części wywołującej loop po tej funkcji wywołuje się jeszcze funkcja yield. W Arduino jej nie ma, dlatego po zakończeniu loop, wraca natychmiast do jej wykonywania. W Teensy3 yield zajmuje chwilę – sprawdza czy są dostępne dane portach szeregowych. Ponieważ Teensy ma ich więcej niż Arduino UNO, chwilę to trwa.

W takim użyciu okazuje się, że Teensy jest ok 2-3 razy szybszy od Arduino. Jeśli nie zależy Ci na SerialEvent to po prostu nie wychodź z loop na Teensy :).