Guten Abend zusammen,
ich sehe gerade wieder den Wald vor lauter Bäumen nicht mehr. Ich habe
von einer Peripherie (TMC222) einen Zähler (16Bit, Zweierkomplement),
bei dem der Überlauf spezifiziert ist. Da mir der Zählbereich nicht
ausreicht, wird er regelmäßig gepollt und in einer 24-Bit-Zählvariablen
mitgeschrieben. Und so sieht der Quelltext aus:
1 | static int24_t stepact; // Schrittvariable
|
2 | static int16_t pos_last = 0; // Hilfsvariable
|
3 | void tmc222_poll(void) {
|
4 | int16_t pos_act = tmc222_GetPosition();
|
5 | int16_t diff;
|
6 |
|
7 | if (pos_act <0 ) {
|
8 | if (pos_last < 0) diff = pos_act-pos_last; // kein Overflow
|
9 | else diff = (pos_act-INT_MIN)-(pos_last-INT_MAX);
|
10 | }
|
11 | else {
|
12 | if (pos_last < 0) diff = (pos_act-INT_MAX)-(pos_last-INT_MIN);
|
13 | else diff = pos_act-pos_last; // kein Overflow
|
14 | }
|
15 |
|
16 | pos_last = pos_act;
|
17 | ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
18 | stepact += diff;
|
19 | }
|
20 | }
|
Ich bin mir momentan nur nicht sicher, ob ich den Integer-Overflow so
richtig berücksichtigt habe.
Viele Grüße
W.T.