C 优化器防止系统中变量被保存和更改,然后调用中断,然后重置变量

C 优化器防止系统中变量被保存和更改,然后调用中断,然后重置变量,c,compiler-optimization,C,Compiler Optimization,我有一个设置,需要将数据传递给中断。这是通过一个全局变量完成的。但我面临的问题是,这个设置可能会从中断调用,而中断可能会嵌套。因此,我需要以下设置: 已将全局变量的当前值保存到堆栈上的变量。 呼叫中断。 将堆栈上变量的值还原为全局变量 我的实施如下: extern volatile void* intrBlockObject; ... volatile void* storeAddr = intrBlockObject; intrBlockObject = object; if (increas

我有一个设置,需要将数据传递给中断。这是通过一个全局变量完成的。但我面临的问题是,这个设置可能会从中断调用,而中断可能会嵌套。因此,我需要以下设置:

已将全局变量的当前值保存到堆栈上的变量。 呼叫中断。 将堆栈上变量的值还原为全局变量 我的实施如下:

extern volatile void* intrBlockObject;
...
volatile void* storeAddr = intrBlockObject;
intrBlockObject = object;
if (increase){
    CALLSUPERVISOR(SVC_multiObjectIncrease);
} else {
    CALLSUPERVISOR(SVC_multiObjectDecrease);
}
intrBlockObject = storeAddr;
这个CALLSUPERVISOR部分是一个转换为中断的宏

这是可行的,直到优化器发挥作用。这个问题是否有一个可能的设置,我可以向优化器解释我想要什么?我希望在没有编译器特定指令的情况下执行此操作,只使用普通C。

声明

volatile void* intrBlockObject;
带或不带extern描述指向其内容不稳定的位置的指针。当程序需要其值的[部分]时,必须始终从主存读取该对象,并且必须始终将更改写入主存

然而,这与地址的易变性不同,而保存和恢复的是地址指针值本身。如果其他代码(例如中断处理程序)可能在C程序未知的情况下修改该指针,则必须使该指针不稳定:

如果合适的话,指针和指向的东西都可能是易变的:

这完全类似于const限定符的用法,在这种情况下,这种混淆非常常见。

声明

volatile void* intrBlockObject;
带或不带extern描述指向其内容不稳定的位置的指针。当程序需要其值的[部分]时,必须始终从主存读取该对象,并且必须始终将更改写入主存

然而,这与地址的易变性不同,而保存和恢复的是地址指针值本身。如果其他代码(例如中断处理程序)可能在C程序未知的情况下修改该指针,则必须使该指针不稳定:

如果合适的话,指针和指向的东西都可能是易变的:


这完全类似于const限定符的用法,在这种情况下,这种混淆非常常见。

谢谢!这就解决了问题。还有一个问题:void volatile*名称和void*volatile名称之间有什么区别?void volatile*与volatile void*相同。如果您希望指针本身是可变的,那么volatile关键字必须在*!这就解决了问题。还有一个问题:void volatile*名称和void*volatile名称之间有什么区别?void volatile*与volatile void*相同。如果您希望指针本身是可变的,那么volatile关键字必须在*之后。
volatile void * volatile intrBlockObject;