[uquote="uldemir",url="/forum/viewtopic.php?p=4142289#p4142289"]Нужно ли эти две переменные объявлять как volatile или нет? сейчас они просто:
[/uquote]Нужно. Более того - нужно запретить прерывания на время их записи (или иным образом обеспечить атомарность записи).
Добавлено after 1 minute 31 second:
[uquote="tonyk",url="/forum/viewtopic.php?p=4143025#p4143025"]
da-nie писал(а):Ну и запрет прерываний при изменении переменных нужен, конечно.
Я бы сказал "обязательно", если этот код будет работать на 8-битном МК.[/uquote]На 32-битном МК тоже - обязательно.
Добавлено after 12 minutes 32 seconds:
[uquote="uldemir",url="/forum/viewtopic.php?p=4143032#p4143032"]А если это MSP432 Cortex-M4F? Мне казалось, что запись 32 битного там поисходит разом и надобности запрещать прерывание нет. А то что левое колесо получит на 10 мс раньше правого - это ж мелочь.[/uquote]Так у вас там
2 записи 32-битных.
У вас внутри ISR одновременно используются обе этих переменные. А значит может быть ситуация, когда одно значение будет новым, другое - старым.
Конечно если для алгоритма это не существенно, то можно и забить. Но это может оказаться "выстрелом в ногу" в будущем. Когда забудете об этом и немного измените алгоритм.
PS: Неужто 3 команды на запрет/разрешение прерываний настолько критичны, что так пытаетесь их сэкономить???
PPS: Можно пойти и другим путём:
Код: Выделить всё
union {
struct { u16 XstartL, XstartR; };
u32 XstartL_XstartR;
} = {0, 0};
...
XstartL_XstartR = (u16)left | (u32)(u16)right << 16;
Здесь запись атомарна (на 32-битном МК), без запретов прерываний.