Ascii2D,MDK-ARM

cortex-m3位绑定1 .概述CM3中的内存系统支持所谓的“位带”操作。

由此,实现了对单一bit的原子操作。 位带操作仅适用于某些特殊的内存区域。

从组件的角度来看:

与传统方法相比:

在位域中,各位映射到别名地址区域的1字——这是只有LSB有效的字。

支持位带操作的两个内存区域的范围如下:

*0x2000_0000-0x200f_ffff(SRAM区域最低1MB ) ) ) ) ) ) ) )。

0x4000_0000-0x400F_FFFF (片外设施区中最低1MB ) *

2 .优势位操作对硬件I/O密集型基础程序最有用; 位操作也可以用于简单的跳跃判断。

对于有跳跃根据的比特,以前必须这样做。

读取整个寄存器

屏蔽不需要的位

比较跳跃

现在只有:

从位带别名区域读取状态位

另外,比较跳位操作重要优点是,在多任务中,在任务间实现共享资源的”联动”访问;

多任务共享资源必须满足所谓的“原子操作”,即一次只有一个任务访问——。

以前的读取-修改-写入需要三个命令,其间有两个可中断的空闲空间。

于是,有可能出现下图所示的混乱的危象。

类似的故障危象可以出现在多任务执行环境中。 其实,上图所示的情况可以视为多任务处理

业务的一个特例:主程序是一个任务,ISR是另一个任务,这两个任务同时执行。

通过CM3的皮带操作,可以消灭上例中的障碍危象。 CM3将这个“读-改-写”合二为一

硬件级支持的原子操作不能中断,如下图所示。

3 .对其他数据长度的位带操作位带操作不限于以字为单位的传输。 也可以半字和字节为单位进行传输。 例如,可以使用LDRB/STRB以字节为单位访问位带别名区域。 可以与LDRH/STRH一样使用。 但是不管用哪个都是正确的

子,都要保证目标地址与字的边界对齐。

4 .在c语言中,将位带操作//“位带地址位号”转换为别名地址的宏#definebitband(addr, bitnum ) )0xf0000000 )0x2000000 ) ) )的//将此地址指向#definemem_addr(addr ) ) )

mem_addr(devicereg0)=0xAB; //使用普通地址访问寄存器,即,将0xAB设置为设备reg 0地址上的值=mem_addr (设备reg0)=mem_addr (设备reg0)|0x2; //传统做法mem _ addr (bit band (设备_ reg 0,1 ) )=0x1; 如果使用//位别名地址,或者使用位带功能,则必须在volatile中定义要访问的变量。 因为c编译器不知道同一位有两个地址。 因此,volatile可确保编译器每次都将新值忠实地写入内存。 不再为了优化而中途使用寄存器操作数据的复制,如果将副本写回到——直到最后,以不同的方式访问同一位将产生不一致的结果。 (中间结果——可能已针对不同的寄存器进行了优化,以保存注释。 )

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注