优化器防止系统保存和更改变量,然后调用中断然后重置变量
Optimizer prevents system where variable is saved and changed, then interrupt is called and then variable is reset
我有一个需要将数据传递给中断的设置。这是通过全局变量完成的。但我面临的问题是,此设置可能会从中断中调用,并且中断可能会嵌套。所以我需要以下设置:
- 已将全局变量的当前值保存到堆栈上的变量。
- 通话中断。
- 将栈中变量的值恢复为全局变量
我是这样实现的:
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
限定符的用法,在这种情况下,这种混淆非常普遍。
我有一个需要将数据传递给中断的设置。这是通过全局变量完成的。但我面临的问题是,此设置可能会从中断中调用,并且中断可能会嵌套。所以我需要以下设置:
- 已将全局变量的当前值保存到堆栈上的变量。
- 通话中断。
- 将栈中变量的值恢复为全局变量
我是这样实现的:
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
限定符的用法,在这种情况下,这种混淆非常普遍。