Цитата(jcxz @ Jul 11 2018, 09:57)

так как volatile (судя по её определению), должна сохранять неизменным только порядок доступов к памяти (чтений/записи).
Да, похоже что и даже это не так. Только что проверил: указание volatile даже
не гарантирует сохранение порядка доступов к памяти. По крайней мере в IAR 7.80:
Код
static int DteTstInline1(char const *str, uint, uint)
{
return 0x3871;
}
static int DteTstInline0(char const *str, uint c, uint n)
{
static int (* volatile const pf)(char const *, uint, uint) = DteTstInline1;
...
return (*pf)(str, c, __CLZ(n));
}
Код
...
LDR.W R3,??DataTable647_10
LDR R3,[R3, #+0]
CLZ R2,R6
MOV R1,R5
MOV R0,R4
ADD SP,SP,#+4
POP {R4-R9,LR}
BX R3
??DataTable647_10:
DC32 `...::pf`
??_Z13DteTstInline1PKcjj:
MOVW R0,#+14449
BX LR
Как видно - компилятор разорвал выражение
(*pf)(str, c, __CLZ(n)) и вставил между чтением volatile-константы и вызовом функции другой доступ к памяти:
POP {R4-R9,LR}. Что странно, так как в пределах volatile он не должен вроде менять порядок доступов к памяти....