Ada*_*mke 8 c embedded bit-manipulation powerpc
我正在开发一个嵌入式项目(PowerPC目标,Freescale Metrowerks Codewarrior编译器),其中寄存器是内存映射的,并在很好的位域中定义,以便轻松地对各个位标志进行调整.
目前,我们正在使用此功能来清除中断标志并控制数据传输.虽然我还没有注意到任何错误,但我很好奇这是否安全.有没有办法安全地使用位字段,或者我需要将每个包装在DISABLE_INTERRUPTS ... ENABLE_INTERRUPTS?
澄清一下:micro提供的头文件有
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;
Run Code Online (Sandbox Code Playgroud)
我假设在位域中设置一点不是原子的.这是正确的假设吗?编译器实际为比特域生成了什么样的代码?使用R(原始)字段自己执行掩码可能会更容易记住操作不是原子操作(很容易忘记类似的赋值CAN_A.IMASK1.B.BUF00M = 1不是原子的).
您的建议表示赞赏.
原子性取决于目标和编译器。例如,AVR-GCC 尝试检测位访问并在可能的情况下发出位设置或清除指令。检查汇编器输出以确保...
编辑:这是直接来自马口的 PowerPC 原子指令的资源:
http://www.ibm.com/developerworks/library/pa-atom/
| 归档时间: |
|
| 查看次数: |
2799 次 |
| 最近记录: |