gpt4 book ai didi

c - C 编译器如何处理位域?

转载 作者:太空狗 更新时间:2023-10-29 17:01:20 24 4
gpt4 key购买 nike

我正在开发一个嵌入式项目(PowerPC 目标、Freescale Metrowerks Codewarrior 编译器),其中寄存器是内存映射的,并在漂亮的位域中定义,以便轻松调整各个位标志。

目前,我们正在使用此功能来清除中断标志和控制数据传输。虽然我还没有发现任何错误,但我很好奇这是否安全。有什么方法可以安全地使用位域,还是我需要将每个位域包装在 DISABLE_INTERRUPTS ... ENABLE_INTERRUPTS 中?

澄清一下:micro 提供的 header 具有如下字段

union {
vuint16_t R;
struct {
vuint16_t MTM:1; /* message buffer transmission mode */
vuint16_t CHNLA:1; /* channel assignement */
vuint16_t CHNLB:1; /* channel assignement */
vuint16_t CCFE:1; /* cycle counter filter enable */
vuint16_t CCFMSK:6; /* cycle counter filter mask */
vuint16_t CCFVAL:6; /* cycle counter filter value */
} B;
} MBCCFR;

我假设在位域中设置位不是原子的。这是一个正确的假设吗?编译器实际上为位域生成什么样的代码?使用 R(原始)字段自己执行掩码可能更容易记住该操作不是原子的(很容易忘记像 CAN_A.IMASK1.B.BUF00M = 1 这样的赋值是't 原子)。

感谢您的建议。

最佳答案

原子性取决于目标和编译器。例如,AVR-GCC 会尝试检测位访问并在可能的情况下发出位设置或清除指令。检查汇编程序输出以确保...

编辑:这是直接来自马口的 PowerPC 原子指令资源:

http://www.ibm.com/developerworks/library/pa-atom/

关于c - C 编译器如何处理位域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3299897/

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