creep 发表于 2015-6-25 22:21:36

【STM32F303开发】+使用SRAM的BitBand进行原子操作

本帖最后由 creep 于 2015-6-25 22:27 编辑

在M3&M4内核中有2块区域可进行BitBand,这2个区域分别位于最低1M的SRAM和最低1M的外设寄存器区域,估计大家都知道了F303的GPIO寄存器区域并没有在位带区域,所以我们也就没法像操作其他的系列那样直接用位带操作去操作IO口的某个pin了。SRAM和peripheral的有效范围

F303的GPIO寄存器位置并没有位于可操作的bitband范围:

对比F429的区域GPIO寄存器位于bitband区域:


从上面的对比来看,F303的SRAM还是可以使用bitband的。使用SRAM的bitband可以实现变量的原子操作(atomic read-modify-write and read)。
如果在程序有多处的地方对同一个变量进行读写操作,那么使用原子操作的好处是对某个变量进行读写时不会被中断或者其他的任务打断进而影响到该变量的值发生不可估计的操作,这在我们实际使用中很有用。比如我们经常在中断中对某个变量进行置1或者清零0然后再在其他的地方根据这个变量进行某些操作,如果我们对这个变量读取时正好发生了中断,那么中断中很有可能对这个变量进行修改,这样的话当退出中断,我们再次读取的这个值就是错的了,所以在ucos2中的对于一些全局变量操作时都是先关掉中断然后在操作最后打开中断,这样才能避免我们刚才说的那个问题。


使用原子操作的方法比较简单。我们把SRAM bitband region区域和SRAM bit-band alias区域进行某种映射,这样在操作SRAM bit-band alias时就对应的操作了SRAM的对应的bit了,对应的换算方法如下:根据这个关系可在程序中进行计算位置。

在操作SRAM bit-band alias时是按照word进行操作的,对应的位置是SRAM bitband region中的一个bit,其中只有SRAM bit-band alias的bit才能影响到SRAM bitband region中的一个bit的值,也就是说SRAM bit-band alias的bit在实际操作中不起作用,详细的转换关系如下

将上面的对应关系转为代码如下,使用几个宏定义来操作SRAM的某个变量的某个bit,值得注意的是宏Var_GetBit_BB(VarAddr, BitNumber)是个可修改的左值(lvalue)宏,我们可以对其直接赋值来修改某个变量的值,这个就能简单的实现原子操作的置1和清0,这也是推荐的使用方法。

测试代码简单的对sram中的变量的某个bit进行修改,运行结果可通过串口输出如下,可以看到变量的VarAddr的bit0可以通过上面的宏进行修改读取。

原子操作在其他处理器中也比较常见,具体ARM内核是如果通过对bitband的来实现原子操作的我也没有找到详细的说明文档。
测试代码:

官方文档:bitband使用说明

M4内核编程手册,这个包含了很多RM手册上没有的内核的寄存器说明。










Paderboy 发表于 2015-6-25 23:11:04

多谢分享,又学习了。。。

mark0668 发表于 2015-6-25 23:48:09

多谢分享

ROCK0525 发表于 2015-6-26 08:18:55

学习了,多谢分享

jiaswang 发表于 2015-6-26 08:40:26

多谢分享!

stary666 发表于 2015-6-26 09:42:59

学习,,,,,,,

creep 发表于 2015-6-26 10:26:15

Paderboy 发表于 2015-6-25 23:11
多谢分享,又学习了。。。

共同学习~~~~

博根 发表于 2015-6-26 10:29:23

学习了,多谢分享

wyxy163@126.com 发表于 2015-10-13 19:47:28

STM1024 发表于 2018-6-8 15:42:21

good,翻出来让更多人看到

alexmahonelau 发表于 2019-1-10 09:31:38

学习了。。。:call:

GeorgePCB 发表于 2019-5-27 19:27:28

多谢分享,马上试用下

cliff-336641 发表于 2019-6-6 15:58:58

多谢楼主无私分享。

唐英tcy 发表于 2019-6-10 08:45:34

多谢分享

_007 发表于 2019-12-6 10:31:02

多谢分享,学习了,楼主好人
页: [1]
查看完整版本: 【STM32F303开发】+使用SRAM的BitBand进行原子操作