Auf dem STM32 setze ich FreeRTOS ein. - In einem Lookup-Table stehen sämtliche zu sendenden Befehle, die Anzahl der Bytes, die auf den Befehl zurückgesendet werden sowie die Zeit, die der Chip braucht, um den Befehl auszuführen - Es gibt eine Task, welche auf niedrigster Priorität permanent aktiv ist und die aus einer State Machine besteht. Die Zustände sind im Wesentlichen: STATE_READY - Befehle können gesendet werden (Die Befehle werden über eine Queue empfangen, solange keine Befehle anstehen schläft die Task damit) STATE_SEND_ACTIVE - Hier wird gewartet, bis der Chip den Befehl ausgeführt hat (Anhand der Zeit im Lookup-Table, dies ist nötig, da es auch Befehle gibt, auf welche keine Daten zurückgesendet werden, dennoch gewartet werden muss, bis der Befehl verarbeitet ist) STATE_WAIT_FOR DATA - Hier wird gewartet bis die Anzahl erwarteter Daten empfangen ist (Oder ein Timeout abgelaufen ist) STATE_EVALUATE_DATA - Hier werden die empfangenen Daten ausgewertet - Der Data Ready Pin ist auf den entsprechenden EXTI Channel gemappt. Bei fallender Flanke an Data Ready (Ein Byte kann gelesen werden) löst der IRQ aus. Dort lese ich ein Byte aus (Aktuell direkt in der ISR, später evtl. noch per DMA), speichere es in einem Byte-Array und inkrementiere dieses dabei. - Nachdem die Daten empfangen werden wird der Indexer des Empfangsarrays wieder rückgesetzt. Zusätzlich wird natürlich immer überprüft, dass Arraygrenzen nicht verletzt werden können. Die Daten werden dann unabhängig vom Senden nach Adresse ausgewertet. Kommen Daten mit Adresse, können diese problemlos weiterverarbeitet werden. Ein Nachteil des Entkoppelten Sendens und Empfangens ist jedoch, das ein einfaches ACK oder NAK nicht mehr direkt dem gesendeten Befehl zugeordnet werden kann. - Werden Daten gesendet, obwohl dies nicht erwartet wird (automatische Fehlermeldungen), springt die State Machine automatisch in den WAIT_FOR_DATA state und der Empfangscouter auf 4 gesetzt (Fehlermeldungen sind immer 4 Bytes) - Weitere Nachteile sind mehrere globale Variablen, die ich benötige um das Empfangen und Abspeichern der Daten im Array an der richtigen Stelle zu garantieren