打印
[ZLG-MCU]

这 bitband 的库处理 SRAMBITW(x,b)真是很失望

[复制链接]
3200|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AIRWILL|  楼主 | 2007-11-7 21:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本来, thumb2 指令设计的bitband 技术, 本来为了提供一个很高效率的位处理, 可是, 看看让这个处理的结果

;;40                 SRAMBITW(&xuc, 1) ^= 1; 
000072  4a0e              LDR      r2,|L1.172|
000074  4f0d              LDR      r7,|L1.172|
000076  1d12              ADDS     r2,r2,#4
000078  1d3f              ADDS     r7,r7,#4
00007a  f002 4270         AND      r2,r2,#0xf0000000
00007e  f3c7 0713         UBFX     r7,r7,#0,#20
000082  ea42 1247         ORR      r2,r2,r7,LSL #5
000086  4f0e              LDR      r7,|L1.192|
000088  433a              ORRS     r2,r2,r7
00008a  6817              LDR      r7,[r2,#0]
00008c  f087 0701         EOR      r7,r7,#1
000090  6017              STR      r7,[r2,#0]

要这么多指令才完成这个这么一个处理!
这结果, 真是失落!

相关帖子

沙发
ATmega16| | 2007-11-8 08:47 | 只看该作者

根xuc^=2一回事。

SRAMBITW(&xuc, 1) ^= 1; 
根xuc^=2一回事。

SRAMBITW(0x100, 1) =0
或者
SRAMBITW(0x100, 1) =1
才能节省指令。





使用特权

评论回复
板凳
zlgarm| | 2007-11-8 09:46 | 只看该作者

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

例如,代码的保密性,可以将一部份代码设置成只可以执行和改写,就是不能读取,这对于芯片的加密是前所没有的!
但是,现在的编译器还没有支持,当然啦,我相信以后会支持的.

相信ARM,相信Crotex-M3,相信Luminary,相信周立功,您的产品设计将会得到意想不到的收获。

    Crotex-M3取代ARM7的低端应用,是历史的使命,只是时间的关系,占尽先机您就能快人一步!

使用特权

评论回复
地板
ATmega16| | 2007-11-8 10:13 | 只看该作者

cortex-M3软硬件支持还不够


以前用AVR,都是5V,现在开始学cortex-M3,3.3V还不习惯。
cortex-M3就是软硬件支持力度还不够。
串行加载程序,作天还行的,今天就不灵了,不知道怎么回事。



使用特权

评论回复
5
逐风| | 2007-11-8 17:43 | 只看该作者

是你自己的问题

在我做luminary bitband实验的时候我看过了,是3个指令或者2个指令,速度非常的快,不知道你是什么问题,是自己的问题还是…………??

使用特权

评论回复
6
AIRWILL|  楼主 | 2007-11-8 19:22 | 只看该作者

回复

 xch 是 sram 中的一个变量,
 SRAMBITW(&xuc, 1) ^= 1; 就是该变量的 bit0 翻转

 我仔细看了看上面编译出来的代码
其实, 这麻烦就麻烦在地址的计算上

xch 的 bit0 , 可否有更好的办法.

使用特权

评论回复
7
逐风| | 2007-11-9 00:41 | 只看该作者

位操作

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

使用特权

评论回复
8
ATmega16| | 2007-11-9 09:08 | 只看该作者

编译器是不是有点傻

//    HWREGBITW(&A,3)=0;

        LSRS     R2,R1,#+28
        LSLS     R1,R1,#+12
        LSRS     R1,R1,#+12
        LSLS     R2,R2,#+28
        ORRS     R1,R2,R1, LSL #+5
        LDR.N    R2,??task1_0+0x8  ;; 0x200000c
        ORRS     R2,R2,R1
        STR      R0,[R2, #+0]

A是全局变量,那么变量A的地址应该可以看作是一个常量,那么
((unsigned long)(A) & 0xF0000000) | 0x02000000|(((unsigned long)(A) & 0x000FFFFF) << 5) | ((3) << 2)
应该也可以看作是一个常量,编译代码应该三条指令就可以了。

使用特权

评论回复
9
逐风| | 2007-11-9 14:35 | 只看该作者

楼上的猛男

AT,是你前几天在问bitband能否访问IO吗?你应该在这个方面比较熟悉啊,对KEIL生成的代码发一份上来咯,其实我也有…………呵呵

使用特权

评论回复
10
s99060| | 2007-11-9 16:15 | 只看该作者

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

使用特权

评论回复
11
逐风| | 2007-11-9 22:24 | 只看该作者

不是有个公式么?

不是有个公式么?比如你要操作0X20000002的第5位,根据公式可以算出在它所在的位操作区的地址,然后直接往里面写数据就可以直接对这个位操作。

使用特权

评论回复
12
s99060| | 2007-11-9 22:33 | 只看该作者

C 语言怎么写?

计算那部不管

使用特权

评论回复
13
AIRWILL|  楼主 | 2007-11-19 11:01 | 只看该作者

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

使用特权

评论回复
14
逐风| | 2007-11-20 23:39 | 只看该作者

12楼

用一个计算函数表示表示你所操作的bit_band 区里的位对应的字的关系
然后直接往字里写数据就表示你操作的位就是普通的赋值啊……

使用特权

评论回复
15
王紫豪| | 2007-11-21 18:09 | 只看该作者

谁相信我?哈哈




----------------
相信ARM,相信Crotex-M3,相信Luminary,相信周立功,您的产品设计将会得到意想不到的收获。

使用特权

评论回复
16
hotpower| | 2007-11-21 18:10 | 只看该作者

俺相信你~~~

使用特权

评论回复
17
ayb_ice| | 2007-11-21 20:54 | 只看该作者

光相信有用吗

使用特权

评论回复
18
s99060| | 2007-11-21 21:30 | 只看该作者

14楼:

逐风 发表于 2007-11-20 23:39 ZLG-MCU ←返回版面    

14楼: 12楼 

用一个计算函数表示表示你所操作的bit_band 区里的位对应的字的关系
然后直接往字里写数据就表示你操作的位就是普通的赋值啊……
 
 
问题是:这个字地址是C定的,取出字地址换算成bit地址好麻烦的,看看C出来的ASM就知道了,远不是M3的一条语句,所以zlg说的编译器不支持!

使用特权

评论回复
19
AIRWILL|  楼主 | 2007-11-21 22:06 | 只看该作者

楼上分析的有理

所以, 我在查 RV 可否对变量绝对地址的定义?
今天找到了. 资料称 __at 或者  __attribute__((at(0xXXXX))); 
可是怎么试, 前者编译出错, 后者呢警告, 然后不理我的设定!

真郁闷, 按理很简单的问题, 咋需要那么复杂呢?

使用特权

评论回复
20
ZLGARM| | 2007-11-22 09:24 | 只看该作者

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

556

主题

17724

帖子

884

粉丝