Hi!
Am gestrigen Tag ist mein kleines Weihnachtsgeschenk eingetroffen.
Ein
Sipeed M1w dock Board
Langzeitplan:
Habe ein paar Raspberries im Feld, mit angedockten Arduinos als Porterweiterungen.
Diese haben sich als recht anfällig erwiesen. (SD-Karte, Stromausfall usw.)
Also für den unbeaufsichtigten Betrieb, nur bedingt geeignet. (UPS nachrüsten)
Auch benötige ich nicht wirklich Linux, o.ä. darauf.
Bin schön länger auf der Suche nach einem leistungsfähigem Ersatz.
Als Alternative stand der Teensy4.0 zur Wahl.
Pinmangel und Preis haben mich (bisher) ein wenig abgeschreckt.
Dann ist mir der K210 unter die Augen gekommen.
Und nach einigem Vergleichen den Sipeed M1w dock geordert.
(da werden alle Pins herausgeführt)
Beeindruckende Daten: (nur ein Auszug)
2 RISC-V 64Bit Cores
mit wahlweise mit 400MHz, 500MHz oder 600MHz angetrieben
Neurales Netzwerk und FFT in Hardware
16Mbyte Flash (8MB für Programme)
6MByte RAM (müssen sich CPU, neurales Netzwerk und FFT teilen)
IO Spannung 3,3V und 1,8V Bankweise einstellbar
IO Matrix, jedes Signal(z.B. SPI,I2C,UART,PWM) kann auf jeden Pin gemappt werden.
usw. usw. usw.
Für genauere Infos dem obigen Produktlink folgen. Dort finden sich einige PDF Dateien und Tools
Ein schneller Test, mit dem Modul im Auslieferungszustand, also mit MicroPython, zeigte, dass LCD, Kamera, Gesichtserkennung funktionieren.
MicroPython ist nicht so mein Ding, will C++.
Also Arduino IDE fix um die
Board Definitionen bereichert.
Tage vorher schon die Seite auf Github untersucht.
Um es vorweg zu nehmen:
Vieles funktioniert.
Vieles aber auch noch nicht.
Kamera bisher noch nicht
Display ja
Wlan Client, ja
Wlan Server, noch nicht
Taktumschaltung, noch nicht
usw.
Zum Start habe ich mir mal einen kleinen Benchmark gebastelt:
#include <Streaming.h>
// UNO 288988 at 16MHz (gcc 9.2)
// Maix 336253 at 400MHz 500MHz 600MHz (gcc 8.2)
// ESP8266 86762 at 80MHz
// ESP8266 165909 at 160MHz
using MillisType = decltype(millis());
MillisType merker = 0;
MillisType loops = 0;
void setup()
{
Serial.begin(9600);
Serial << "Start: "<< __FILE__ << endl;
Serial << "MillisType: "<< sizeof(MillisType) << endl;
}
void loop()
{
loops++;
if(millis() - merker > 1000)
{
merker += 1000;
Serial << loops << endl;
loops = 0;
}
}
Die Ausgaben finden sich oben im Code.
Warum der UNO so überraschend schnell erscheint, weiß ich noch nicht.
Als interessante Hürde hat sich millis() erwiesen, es liefert uint64_t Werte.
Irgendwas um 340 Tausend Iterationen pro Sekunde erschien mir doch arg schlapp.
Da muss noch mehr gehen!
Im Lieferumfang befindet sich FreeRTOS.
Also fix damit einen Test gemacht.....
#include <Streaming.h>
#include <FreeRTOS.h>
#include <task.h>
using MillisType = decltype(millis());
MillisType timestamp = 0;
volatile MillisType loops = 0;
void iteratorTask( void * parameter )
{
while(1)
{
taskENTER_CRITICAL();
loops++;
taskEXIT_CRITICAL();
}
}
void printTask( void * parameter )
{
while(1)
{
taskENTER_CRITICAL();
Serial << loops << endl;
loops = 0;
taskEXIT_CRITICAL();
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
TaskHandle_t iteratorHandle = NULL;
TaskHandle_t printHandle = NULL;
void setup()
{
Serial.begin(9600);
Serial << "Start: "<< __FILE__ << endl;
Serial << "MillisType: " << sizeof(MillisType) << "Byte breit" << endl;
// xTaskCreate(function,name,stackframe,parameter,priority,handle);
xTaskCreate(iteratorTask,"iteratorTask",1024, NULL,4,&iteratorHandle);
xTaskCreate(printTask,"printTask",1024,NULL,4,&printHandle);
vTaskStartScheduler();
}
void loop()
{
Serial << " Diese Ausgabe wird nie zu sehen sein " << endl;
}
Und "Klack" kommt es auf fast 2 Millionen Iterationen pro Sekunde
Auf dem UNO, mit Arduino_FreeRTOS.h, und reduziertem Stacksize für die Tasks, kommt es auf ca. 564 Tausend Iterationen
Ja, ich weiß, alles noch nicht sonderlich aussagekräftig.
Mir scheint, das nutzt bisher nur 1 der 2 Cores.
Schlussendlich(vorläufig):
Die Arduino Integration ist noch eine Baustelle.
Die Dokumentation ist so lala, ein guter Zeitpunkt um mein Chinesisch zu verbessern.
Das Board bietet mehr als genug Potential um über die Feiertage zu kommen.
Für den Einsatz im Feld ist es noch zu früh (für mich)