使用 GCC 的 MSP430 位操作内在函数

Posted

技术标签:

【中文标题】使用 GCC 的 MSP430 位操作内在函数【英文标题】:Bit manipulation intrinsics using GCC for MSP430 【发布时间】:2016-07-14 15:20:15 【问题描述】:

MSP430 系列微控制器提供快速位设置/位清除机器指令。

这些位操作命令对于某些具有副作用或需要原子访问以防止故障或竞争条件的寄存器或 I/O 操作很有用。

但是,除了 MSP430 内核的几乎所有其他特殊功能的许多内部函数外,GCC 不提供位操作指令的内部函数。

这是为什么呢? GCC 是否仍然发出这些指令,发出这些指令需要哪些 C 代码?

【问题讨论】:

【参考方案1】:

C 语言已经允许表达位操作:

$猫比特.c #include 无效主要(无效) P1IFG &= ~BIT1; P1IE |= BIT1; $ msp430-gcc -mmcu=msp430f2013 -Os -S bits.c $猫比特.s ... ;序幕结束 BIC.B #2, &0x0023 BIS.B #2, &0x0025 ;尾声的开始 ...

【讨论】:

好酷,所以通过位运算符和一位掩码的“最可能风格”的位操作被优化为适当的硬件命令。这是理所当然的吗?如果位掩码是变量怎么办? 那将是一个不同的问题。但我建议你问第三个问题,“我如何检查 gcc 生成的机器指令?” 好吧,最好告诉 C 位设置而不是做一些普通的 C 并检查构建结果是否每次都适合... @dronus:如果你想用汇编语言编写,那就这样做吧。 (但是don't use inline-asm for this;那将是自取其辱。)如果你想用 C 语言编写,你必须要么信任编译器,要么检查它的输出。大多数时候,对于大多数平台,gcc 都会很好地使用指令集。检查几次后,您可能会确信它做得很好,不需要每次都检查。 @dronus:如果您希望编译器能够优化您的代码(这是使用 C 而不是 asm 的一部分),设置位的内在含义必须是“设置这个位以任何方式最有效”,而不是“我需要一个带有这些操作数的 BIS.B 指令”。前者很好地表达了P1IE |= BIT1。编译器理解这一点,知道它的含义,以及如何为它生成有效的代码。

以上是关于使用 GCC 的 MSP430 位操作内在函数的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 msp430 中进行多精度算术(整数大于 64 位)?

MSP430F149最小系统原理图与芯片封装

Chapter2 MSP430硬件结构

msp430f2618写16位双通道 SPI接口DA DAC8552 精确度超高

MSP430单片机学习视频

用IAR仿真msp430f5438a出现问题,急待解决