> @all:
> Welche Stolpersteine gibt es sonst noch auf die Schnelle, auf die ich
> aufpassen sollte?
Ich nehme immer die Typen aus "<stdint.h>", dann weiß ich, wie viele
Bytes es sind. Außerdem nehme ich natürlich auch immer den kleinsten
Typ, in den die benötigten Werte passen. Also nicht
sondern
1 | volatile int8_t flag = 0;
|
Wenn man die 2 Byte Werte braucht und mit einem Interrupt teilt, dann
reicht "volatile" oft nicht aus, man muss "cli(); .... ; sei();" (oder
analoges) benutzen, sonst sieht man u.U. unerwartete "Geisterwerte". Das
gilt auch für 16 Bit I/O SFRs, wenn man die 16 Bit Register oder einen
Teil davon auch aus dem Interrupt nutzt. Und für "read and modify" gilt
dies natürlich auch.
Bei besonderen I/O Operationen mit "Zeitfenster" (z.B. Watchdog füttern,
System Clock Prescaler ändern) sollte man die entsprechenden Funktionen
verwenden. Wenn man es, aus welchem Grund auch immer, selber
programmieren möchte, muss man inline Assembler nehmen.
Da der CPU Core bei vielen Applikationen nur wartet, versuche ich
möglichst mit "sleep" etwas Energie zu sparen. Man muss natürlich die
Doku beachten, sonst schläft der Core vielleicht länger, als man
wollte :-).