Forum: Compiler & IDEs assert.h auf AVR


von Lutz (Gast)


Lesenswert?

Hallo,
wenn man erst mal weiß, wonach man sucht, geht es doch deutlich 
einfacher ...
Ich wollte mir einige Hilfsfunktionen schreiben, um Fehler zur Laufzeit 
zu bearbeiten (z.B. beim CAN-Controller MCP2515 einem change-mode 
befehlen, artig alle laufenden messages abwarten und dann das 
Statusregister zurücklesen, ob der Mode auch tatsächlich ausgeführt 
wird). Bei µC's kann man nach meinem bisherigen Wissen ja nicht so viel 
machen (da kein STDERR etc.), und immer gleich einen Reset hilft auch 
nicht wirklich weiter. Also dachte ich mir, schreib die Fehler quasi als 
Log auf eine SD-Karte.
Dann fand ich assert() als scheinbar supergeniale Möglichkeit, 
Sourcefilenamen und Funktionsnamen als Variable zu haben (#error und 
#warning für den Preprozessor als weitere super Testmethode fielen bei 
der Suche gleich mit ab). Nur schweigt sich die libc da aber etwas aus 
bzw. ich habe es wohl doch noch nicht ganz verstanden, wie man das auf 
einem µC anwendet.
Hat jemand mal einen Link auf irgendeinen Beispielcode, wo die 
Verwendung klar wird?

von Stefan E. (sternst)


Lesenswert?

Lutz schrieb:

> Nur schweigt sich die libc da aber etwas aus

???
Ich finde nicht, dass die AVR-Libc-Doku zum assert irgendwie unklar oder 
lückenhaft wäre. Was genau fehlt dir da?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du musst halt insbesondere stderr (in Kleinbuchstaben ;-) so
ausstaffieren, dass es auf deine SD-Karte schreibt.

Es gibt ein stdiodemo...

von Lutz (Gast)


Lesenswert?

@ Stefan:
Wenn Du das hier meinst, find ich es "sehr überschaubar".
http://www.nongnu.org/avr-libc/user-manual/group__avr__assert.html
Ich verstehe das so, daß wenn man __ASSERT_USE_STDERR nicht definiert, 
einfach nur abort() aufgerufen wird (was vermutlich zu einem Reset 
führt?).

@ Jörg:
Da werde ich dann heute Abend mal etwas in der stdiodemo stöbern.

von Stefan E. (sternst)


Lesenswert?

Lutz schrieb:
> @ Stefan:
> Wenn Du das hier meinst, find ich es "sehr überschaubar".

Und? Es steht eigentlich alles drin, was man wissen muss. Daher nochmal 
die Frage: was genau vermisst du dort?

> Ich verstehe das so, daß wenn man __ASSERT_USE_STDERR nicht definiert,
> einfach nur abort() aufgerufen wird.

Ja.

> (was vermutlich zu einem Reset führt?).

Nein. Aber auch die abort-Funktion ist dokumentiert.

von Simon K. (simon) Benutzerseite


Lesenswert?

Die Sache mit stdout/stderr Umleiten siehe hier:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html

von Lutz (Gast)


Lesenswert?

Hmh ...
Da scheint mir dann doch eher etwas ANSI-C(-Mangel) das Problem zu sein. 
Die Links helfen mir da auf jeden Fall weiter, Danke. Wie gesagt: Wenn 
man erst mal weiß, wonach man sucht, geht's deutlich leichter.

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
Noch kein Account? Hier anmelden.