您好、欢迎来到现金彩票网!
当前位置:手机棋牌游戏平台 > 位操作 >

STM32 之位带操作

发布时间:2019-05-25 18:16 来源:未知 编辑:admin

  这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。

  *位带别名:对别名地址的访问最终作用到位带区的访问上(注意:这中间有一个地址映射过程)

  位带区中的每个比特都映射到别名地址区的一个字 这是只有 LSB 有效的字(位带别名区的字只有 最低位 有意义)。

  “*4”表示一个字为 4 个字节,“*8”表示一个字节中有 8 个比特。

  当然,位带操作并不只限于以字为单位的传送。亦可以按半字和字节为单位传送。

  位带操作有很多好处,其中重要的一项就是,在多任务系统中,用于实现共享资源在任务间的“互锁”访问。多任务的共享资源必须满足一次只有一个任务访问它亦即所谓的“原子操作”。

  在 C编译器中并没有直接支持位带操作。比如,C 编译器并不知道同一块内存,能够使用不同的地址来访问,也不知道对位带别名区的访问只对 LSB 有效。

  欲在 C中使用位带操作,最简单的做法就是#define 一个位带别名区的地址。例如:

  注意:当你使用位带功能时,要访问的变量必须用 volatile 来定义。因为 C 编译器并不知道同一个比特可以有两个地址。所以就要通过 volatile,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑,在中途使用寄存器来操作数据的复本,直到最后才把复本写回。

  在 GCC和 RealView MDK (即 Keil)开发工具中,允许定义变量时手工指定其地址。如:

  //在 long*后面的“const”通知编译器:该指针不能再被修改而指向其它地址。

  这也是一个编译器的局限:它不知道这个数组其实就是 bbVarAry[7],从而在计算程序对内存的占用量上,会平白无故地多计入224*4个字节。

  对于指针义,为每个需要使用的比特取一个字面值的名字,在下标中只使用字面值名字,不再写真实的数字,就可以极大程度地避免数组越界。

  请注意:在定义这“两个”变量时,前面加上了“volatile”。如果不再使用bbVarAry 来访问这些比特,而仅仅使用位带别名的形式访问时,这两个 volatile 均不再需要。

http://tritecbuilding.com/weicaozuo/19.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有