[ZLG-MCU] 这 bitband 的库处理 SRAMBITW(x,b)真是很失望

[复制链接]
4234|20
 楼主| AIRWILL 发表于 2007-11-7 21:36 | 显示全部楼层 |阅读模式
本来,&nbsp;thumb2&nbsp;指令设计的bitband&nbsp;技术,&nbsp;本来为了提供一个很高效率的位处理,&nbsp;可是,&nbsp;看看让这个处理的结果<br /><br />;;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRAMBITW(&xuc,&nbsp;1)&nbsp;^=&nbsp;1;&nbsp;<br />000072&nbsp;&nbsp;4a0e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,|L1.172|<br />000074&nbsp;&nbsp;4f0d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,|L1.172|<br />000076&nbsp;&nbsp;1d12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r2,#4<br />000078&nbsp;&nbsp;1d3f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,r7,#4<br />00007a&nbsp;&nbsp;f002&nbsp;4270&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r2,#0xf0000000<br />00007e&nbsp;&nbsp;f3c7&nbsp;0713&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UBFX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,r7,#0,#20<br />000082&nbsp;&nbsp;ea42&nbsp;1247&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r2,r7,LSL&nbsp;#5<br />000086&nbsp;&nbsp;4f0e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,|L1.192|<br />000088&nbsp;&nbsp;433a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r2,r7<br />00008a&nbsp;&nbsp;6817&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,[r2,#0]<br />00008c&nbsp;&nbsp;f087&nbsp;0701&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,r7,#1<br />000090&nbsp;&nbsp;6017&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,[r2,#0]<br /><br />要这么多指令才完成这个这么一个处理!<br />这结果,&nbsp;真是失落!<br />
ATmega16 发表于 2007-11-8 08:47 | 显示全部楼层

根xuc^=2一回事。

SRAMBITW(&xuc,&nbsp;1)&nbsp;^=&nbsp;1;&nbsp;<br />根xuc^=2一回事。<br /><br />SRAMBITW(0x100,&nbsp;1)&nbsp;=0<br />或者<br />SRAMBITW(0x100,&nbsp;1)&nbsp;=1<br />才能节省指令。<br /><br /><br /><br /><br /><br />
zlgarm 发表于 2007-11-8 09:46 | 显示全部楼层

Cortex的很多优越的性能,现行的编译器还没有完成体现出来

例如,代码的保密性,可以将一部份代码设置成只可以执行和改写,就是不能读取,这对于芯片的加密是前所没有的!<br />但是,现在的编译器还没有支持,当然啦,我相信以后会支持的.<br /><br />相信ARM,相信Crotex-M3,相信Luminary,相信周立功,您的产品设计将会得到意想不到的收获。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Crotex-M3取代ARM7的低端应用,是历史的使命,只是时间的关系,占尽先机您就能快人一步!
ATmega16 发表于 2007-11-8 10:13 | 显示全部楼层

cortex-M3软硬件支持还不够

<br />以前用AVR,都是5V,现在开始学cortex-M3,3.3V还不习惯。<br />cortex-M3就是软硬件支持力度还不够。<br />串行加载程序,作天还行的,今天就不灵了,不知道怎么回事。<br /><br /><br /><br />
逐风 发表于 2007-11-8 17:43 | 显示全部楼层

是你自己的问题

在我做luminary&nbsp;bitband实验的时候我看过了,是3个指令或者2个指令,速度非常的快,不知道你是什么问题,是自己的问题还是…………??
 楼主| AIRWILL 发表于 2007-11-8 19:22 | 显示全部楼层

回复

&nbsp;xch&nbsp;是&nbsp;sram&nbsp;中的一个变量,<br />&nbsp;SRAMBITW(&xuc,&nbsp;1)&nbsp;^=&nbsp;1;&nbsp;就是该变量的&nbsp;bit0&nbsp;翻转<br /><br />&nbsp;我仔细看了看上面编译出来的代码<br />其实,&nbsp;这麻烦就麻烦在地址的计算上<br /><br />xch&nbsp;的&nbsp;bit0&nbsp;,&nbsp;可否有更好的办法.<br />
逐风 发表于 2007-11-9 00:41 | 显示全部楼层

位操作

LM3S里的位操作区是需要一定的地址计算的,但是这只是为了你更方便的操作你的位而设置的函数。如果你已经计算好了地址,就可以直接往地址里写数据来操作你的需要操作的位,其实很简单一点也不会像楼主所说有那么多步骤,我原来用ZLG的例程特意看了一下才两个步骤,速度很快,和ARM7比较要快两倍左右吧估计!
ATmega16 发表于 2007-11-9 09:08 | 显示全部楼层

编译器是不是有点傻

