@Fabian:
Jo korrekt mit dem Ringbuffer könnte man das Überschreiben durch den Master vermeiden...
@RolfD: ... der Schreibpointer darf natürlich NICHT vom Master kontrolliert werden sondern muss vom Slave verwaltet werden.

Ein Ringbuffer hat einen Schreib- und einen Lesepointer. Der Schreibpointer wird ausschließlich in der ISR gesetzt, der Lesepointer ausschließlich in der Anwendung (in Library Funktionen).

Um den Code einfach zu gestalten könnte man z.B. einen Ringbuffer mit einem 2D Array anlegen (oder 1D Array und jeweils entsprechend die Indizes um +n Bytes erhöhen).
Z.B. 16 Einträge für Schreibzugriffe vom Master mit jeweils max. 8 Bytes - das reicht für die üblichen Anwendungen wohl aus.


> Registerarray ... also quasi der "Ringbuffer" geschrieben werden...

Nene das hat gar nix mit einem Ringbuffer zu tun - s. Funktionsweise oben bzw. schau Dir den UART Code an.

Der ganze Inhalt des Arrays ist bei beginn JEDES schreibzugriffes sofort ungültig wenn man es für die Übertragung von zusammenhängenden Kommandos(!) verwendet.
Man kann natürlich für bestimmte Funktionen einfach fest sagen Array[23] ist für die LEDs, Array[42] ist für Geschwindigkeit links o.ä. dann braucht man keine Befehle wie beim derzeitigen Slaveprogramm und kanns direkt setzen.
Geht übrigens auch beides in Kombination mit dem bisherigen Slave Code.
Ganz geschickt könnte mans kombinieren indem man sagt die ersten 8 Bytes werden mit dem Ringbuffer für Kommandos gepuffert und die anderen kann man direkt wie normale Register beschreiben - ohne Buffer.


Nochmal anders gesagt falls das hier noch ein Missverständnis sein sollte:
Bislang ist in der Lib ja nur ein Haufen "Register" vorgesehen. Wie bei normalen I2C Slaves auch. Das die zufällig in einem gemeinsamen Array liegen hat nur den Grund, dass es so effizienter ist das in der ISR zu beschreiben. Wenn man den Haufen Register als Buffer auffassen möchte hat der eben nur die Tiefe 1 - kein Ring kein gar nix.

Daher sind die Pausen nach Befehlen notwendig damit der Slave Zeit hat drauf zu reagieren. Die kann man natürlich auch sinnvoll für andere Dinge verwenden nicht nur mSleep... wird z.B. bei den Beispielen mit den Ultraschallsensoren gemacht die brauchen ja z.B. typ. 65ms für ein Ping Kommando.


MfG,
SlyD