Hallo und danke für die Antworten.
combie:
FreeRTOS
Habe mir FreeRTOS angeschaut und vom Prinzip her ist es genau das was ich suche. Wenn ich das jedoch in meine Anwendung einbinde, wird das zu viel für den Arduino. Ich habe es nun auf ein grundlegendes Problem zurückführen können, vermutlich Speichermangel, auch wenn mir die Ausgabe nach dem Hochladen angibt, es sei noch genug Speicher verfügbar. Im Folgenden ein kurzes Beispiel...
#include <Arduino_FreeRTOS.h>
#include <SD.h>
#include <SPI.h>
uint8_t Puffer[400];
File myFile;
void setup() {
Serial.begin(9600);
SPI.begin();
SD.begin();
myFile = SD.open("beethoven.wav");
myFile.read(Puffer, sizeof(Puffer));
}
void loop() {
Serial.println("funktioniert");
}
Ich benötige für meine Anwendung einen Puffer, je größer desto besser. Bei einer Puffergröße von 400 Bytes wird der Serial Befehl in der mainLoop einfach nicht ausgeführt (im Terminal erscheint nichts), bei einer Puffergröße von 300 schon. Ich kann mir zwar nicht erklären, warum das so ist, aber es ist definitiv vom genutzten Speicher abhängig. Die eigentlichen Tasks zu definieren, verringert die maximal mögliche Puffergröße noch weiter, da diese auch Speicher beanspruchen.
Die Ausgabe nach dem Hochladen sagt bei 400 size Puffer
Globale Variablen verwenden 1458 Bytes (71%) des dynamischen Speichers, 590 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
(Ohne die FreeRTOS lib einzubinden kann ich ein Puffer von >1000 Byte auslesen.)
Whandall:
Wenn du auf Tasks stehst ist auch ein ESP32 schön. Dual-Core mit voller Task-Unterstützung, WiFi und Bluetooth.
Gut erkannt mit dem Audio-Player. Danke auch für die Anregung, werde mir wohl einen solchen zulegen. Dann sollte das mit FreeRTOS auch besser funktionieren, glaube ich.
PS:
postmaster-ino:
if (buffer_auffuellbar){
fülle Buffer aus
}else{
mache Task 3
}
In diesem Fall könnte Task 3 jedoch nicht von Task 2 unterbrochen werden. Task 3 müsste vollständig ausgeführt werden, bevor Task 2 wieder drankommen kann. Ich habe tatsächlich so etwas probiert, indem ich innerhalb von Task 3 nach jedem einzelnen Schritt geprüft habe ob das Buffer aufgefüllt werden muss - so eine Art Pseudo Multitasking. Das hat sogar ganz gut funktioniert, aber die Arbeitsschritte von Task 3 dürfen nur sehr wenig Zeit beanspruchen. Auch hier wäre ein schnellerer Prozessor gut.