本帖最后由 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[0]才能影响到SRAM bitband region中的一个bit的值,也就是说SRAM bit-band alias的bit[31-1]在实际操作中不起作用,详细的转换关系如下 将上面的对应关系转为代码如下,使用几个宏定义来操作SRAM的某个变量的某个bit,值得注意的是宏Var_GetBit_BB(VarAddr, BitNumber) 是个可修改的左值(lvalue)宏,我们可以对其直接赋值来修改某个变量的值,这个就能简单的实现原子操作的置1和清0,这也是推荐的使用方法。 测试代码简单的对sram中的变量的某个bit进行修改,运行结果可通过串口输出如下,可以看到变量的VarAddr的bit0可以通过上面的宏进行修改读取。 原子操作在其他处理器中也比较常见,具体ARM内核是如果通过对bitband的来实现原子操作的我也没有找到详细的说明文档。 测试代码: |
【STM32F303开发】开发学习笔记、教程集合贴
【合集】STM32F303开发教程
【STM32F303开发】+ 使用片内的CCMRAM缩短代码执行时间
【STM32F303开发】(五)TIM定时器PWM的输出与捕获
【STM32F303开发】+ 内部Flash模拟EEPROM
【STM32F303开发】+如何解析GPS数据
【STM32F303开发】+使用fromelf反汇编keil生成的AXF文件
使用STM32F303VBT6的SPI驱动TM1629A
【STM32F303开发】+ 使用SWO输出调试信息到Debug Viewer窗口
【STM32F303开发】基础:工程模板+LED+USART+常用文档+按键中断
共同学习~~~~