Hallo,
ich habe zwar in den Foren hier schon einige Threads durchstöbert,
konnte aber noch nichts passendes für mein Projekt finden.
Vielleicht könnt ihr mir ja weiterhelfen.
Es geht um folgendes:
Ich habe eine Motorsteuerung (basierend auf einem AT91SAM7S256)
entwickelt.
Die Software hierfür beinhaltet einen Hauptzustandsautomaten, der die
grundlegenden Abläufe steuert, zyklisch aufgerufen von einem
Timer-Interrupt (Keine Angst, der Automat steht nicht in der ISR, ein
Ringpuffer sammelt die Events, die dann vom Automat bearbeitet werden).
Außerdem enthält die Software noch kaskadierte Reglerroutinen für eine
Motorregelung (Strom, Drehzahl, Lage) und verschiedene
Peripherie-Funktionen, wie z.B. Encoderauswertung, EEPROM-Zugriffe,
Lesen und Setzen von Steuerein- und Ausgängen, Datenaustausch mit
serieller Schnittstelle,...
Die bisherige Software ist sehr globale-Variablen-lastig, d.h. es gibt
mehrere globale Strukturen á 16 Byte, die jeweils ein Index-Byte vorne
und eine CRC16 am Ende enthalten. Die Bytes dazwischen enthalten die
relevanten Daten. Die Strukturen sind nach Funktionsbereich gegliedert,
z.B. Istwerte, Merker, Einstellungen,... (siehe Beispiel)
1 | typedef struct
|
2 | {
|
3 | uint8_t index;
|
4 | int8_t pwmDutyCycle_percent;
|
5 | int16_t current_mA;
|
6 | int16_t rotationSpeed_cHz;
|
7 | int16_t linearSpeed_mmps;
|
8 | uint16_t mainVoltage_mV;
|
9 | int16_t currentPosition_increments;
|
10 | int16_t blank;
|
11 | crc checksum;
|
12 | } MomentarySystemState_t;
|
Durch den festgelegten Aufbau der Strukturen können alle Daten auch
problemlos im EEPROM gespeichert bzw. über die serielle Schnittstelle
ausgelesen und verändert werden (Das war der Hauptgrund für diesen
Aufbau).
Und man hat natürlich überall Zugriff auf alles... (Datenkapselung? Was
ist das?...)
Die bisherige Software funktionert zwar gut, ist aber aus Wartungs- und
Portierbarkeits-Sicht etwas unvorteilhaft aufgebaut (auch bekannt als
Spagetthi-Code...).
Ich möchte das ganze modularer, übersichtlicher und leichter erweiterbar
gestalten und habe deshalb mit einer Überarbeitung angefangen.
Allerdings komme ich an diesem Punkt nicht richtig weiter.
Da es eben viele Daten gibt auf die man von verschiedenen Punkten aus
zugreifen können muss, bin ich hier in einer Zwickmühle:
Es wäre durch globale Variablen einfach zu bewerkstelligen, gleichzeitig
sollte man sie aber vermeiden.
Was ist Eures Erachtens nach die beste Vorgehensweise oder das beste
Konzept für den Datenaustausch in einer solchen Software?
Danke schon mal für eure Antworten.
Gruß, Martin.