Gast
#2014695
Hallo ich habe eine grundsaetzliche Frage zur Programmstrukturierung unter FreeRTOS. Ein uC (CortexM3) System hat verschiedene HardwareDriver Tasks, welche periodisch Messdaten liefern. Diese Messdaten sollen dann global fuer alle SteuerTask zur Verfuegung stehen. Problem ist: Die SteuerTask sind sehr Problemabhaehngig. Es kann sein, das neue SteuerTask hinzukommen. Auf jeden Fall soll ein grosser Datenpool die Schnittstelle zwischen HardwareDriverTasks und Steuertask darstellen. Die Anzahl der HardwareDriverTask ist relativ definiert. Wie loesst man das Problem, dass Daten aus einem HardwareDriverTask von einer unbekannten Anzahl an SteuerTasks gelesen werden koennen und gleichzeitig sichergestellt wird, dass sie waehrend des lesens nicht veraendert werden? A) Theroretisch muesste man fuer jeden Empfaenger Task eine eigene Queue haben. Dies ist aber unpraktisch falls neue Steuertask hinzukommen (Speicherverbrauch und Arbeitsaufwand.) B) Eine globale Struktur wird von einem DatenTask gefuellt. Dieser DatenTask wartet auf die Queues der einzelnen HardwareDriverTask und kopiert die Daten in die globale Struktur. Hat der DatenTask eine genuegend hohe Prioritaet, so ist der Schreibeprozess sicher. Jedoch kann es passieren, das ein SteuerTask mehrere Daten aus der globalen Struktur lesen moechte und dabei durch einen Schreibvorgang auf die gleichen Daten durch den DatenTask unterbrochen wird. Somit liest der SteuerTask teils alte und teils neue Daten. Somit muesste man ein Mutex fuer diese globale Struktur definieren. Dann muss ich jedesmal einen Mutex nehmen und zurueckgeben um nur 1-2 Werte zu lesen. --> Overhead Gibt es eine Patentloesung fuer das One-To-Many Problem? Wie strukturiert man so ein Programm/Problem am besten. Vielen Dank Stephan