打印

bitband与互斥访问

[复制链接]
6249|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HSunrays|  楼主 | 2010-5-18 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教版主:
1 STM32F1xxx的所有的SRAM存储器和外设寄存器都可用位段的别名读写,他们都在bitband区的?
2 STM32Fxxxx存储空间哪些是互斥访问指令(LDREX/STREX)有效区域,每条指令互斥有效范围多大?
沙发
香水城| | 2010-5-18 14:29 | 只看该作者
1)是的,所有的SRAM存储器和外设寄存器都可用位段的别名读写。
2)对不起,我没有研究过Cortex-M3的指令,你能说说互斥访问指令的作用是什么吗?

使用特权

评论回复
板凳
HSunrays|  楼主 | 2010-5-18 15:48 | 只看该作者
谢谢香主!
1)那么所有外设寄存器都可以按位操作了?
2)LDREX和STREX指令族,也就是RealView指令内在函数:__ldrex,__ldrexd,__strex和 __strexd,ARM CM3的存储器互斥访问.

使用特权

评论回复
地板
HSunrays|  楼主 | 2010-5-18 15:51 | 只看该作者
我还没看到ST32Fxxxx有哪个相关资料说到互斥访问,是不是不支持哦?

使用特权

评论回复
5
香水城| | 2010-5-18 16:07 | 只看该作者
1)所有外设寄存器都可以按位操作。
2)STM32使用Cortex-M3的核心,除了MPU之外,STM32实现了完整的Cortex-M3核心。你说的互斥访问是什么意思?

使用特权

评论回复
6
HSunrays|  楼主 | 2010-5-18 16:18 | 只看该作者
引用<ARM CM3 权威指南>:
     LDREX的语法同LDR相同,这里不再赘述。而STREX则不同。STREX指令的执行是可以被“驳回”的。当处理器同意执行STREX时,Rxf的值被存储到(Rn+offset)处,并且把Rd的值更新为0。但若处理器驳回了STREX的执行,则不会发生存储动作,并且把Rd的值更新为1。
其实,奥妙就在于这个“驳回”的规则上。规则可宽可严,最严格的规则是:
当遇到STREX指令时,仅当在它之前执行过LDREX指令,且在最近的一条LDREX指令执行后,没有执行过其它的STR/STREX指令,才允许执行本条STREX指令——也就是说只有在LDREX执行后,从时间上与之距离最近的一条STREX才能成功执行。
其它情况下,驳回此STREX。包括:
 中途有其它的STR指令执行
 中途有其它的STREX指令执行。
这种最严格的规则也是最容易实现的规则。在CM3的技术参考手册中,推荐实现者标记出一段有限的地址,只在这段地址中适用互斥访问的规则,而不要对所有4GB都限制住。这段地址通常是从LDREX指令族给出的地址开始,长度在16字节至4K字节范围内。但芯片制造商可能更倾向严格的规则。
在使用互斥访问时,LDREX/STREX必须成对使用。

使用特权

评论回复
7
香水城| | 2010-5-18 17:02 | 只看该作者
抱歉,我不知道这一点是怎么实现的,待我问问吧。

使用特权

评论回复
8
HSunrays|  楼主 | 2010-5-18 17:54 | 只看该作者
多谢,我想用位访问与互斥访问实现互斥信号量。

使用特权

评论回复
9
香水城| | 2010-5-18 18:12 | 只看该作者
如果只是为了实现互斥信号量,应该有其它办法,可以直接用BitBanding实现。

使用特权

评论回复
10
HSunrays|  楼主 | 2010-5-18 18:18 | 只看该作者
当然有其他方法,但若支持CM3本身的互斥访问,那就更完美。在执行速度,耗用资源上其他的方法应该是不可与其比拟的。

使用特权

评论回复
11
香水城| | 2010-5-18 18:37 | 只看该作者
当然有其他方法,但若支持CM3本身的互斥访问,那就更完美。在执行速度,耗用资源上其他的方法应该是不可与其比拟的。
HSunrays 发表于 2010-5-18 18:18


哈哈,这可不一定。

如果你不介意,请分享一下使用LDREX/STREX实现互斥信号量的算法。

使用特权

评论回复
12
HSunrays|  楼主 | 2010-5-18 19:38 | 只看该作者
比如我要访问一共享资源,使用一个存储单位(字/字节)标志该共享资源的使用状态,为0表示该资源空闲,否则为使用者身份(如多任务的任务ID)。当要申请使用该设备时,使用者把自己身份用STREX存储到该地址,检查STREX指令的返回值(int __strex(unsigned int val, volatile void *ptr))检查返回值就可判断该资源是否申请成功,并且立即锁定该资源以免冲突。

