1. такие вещи надо объявлять volatile
2. инкремент будет транслирован минимум в 3 машинные команды, так что атомарности не будет
4. см. литературу по cortex-m (Джозеф Ю и др.), там все это описано в деталях
1. Я думал, что volatile - это для случая, если эту переменную может изменить какой-то периферийный модуль. Получается, что и прерывание считается "неожидаемым" для оптимизатора компилятора?