在STM32平台上实现Cortex-M3的位带特性
位操作是指单独操作某个数据中的某一位。在嵌入式程序设计中很常见,诸如设置标志位、判断一个字节某一位的值、取反一个字节的某一位等都需要通过位操作来完成。常见的51单片机可以通过sbit关键字进行位定义从而实现位操作。但事实上绝大部分的单片机(比如被广泛使用的AVR单片机)是不支持位操作的,如此一来就必须通过程序的设计来实现位操作,最常见的操作如下:
(1) a &=~(1 << 5); // 将变量 a 的第5位清0
(2) a |= (1 << 6); // 将变量 a 的第6位置1
(3) a ^=(1 << 2); // 将变量 a 的第2位取反
使用以上三句C代码进行位操作是一种很规范的方法,因为其没有使用任何非ANSI
C关键字,任何支持C编译的开发环境都支持这样的写法,这对程序的移植性有相当的好处。与此对应的,51单片机的keil uVision2开发环境所支持的sbit关键字就是非ANSI C关键字,因此若在用户程序中使用了此关键字,则该程序无法移植到其他开发环境中,该程序也不具备移植到其他硬件平台(比如德仪的MSP430单片机)的基础。
有少许C代码编写经验的读者应该知道,上述3句代码都是“复合”语句。选(1)句为例:该语句首先进行移位操作,再将移位后的结果进行取反,然后读取出变量a的值并与取反的结果进行“与”运算,总结起来便是“读出——修改——写入”的过程。如此一来从表面上来看就至少经过了4条指令才完成该句代码的执行——从代码效率的角度上来说,这并不是很理想。
[
本帖最后由 losingamong 于 2011-6-3 01:51 编辑 ]