什么是位带操作,什么是位宽带别名名区

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(5839)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'CorTex-M3位带操作区的理解',
blogAbstract:'
对于STM32别名区的理解&1. 什么是位段、位带别名区?&2. 它有什么好处?
答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,&&&&&& MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0置。&&&&&& 而现在STM32的位段、位带别名区就为了实现这样的功能。&&&&&&&&&&&& 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。&&&&&& 它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT)&',
blogTag:'',
blogUrl:'blog/static/4',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:4,
permalink:'blog/static/4',
commentCount:1,
mainCommentCount:1,
recommendCount:4,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}对于STM32别名区的理解 - CSDN博客
对于STM32别名区的理解
&1. 什么是位段、位带别名区?
2. 它有什么好处?
答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,
&&&&& MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0置。
&&&&& 而现在STM32的位段、位带别名区就为了实现这样的功能。&&&&&&
&&&&& 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。
&&&&& 它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT)
&&&&& 就对应SRAM或I/O的一位。
&&&&& 这样呢,1MB SRAM就 可以有32MB的对应别名区空间,就是1位膨胀到32位(1BIT 变为1个字)
&&&&& 我们对这个别名区空间开始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相应的某地址的某一位的操作。
答2:& 简单来说,可以把代码缩小, 速度更快,效率更高,更安全。
&&&&& 一般操作要6条指令,而使用 位带别名区只要4条指令。&&&
&&&&& 一般操作是& 读-改-写& 的方式, 而位带别名区是 写 操作。防止中断对读-改-写& 的方式的影响。
//& STM32支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第二个则是片内外设
//& 区的最低1MB 范围。这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区
//& 把每个比特膨胀成一个32 位的字。
//& 每个比特膨胀成一个32 位的字,就是把& 1M& 扩展为 32M ,
//& 于是;RAM地址 0X(一个字节)扩展到8个32 位的字,它们是:(STM32中的SRAM依然是8位的,所以RAM中任一地址对应一个字节内容)
//&& 0X ,0X,0X,0XXX, 0XXC
// 支持位带操作的两个内存区的范围是:
// 0x‐x200F_FFFF(SRAM 区中的最低1MB)
// 0x‐x400F_FFFF(片上外设区中的最低1MB)
对SRAM 位带区的某个比特,记它所在字节地址为A,位序号
在别名区的地址为:
AliasAddr= 0x +((A‐x+n)*4 =0x; (A‐x + n*4
对于片上外设位带区的某个比特,记它所在字节的地址为A,位序号为n(0&=n&=7),则该比特
在别名区的地址为:
AliasAddr= 0x;((A‐x+n)*4 =0x; (A‐x + n*4
上式中,“*4”表示一个字为4 个字节,“*8”表示一个字节中有8 个比特。
// 把“位带地址+位序号”转换别名地址宏
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x;((addr &0xFFFFF)&&5)+(bitnum&&2))
//把该地址转换成一个指针
#define MEM_ADDR(addr)& *((volatile unsigned long& *)(addr))
// MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;
例如点亮LED
// 使用STM32库
&& GPIO_ResetBits(GPIOC, GPIO_Pin_4); //关LED5
&& GPIO_SetBits(GPIOC, GPIO_Pin_7);&& //开LED2
// 一般读操作
&&& STM32_Gpioc_Regs-&bsrr.bit.BR4 =1;// 1:清除对应的ODRy位为0
&&& STM32_Gpioc_Regs-&bsrr.bit.BS7 =1;// 1:设置对应的ODRy位为1
//如果使用 位带别名区操作
& STM32_BB_Gpioc_Regs-&BSRR.BR[4] =1;// 1:清除对应的ODRy位为0
& STM32_BB_Gpioc_Regs-&BSRR.BS[7] =1;// 1:设置对应的ODRy位为1
代码比STM32库 高效 十倍 !
对内存变量的位操作。
&& 1. // SRAM& 变量
&& 3. long CRCV
&& 5. // 把“位带地址+位序号”转换别名地址宏
&& 6. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x;((addr &0xFFFFF)&&5)+(bitnum&&2))
&& 7. //把该地址转换成一个指针
&& 8. #define MEM_ADDR(addr)& *((volatile unsigned long& *)(addr))
& 10. // 对32位变量 的BIT1 置 1 :
& 12. MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;
& 14. //对任意一位( 第23位 ) 判断:
& 16. if(MEM_ADDR(BITBAND( (u32)&CRCValue,23))==1)
本文已收录于以下专栏:
相关文章推荐
STM32可以通过位带操作实现像51单片机一样单独访问某些寄存器的某一位.其原理就是把在位带区中的每一位膨胀到32位映射到位带别名区.STM32分别有2个1MB大小的位带区,分别为外设和SRAM,所以...
原地址:/content/10/474_.shtml
对1. 什么是位段、位带别名区? 
2. 它有什么好处?
...
STM32 BIT_BAND 位带别名区使用入门
支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第二个则是片内外设 
//  区...
一、 什么是位段和别名区
    是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ...
对STM32中位带的理解
凡从事过ST MCU应用开发的人往往会遇到事件、中断事件 中断三个概念或术语。这三个概念彼此关联,有时会让人有点混淆或犯迷糊。
先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享...
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多:
(1)GPIO_Mode_AIN 模拟输入 
(2)GPIO_Mode_IN_FLOATING 浮空输入
在嵌入式应用程序开发过程里,由于使用C语言编程,基本很少涉及到机器底层寄存器的执行过程,一般都会直接在main函数里开始写代码,似乎main成为了理所当然的起点,尽管从C程序的角度来看程序都是直接从m...
STM32的中断优先级控制寄存器由两部分组成,
STM32中的堆栈在启动文件中有初始设置,也可以根据需求调整大小,不同的类型的变量也会存储在内存的不同区域。因此,深入理解STM32中的堆栈机制,对于合理使用内存,以及更高效的内存管理至关重要。
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客访问: 33068
博文数量: 11
博客积分: 1400
博客等级: 上尉
技术积分: 110
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
&  Cortex-M3&支持了位操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。
  在 CM3 &支持的位带中,有两个区中实现了位带。
  其中一个是 SRAM 区的最低 1MB 范围,&0x ‐ 0x200FFFFF(SRAM 区中的最低 1MB);
  第二个则是片内外设区的最低 1MB范围,&0x ‐ 0x400FFFFF(片上外设区中的最低 1MB)。
  这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。&
  CM3 使用如下术语来表示位带存储的相关地址&
  *&&位带区: &支持位带操作的地址区&
  *&&位带别名: &对别名地址的访问最终作用到位带区的访问上(注意:这中间有一个地址映射过程)&  
  位带区中的每个比特都映射到别名地址区的一个字 —— 这是只有 LSB 有效的字(位带别名区的字只有 最低位 有意义)。
  对于SRAM中的某个比特,该比特在位带别名区的地址:  
&&&&&&&&&&&&&&&&&& AliasAddr =&<FONT color=#x + ((A‐x+n)*4&
&&   & & & & &   &&&&&   = 0x + (A‐x + n*4 
&&&对于片上外设位带区的某个比特,该比特在位带别名区的地址:
  &&&&&&&&&&&&&& AliasAddr =&<FONT color=#<FONT color=#000000 + ((A‐x+n)*4&
&&   & & & & &   & &&&   = <FONT color=#cc00000 + (A‐x + n*4 
    其中 A 为该比特所在的字节的地址,0 &= n &= 7
   “*4”表示一个字为 4 个字节,“*8”表示一个字节中有 8 个比特。
    当然,位带操作并不只限于以字为单位的传送。亦可以按半字和字节为单位传送。& 
                    
  位带操作有很多好处,其中重要的一项就是,在多任务系统中,用于实现共享资源在任务间的“互锁”访问。多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”。
  在 C 语言中使用位带操作
  在 C编译器中并没有直接支持位带操作。比如,C 编译器并不知道同一块内存,能够使用不同的地址来访问,也不知道对位带别名区的访问只对 LSB 有效。
  欲在 C中使用位带操作,最简单的做法就是#define 一个位带别名区的地址。例如:
   #define DEVICE_REG0 ((volatile unsigned long *) (0x))&
   #define DEVICE_REG0_BIT0 ((volatile unsigned long *) (0x))&
   #define DEVICE_REG0_BIT1 ((volatile unsigned long *) (0x))&
   *DEVICE_REG0 = 0xAB;        //使用正常地址访问寄存器&
&&&& *DEVICE_REG0_BIT1 = 0x1;&&&&&&&&& // 通过位带别名地址设置 bit1
  还可以更简化:
   //把“位带地址+位序号”&转换成别名地址的宏
   #define BITBAND(addr, bitnum) ((addr & 0xFx2000000+((addr &&0xFFFFF)&&5)+(bitnum&&2))  
   //把该地址转换成一个指针&
   #define MEM_ADDR(addr) &*((volatile unsigned long *) (addr))
   于是:
   MEM_ADDR(DEVICE_REG0) = 0xAB;&&  //使用正常地址访问寄存器&  
   MEM_ADDR(BITBAND(DEVICE_REG0,1)) = 0x1;   &&//使用位带别名地址
  注意:当你使用位带功能时,要访问的变量必须用 volatile 来定义。因为 C 编译器并不知道同一个比特可以有两个地址。所以就要通过 volatile,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑 ,在中途使用寄存器来操作数据的复本,直到最后才把复本写回。
  GNC编译器不支持__attribute__(( at(addr) ))变量属性,在 GCC和 RealView MDK (即 Keil)&开发工具中,允许定义变量时手工指定其地址。如:&
 volatile unsigned long bbVarAry[7] __attribute__(( at(0x) ));&
 volatile unsigned long* const pbbaVar= (void*)(0xx);&
 //&在 long*后面的“const”通知编译器:该指针不能再被修改而指向其它地址。
 //&注意:at()中的地址必须对齐到4 字节边界。
 这样,就在0x处分配了7个字,共得到了32*7=224 个比特。&
 再使用这些比特时,可以通过如下的的形式:
    pbbaVar[136]=1; & //置位第 136号比特&
 不过这有个局限:编译器无法检查是否下标越界。
 那为什么不定义成“ baVarAry[224]“&的数组呢?
 & 这也是一个编译器的局限:它不知道这个数组其实就是 bbVarAry[7],从而在计算程序对内存的占用量上,会平白无故地多计入224*4个字节。
  对于指针义,为每个需要使用的比特取一个字面值的名字,在下标中只使用字面值名字,不再写真实的数字,就可以极大程度地避免数组越界。&&  
  请注意:在定义这“两个”变量时,前面加上了“volatile”。如果不再使用bbVarAry 来访问这些比特,而仅仅使用位带别名的形式访问时,这两个 volatile 均不再需要。
阅读(2736) | 评论(2) | 转发(0) |
上一篇:没有了
相关热门文章
给主人留下些什么吧!~~
使用位带实现互斥锁操作
在C程序中,可通过使用位带实现互斥锁,但需要使用位带存储区的内存单元(比如,一个字),该内存单元的每个位表示资源正被特定的任务使用。
在位带别名区的读写实质上是锁定的“读‐改‐写”(在传送期间总线不能被其它主机占有)。因此,只要每个任务都仅修改分配给它们自己的锁定
位,其它任务锁定位的值就不会丢失,即使是两个任务同时写自己的锁定位也不怕。
位带操作有可能使共享资源在一个短期内被“多重锁定”,从而有“瞬态紊乱”。但是它不会造成危害,因为任务一定能检测到这个冲突,从而释放自己的锁。
实际上,对于“测试并设置”这种互斥锁的简单操作,最好还是使用“关中临界区”来保护——即在操作前关中断,操作后开中断。
在多任务系统中,用于实现共享资源在任务间的“互锁”访问.多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”
能不能对这点结合位的操作在多说明点?
请登录后评论。位带操作,最全面的位带操作文章 - 电子工程世界网
在电子工程世界为您找到如下关于“位带操作”的新闻
位带操作资料下载
ucos arm 编程通过 ARM的 rPDATC(低四位)和rPDATE(4~7 位)扩展4×4的键盘,编的驱动,通过按键可以在超级终端上和液晶屏上显示相应的键值(不带操作系统求在超级终端上显示) 。...
位带操作相关帖子
& & 位操作由51单片机而来,结合自己最近看到的一个关于Cortex-M3位操作的介绍,说一下自己对CM3的位带操作的理解以及自己的实际应用。
& & 支持了位操作以后,可以使用普通的加载/存储指令来对单一的bit进行读写。在CM3中,有两个区中实现了位带。其中一个是SRAM区的最低1MB(0xx200FFFFF)范围,第二个是片...
;&0&&0 0 512
A相的逻辑和C8相同,B相的逻辑能看出来吗?B相逻辑是C8异或C7。程序上很简单,每次stepcounter值变化时执行:
A相IO控制位值=setpcounter第7位值;
B相IO控制位值=A相IO控制位值^setpcounter第8位值;
两句极性就被更新了,不管正转、反转极性输出总是对的,这里结合stm32的位带操作更好。上述内容...
学习学习 很好 不错,谢谢分享 不錯
& 實在很高興!可以看到這麼好的知識!謝謝分享!! 这个也要学习一下,我这一天就下楼主的文章了 不错 下下看看 果断收藏 学习一下 还有点迷 先mark 回头学习 mark. 好贴,要顶起来 一如既往的强大 ths,呵呵,学习学习 好好学习一下,真的写的不错呢............ 看看吧 Cortex-M3的位带操作...
倒塌STM32库。看来STM32库又要升级了! & & & & & & & & & & & & & & & && & 非常优秀的学者 位带操作有什么点亮与熄灭。另一方面,也对操作串行接口器件提供了很大的方便...
位带操作视频
你可能感兴趣的标签
热门资源推荐支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第二个则是片内外设&#160; //&#160; 区的最低1MB 范围。这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自&#160; //&#160; 己的“位带别名区”,位带别名区把每个比特膨胀成一个32 位的字&#160; //&#160; //&#160; 每个比特膨胀成一个32 位的字,就是把&#160; 1M&#160; 扩展为 32M ,&#160; //&#160; //&#160; 于是;RAM地址 0X(一个字节)扩展到8个32 位的字,它们是:&#160; //&#160;&#160; 0X ,0X,0X,0XXX, 0XXC&#160; // 支持位带操作的两个内存区的范围是:&#160; // 0x‐x200F_FFFF(SRAM 区中的&#160; // 0x‐x400F_FFFF(片上外设区中的最低1MB)&#160; /*&#160; 对SRAM 位带区的某个比特,记它所在字节地址为A,位序号&#160; 在别名区的地址为:&#160; AliasAddr= 0x +((A‐x+n)*4 =0x+ (A‐x + n*4&#160; 对于片上外设位带区的某个比特,记它所在字节的地址为A,位序号为n(0&=n&=7),则该比特&#160; 在别名区的地址为:&#160; AliasAddr= 0x+((A‐x+n)*4 =0x+ (A‐x + n*4&#160; 上式中,“*4”表示一个字为4 个字节,“*8”表示一个字节中有8 个比特。&#160; */&#160; // 把“位带地址+位序号”转换别名地址宏&#160; #define BITBAND(addr, bitnum) ((addr & 0xFx2000000+((addr &0xFFFFF)&&5)+(bitnum&&2))&#160; //把该地址转换成一个指针&#160; #define MEM_ADDR(addr)&#160; *((volatile unsigned long&#160; *)(addr))&#160; // MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;&#160; 例如点亮LED&#160; // 使用STM32库
&#160;&#160; GPIO_ResetBits(GPIOC, GPIO_Pin_4); //关LED5&#160; &#160;&#160; GPIO_SetBits(GPIOC, GPIO_Pin_7);&#160;&#160; //开LED2&#160; // 一般读操作&#160; &#160;&#160;&#160; STM32_Gpioc_Regs-&bsrr.bit.BR4 =1;// 1:清除对应的ODRy位为0&#160; &#160;&#160;&#160; STM32_Gpioc_Regs-&bsrr.bit.BS7 =1;// 1:设置对应的ODRy位为1&#160; //如果使用 位带别名区操作&#160; &#160; STM32_BB_Gpioc_Regs-&BSRR.BR[4] =1;// 1:清除对应的ODRy位为0&#160; &#160; STM32_BB_Gpioc_Regs-&BSRR.BS[7] =1;// 1:设置对应的ODRy位为1&#160; 代码比STM32库 高效 十倍 !
对内存变量的位操作。
// SRAM&#160; 变量&#160; long CRCV&#160; // 把“位带地址+位序号”转换别名地址宏&#160; #define BITBAND(addr, bitnum) ((addr & 0xFx2000000+((addr &0xFFFFF)&&5)+(bitnum&&2))&#160; //把该地址转换成一个指针&#160; #define MEM_ADDR(addr)&#160; *((volatile unsigned long&#160; *)(addr))&#160; // 对32位变量 的BIT1 置 1 :&#160; MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;&#160; //对任意一位( 第23位 ) 判断:&#160; if(MEM_ADDR(BITBAND( (u32)&CRCValue,23))==1)&#160; {&#160; }
阅读(...) 评论()}

我要回帖

更多关于 煤矿井下皮带运输别名 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信