Hallo zusammen, ich habe mal wieder eine Frage zu guter Praxis. Wie verwaltet ihr innerhalb eines µC-Projekts Fehlercodes? Insbesondere natürlich mit der Möglichkeit, diese später innerhalb des Projekts wiederzufinden und auf eine Quelltext-Zeite zurückzuführen, sollte beim Testen einer erscheinen. Meine erster Ansatz war damals: Eine zentrale errorcodes.h-Datei enthält alle Fehlercodes und -Texte. Das hatte den Nachteil, daß bei Änderungen des Quelltextes nie die Fehlermeldungen angepaßt wurden. Außerdem bedurfte es dann immer der Suche, wo die entsprechende Fehlermeldung überhaupt im Quelltext aufgerufen wird. Späterer Ansatz: Fehlercodes haben alle 16 Bit. Die ersten vier Bit geben das Modul, die nächsten vier Bit die Quelltext-Datei wieder, die letzten acht Bit werden frei innerhalb der Quelltext-Datei vergeben. Das hatte den Nachteil, daß die Module und ihr Fehler-Präfix manuell in einer Tabelle verwaltet werden mußte. Aktueller Ansatz: Fehlercodes haben 16 Bit und werden fortlaufend vergeben. Bevor eine neue Fehlernummer vergeben wird, wird eine projektweite Textsuche durchgeführt. Wie löst ihr das? Viele Grüße W.T.
Hallo Walter, du hast nicht erwähnt ob du eine Debug-Ausgabe per UART hast oder ob du alle Fehler z.B. im Flash oder auf einer SD-Karte speicherst. Aber wenn du wissen möchtest wo ein Fehler (im Source) aufgetretten ist, kannst du doch den Präprozessor nutzen.
1 | __FILE__
|
und
1 | __LINE__
|
Habs mal mit meiner Debug-Ausgabe getestet:
1 | dbg("Datei: %s Zeile: %d\n", __FILE__, __LINE__); |
Oder habe ich dein Problem falsch verstanden? Fehlernummern ansich würde ich fortlaufend in einer Datei ablegen.
Adam P. schrieb: > du hast nicht erwähnt ob du eine Debug-Ausgabe per UART hast [...] Das war Absicht. Spätestens in der Erprobungsphase im "Feldbetrieb" habe ich diese Möglichkeiten ohnehin nicht mehr. Da muß ich mit den Ausgaben leben, die das Gerät (kleine Bastelei) intern besitzt. In meinem aktuellen Fall ist das eine 3-stellige LED-Anzeige, mit der ich maximal 12 Bit Fehlercode komfortabel notierbar ausgeben kann. Aber die Frage bezog sich ja auf gute Praxis, war also allgemein gehalten.
Mir war es vor allem wichtig, dass die Texte mitten im Programm stehen, z.B. so:
1 | if (*sp != 0x42424242) {
|
2 | taskp->stackalarm = 1; |
3 | SYSLOG (52, "i" "Stack alarm [%d]", taskp->pid, 0); |
4 | } |
und zwar bei Bedarf in allen Sprachen
1 | SYSLOG (64, "z" "Auf Werkszustand zurückgesetzt^Reset to factory defaults", 0, 0); |
SYSLOG muss leider ein Macro sein, weil die Texte in eine eigene section gehören:
1 | #define SYSLOG(id,txt,p1,p2) \ |
2 | while (0); \ |
3 | static const char __attribute__((section(".syslog"),used)) \
|
4 | SYSLOG_TXT_##id[] = #id txt; \ |
5 | syslog (id, p1, p2) |
syslog() speichert (nur) die id, die zwei Variablen und die Zeit in einem NOR-Flash. Eine menschenlesbare Anzeige gleich aus syslog() heraus hat sich seltsamerweise nicht bewährt und passiert unabhängig davon. Es gibt keine zentrale Verwaltung der Fehler-ids, sondern ein Script, das alle Quellen nach SYSLOG durchsucht und eine formatierte Liste ausgibt. Die braucht man ja hinterher sowieso. Wenn ich eine neue id brauche, erzeuge ich die Liste neu und suche mir eine freie. Zwecks Rückwärtssuche steht der Filename der Quelle mit in der Liste.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.