一学期的嵌入式系统学下来,印象最深的就要属位带操作了,这是典型的用空间换效率的做法,是Cortex-M3内核的一大特色。在此写下一些心得,也算是给本学期嵌入式系统这门课画上一个句号。
什么是位带操作?
Cortex-M3在内存中划出了两片1MB大小的位带区,每一片位带区都有一片位带别名区与之对应。位带别名区的把每个比特膨胀成一个32位的字,这样,通过操作位带别名区中的4个字节的字,就能控制位带区的每一个比特。
为什么要有位带操作?
通常,当我们要操作内存的某一位,即某一个比特时,都需要先把这个寄存器的值读到CPU中,然后经过移位、按位与或等等操作,最后再将新的值写回内存中去,完成修改。
这些操作其实没什么难度可言,就是写起来挺麻烦的,说白了就是dirty work……
因为懒是人类进步的动力嘛,所以我们希望能有办法避开这么复杂的操作,直接对任意比特进行操作。
于是,位带操作应运而生。
位带操作的过程
具体的过程我就不细讲了,书上有很详细的讲解。
大致思想就是,根据位带区中要操作的比特的地址(字节地址+比特位数),然后根据公式计算出对应的位带别名区中32位字的地址。这样,通过操作该字的第一个比特,就可以间接操作位带区中相应的比特位。
这样一来,省去了复杂的移位、与或等操作的代码,原来可能需要10行汇编语句才能完成的操作,现在只需要一两行就可以了,大大简化了原始操作。
位带操作的优越性
最大的优点就是,位带操作属于原子操作!
原子操作就是不能被中途打断的操作。没办法再把这步操作分割成几步操作,所以叫做原子操作。通常,CPU在一个执行周期内是不允许被打断的,但需要注意的是,原子操作并不等同于一个执行周期可以执行完的操作。事实上,位带操作其实只是把那些复杂的操作打包成一步操作,例如读取比特位,看上去只需要一行汇编指令,但实际上呢,计算机还是会把这条汇编指令分成多条机器指令去执行。本质上,执行起来和没有位带操作时是一样的。所以位带操作并不会缩短执行时间。只是我们看起来比较舒服而已。
但是!因为是原子操作,所以不会被中断打断!而不采用位带操作时,就会有被中断打断的可能。我们当然希望需要执行的操作不会被莫名其妙的中断打断~因此这也相当于提高了效率。