gpt4 book ai didi

c - 如何防止优化编译器破坏无中断临界区?

转载 作者:太空狗 更新时间:2023-10-29 16:55:56 26 4
gpt4 key购买 nike

我有一些禁用和启用中断的 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);

代码在关闭优化的情况下按预期工作,但我怀疑打开优化可能会出现问题。

将 volatile 添加到 asm 语句中是否有效?

#define ARM_INT_UNLOCK(key_) asm volatile ("MSR cpsr_c,%0" : : "r" (key_))

最佳答案

是的,asm volatile 是编写这个宏的正确方法。您可以通过在调试器上逐步执行此代码并在汇编级别观察操作顺序来轻松检查行为。或者,您可以直接检查函数的反汇编输出。

这里有一些关于内联 asm 的有用的 gcc 文档

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.4

关于c - 如何防止优化编译器破坏无中断临界区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11353786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com