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

Optimizer prevents system where variable is saved and changed, then interrupt is called and then variable is reset

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

  1. 已将全局变量的当前值保存到堆栈上的变量。
  2. 通话中断。
  3. 将栈中变量的值恢复为全局变量

我是这样实现的:

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)描述指向其 内容volatile 的位置的指针。程序在需要 [部分] 值时必须始终从主内存中读取该对象,并且必须始终将更改写入主内存。

然而,这不是一回事,因为 地址 volatile,它是您正在保存和恢复的地址(指针值本身)。如果其他代码(例如中断处理程序)可能会在 C 程序不知道的情况下修改该指针,那么您必须使 pointer volatile:

void * volatile intrBlockObject;

如果合适,指针和指向的东西都可以是volatile:

volatile void * volatile intrBlockObject;

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