Если я правильно осилил сию тему - то при выключенном кеше "всё работает" ?
Мысли вслух:
1 - почитать на еррату в части кеша
2 - посмотреть в код (в частности в реализацию протек/унпротек)
там упоминается
pbuf.с
SYS_ARCH_PROTECT(old_level);
pbuf_free_ooseq_pending = 1;
SYS_ARCH_UNPROTECT(old_level);
pbuf.h
#define PBUF_CHECK_FREE_OOSEQ() do { if(pbuf_free_ooseq_pending) { \
Другими словами в одно случае есть протек/унпротек, а в другом нет.
Саму реализацию протек/унпротек я не смотрел - она кажется от проца/оси зависит.
3 - возможно требуется применять асм команды "барьеры данных" (как они точно работают - я не вникал, знаю что есть).
пс: сильно "глубоко не копал"...
ну и докучи посмотреть дизасм: десять команд до и десять после мест, где используется эта переменная. таких мест по коду кажется всего три штуки: установка в ноль, установка в единицу, тестирование.