【发布时间】:2012-07-05 23:13:11
【问题描述】:
我有一些禁用和启用中断的 C 宏,以便我可以定义代码的关键部分。我想确保优化器符合操作并且不会移动或删除它们。
#define ARM_INT_KEY_TYPE unsigned int
#define ARM_INT_LOCK(key_) ({ \
asm("MRS %0,cpsr" : "=r" (key_)); \
asm("MSR cpsr_c,#(0x1F | 0x80 | 0x40)"); \
})
#define ARM_INT_UNLOCK(key_) asm("MSR cpsr_c,%0" : : "r" (key_))
用法如下:
int init_i2c(p_device_i2c dev){
// Interrupts are enabled
doSomething();
ARM_INT_KEY_TYPE key;
ARM_INT_LOCK(key);
// Interrupts are disabled
pMX27_GPIO i2c_clk = (pMX27_GPIO)(GPIO_BASE_ADDR | I2C_CLK_PORT);
pMX27_GPIO i2c_sda = (pMX27_GPIO)(GPIO_BASE_ADDR | I2C_DATA_PORT);
i2c_clk->GIUS &= ~(1 << I2C_CLK_PIN); // I2C Signals
i2c_sda->GIUS &= ~(1 << I2C_DATA_PIN); // I2C Signals
ARM_INT_UNLOCK(key);
// Interrupts ON again
// Wait for stable
ARM_delay_clocks(5000);
i2c_stop(dev);
代码在优化关闭的情况下按预期工作,但我怀疑优化打开可能会出现问题。
在 asm 语句中添加 volatile 可以解决问题吗?
#define ARM_INT_UNLOCK(key_) asm volatile ("MSR cpsr_c,%0" : : "r" (key_))
【问题讨论】:
-
怀疑还是发现? :)
-
到目前为止只是怀疑。我过去一直被优化的副作用所困扰,所以我要小心
-
@sarnold 好吧,“将始终工作”和“将在每个星期二使用此特定编译器处理此特定代码”之间存在差异,因此要求提供一些保证行为的文档是一个好主意这样的事情。
标签: c optimization embedded