使用特权

评论回复
13
ShakaLeo| | 2010-5-18 23:02 | 只看该作者
ST的官网上下载的库里有LDREX和STREX相关的函数,是用嵌入汇编编写的,C程序也能调用,可见STM32应该是可以使用这两个指令的。 至于有效范围,楼主可以做实验试一下, 估计是在整个flash区域都有效的。
你这种方法实现的信号量跟普通RTOS的信号量相比,虽然执行速度看似快了,但有个很明显的缺陷就是没有等待信号量的队列,一个线程申请到了信号量,使用完相关资源后释放信号量,那么这时其它已经申请该信号量但是没有申请成功的线程得不到立即调度,线程间通讯的实时性变差。如果一个线程申请该信号量不成功,那么只能是休眠,然后再次申请,如此往复,直到申请成功,效率不高。

使用特权

评论回复
14
ciniao| | 2010-5-19 08:57 | 只看该作者
mark

使用特权

评论回复
15
HSunrays|  楼主 | 2010-5-20 11:39 | 只看该作者
那当然自己的稍微修改下RTOS的型号两相关函数,其实RTOS很多系统处理不针对专门的CPU架构,因而没有利用到各架构CPU的优点特性,生搬硬套RTOS当然就会觉得反而不好,用RTOS只是用他的思想,想要用的好还要使用者结合实际作些调整,那样才会用得更好!除非时间紧急,是用一个东西,你弄透了,不要知其然而不知其所以然,你才能用得好,用得活!

使用特权

评论回复
16
ShakaLeo| | 2010-5-20 13:55 | 只看该作者
使用RTOS,不是非得改一改才是弄懂了弄透了,RTOS的可移植性是非常重要的,你把它改的跟硬件关系太大了就不好移植了。
个人以为,LDREX和STREX这两条指令,是为了对某些全局变量实现互斥访问而设计的,由于ARM的寻址方式,对全局变量的修改一般是load --->modify ---->store这么一个顺序,在这个过程中如果不关中断,就可能被ISR或者其它线程打断,等再次回到这个线程的时候其它ISR或线程对该变量的修改就可能丢失。LDREX和STREX这两条指令解决了这一问题。
但如果说把RTOS的信号量改成基于这两条指令,不敢苟同,而且改了之后有什么优势? 如果修改之后的信号量仍然像改之前那样有线程等待队列的功能,那么修改之后在速度和资源消耗上的优势几乎可以忽略,和改之前一个样。而且改不好还会影响RTOS的稳定性。

使用特权

评论回复
17
HSunrays|  楼主 | 2010-5-20 15:33 | 只看该作者
回楼上,个人喜好不用了."RTOS的可移植性是非常重要的",那是卖RTOS考虑的.本人做产品是时不会考虑我的产品便于在不同架构/系列上移植,只考虑选择一款最合适MCU,用好它.使用任何芯片,很少用它自带的功能库.使用STM32Fxxxx,也不会用照搬他启动代码,函数库等,只会参考他.所谓RTOS的信号量,用他的思想方法.你愿意照搬,是你的喜好,请不要以自己喜好否定别人.

使用特权

评论回复
18
ShakaLeo| | 2010-5-20 16:01 | 只看该作者
不是以自己的喜好否定你,我在13楼只是说说你这种做法的缺陷。
还有,你按你的“喜好”改出来的东西优势在哪?希望能见识一下。

使用特权

评论回复
19
ShakaLeo| | 2010-5-20 16:10 | 只看该作者
“本人做产品是时不会考虑我的产品便于在不同架构/系列上移植”,这本身就不是什么好习惯。
如果你选的这种MCU因为某种原因停产了呢? 假如功能要升级需要换更高级的MCU怎么办?

使用特权

评论回复
20
HSunrays|  楼主 | 2010-5-20 17:24 | 只看该作者
流于表面的东西不值得浪费精力争论!
请问香主,关于存储器互斥访问在STM32F1xx的实现方法有没有答复?
另,香版主,本人一点建议,既然身为ST MCU的FAE(猜测的,见谅!),而现在z主推ARM CM3架构的,我觉得版主应较深入的了解些ARM CM3.这应该对大家更快更好使用STM32序列的MCU有益处已经在很多帖中见香版主说没有研究过ARM CM3本身了.

使用特权

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

本版积分规则

0

主题

44

帖子

1

粉丝