//&nbsp;&nbsp;&nbsp;&nbsp;HWREGBITW(&A,3)=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LSRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,R1,#+28<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LSLS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R1,#+12<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LSRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R1,#+12<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LSLS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,R2,#+28<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R2,R1,&nbsp;LSL&nbsp;#+5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR.N&nbsp;&nbsp;&nbsp;&nbsp;R2,??task1_0+0x8&nbsp;&nbsp;;;&nbsp;0x200000c<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,R2,R1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,[R2,&nbsp;#+0]<br /><br />A是全局变量,那么变量A的地址应该可以看作是一个常量,那么<br />((unsigned&nbsp;long)(A)&nbsp;&&nbsp;0xF0000000)&nbsp;|&nbsp;0x02000000|(((unsigned&nbsp;long)(A)&nbsp;&&nbsp;0x000FFFFF)&nbsp;&lt&lt&nbsp;5)&nbsp;|&nbsp;((3)&nbsp;&lt&lt&nbsp;2)<br />应该也可以看作是一个常量,编译代码应该三条指令就可以了。<br />
逐风 发表于 2007-11-9 14:35 | 显示全部楼层

楼上的猛男

AT,是你前几天在问bitband能否访问IO吗?你应该在这个方面比较熟悉啊,对KEIL生成的代码发一份上来咯,其实我也有…………呵呵
s99060 发表于 2007-11-9 16:15 | 显示全部楼层

“已经计算好了地址直接往地址里写数据”怎么表示法?

  
逐风 发表于 2007-11-9 22:24 | 显示全部楼层

不是有个公式么?

不是有个公式么?比如你要操作0X20000002的第5位,根据公式可以算出在它所在的位操作区的地址,然后直接往里面写数据就可以直接对这个位操作。
s99060 发表于 2007-11-9 22:33 | 显示全部楼层

C 语言怎么写?

计算那部不管
 楼主| AIRWILL 发表于 2007-11-19 11:01 | 显示全部楼层

RV 可否对变量绝对地址的定义?

  
逐风 发表于 2007-11-20 23:39 | 显示全部楼层

12楼

用一个计算函数表示表示你所操作的bit_band&nbsp;区里的位对应的字的关系<br />然后直接往字里写数据就表示你操作的位就是普通的赋值啊……<br />
王紫豪 发表于 2007-11-21 18:09 | 显示全部楼层

谁相信我?哈哈

<br /><br /><br />----------------<br />相信ARM,相信Crotex-M3,相信Luminary,相信周立功,您的产品设计将会得到意想不到的收获。<br />
hotpower 发表于 2007-11-21 18:10 | 显示全部楼层

俺相信你~~~

  
ayb_ice 发表于 2007-11-21 20:54 | 显示全部楼层

光相信有用吗

  
s99060 发表于 2007-11-21 21:30 | 显示全部楼层

14楼:

逐风&nbsp;发表于&nbsp;2007-11-20&nbsp;23:39&nbsp;ZLG-MCU&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />14楼:&nbsp;12楼&nbsp;<br /><br />用一个计算函数表示表示你所操作的bit_band&nbsp;区里的位对应的字的关系<br />然后直接往字里写数据就表示你操作的位就是普通的赋值啊……<br />&nbsp;<br />&nbsp;<br />问题是:这个字地址是C定的,取出字地址换算成bit地址好麻烦的,看看C出来的ASM就知道了,远不是M3的一条语句,所以zlg说的编译器不支持!
 楼主| AIRWILL 发表于 2007-11-21 22:06 | 显示全部楼层

楼上分析的有理

所以,&nbsp;我在查&nbsp;RV&nbsp;可否对变量绝对地址的定义?<br />今天找到了.&nbsp;资料称&nbsp;__at&nbsp;或者&nbsp;&nbsp;__attribute__((at(0xXXXX)));&nbsp;<br />可是怎么试,&nbsp;前者编译出错,&nbsp;后者呢警告,&nbsp;然后不理我的设定!<br /><br />真郁闷,&nbsp;按理很简单的问题,&nbsp;咋需要那么复杂呢?
ZLGARM 发表于 2007-11-22 09:24 | 显示全部楼层

如果看了ZLG的书就不会这么说了

&nbsp;&nbsp;在群星系列中SRAM和外设区有两个位操作区,以SRAM为例,他的1MB的位操作区是从0x20000000--0x20100000,他所对应的32MB别名区是从0x22000000开始的,也就是他用0x22000000中的一个字来操作0x20000000那1MB的位操作区中的一位,,他两个区域有个公式相互对应,书上有介绍公式,如果你不知道怎么用C来写程序,请和我们联系。邮箱:lm3@zlgmcu.com<br />电话:020-22644252<br />在这里我先给个公式你自己看看<br />#define&nbsp;HWREGBIW(x,b)&nbsp;&nbsp;HWREG(((unsigned&nbsp;long)(x)&nbsp;&&nbsp;0xF0000000)&nbsp;|&nbsp;<br />0x02000000&nbsp;|&nbsp;(((unsigned&nbsp;long)(x)&nbsp;&&nbsp;0x000FFFFF)&nbsp;&lt&lt&nbsp;5)&nbsp;|&nbsp;((b)&nbsp;&lt&lt&nbsp;2))<br />这个函数是以字宽度访问,X为你想操作位操作区的地址,B为你想操作的哪个位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

556

主题

17729

帖子

885

粉丝
快速回复 在线客服 返回列表 返回顶部