小编old*_*cat的帖子

避免多次读取或写入内存的易失性位域赋值表达式

我想使用易失性位字段结构来设置硬件寄存器,如以下代码

union foo {
    uint32_t value;
    struct {
        uint32_t x : 1;
        uint32_t y : 3;
        uint32_t z : 28;
    };
};
union foo f = {0};
int main()
{
    volatile union foo *f_ptr = &f;
    //union foo tmp;
    *f_ptr =  (union foo) {
        .x = 1,
        .y = 7,
        .z = 10,
    };
    //*f_ptr = tmp;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,编译器会将其多次写入STRLDR HW 寄存器。可怕的是,当寄存器被写入时,它会立即触发硬件工作。

main:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed …
Run Code Online (Sandbox Code Playgroud)

c embedded assembly volatile bit-fields

4
推荐指数
1
解决办法
405
查看次数

标签 统计

assembly ×1

bit-fields ×1

c ×1

embedded ×1

volatile ×1