STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(2):Cortex-M3处理器内存模型

这一部分描述了处理器内存图,内存访问的行为,位带特征。处理器有一个提供了高达4GB可寻找内存的固定内存图。

内存地图分裂内存图为区域。每一个区域定义了内存的类型,一些区域还有额外的内存属性。内存的类型和属性决定了这区域访问的行为。

       内存类型分为3类:

       普通       处理器可以为了效率、执行预测性的读进行重排序处理。

       设备       处理器保留相对于其它设备或前有序类型内存处理的处理顺序。

       强有序    处理器保留相对于其它处理的处理顺序。

       对于设备和强有序内存的不同顺序要求意味着内存系统可以缓冲一个对设备内存的写,但一定不会缓冲一个向强有序内存的写。

       额外的内存属性包括:

       从不执行(Execute Never XN) 意味着处理器阻止指令访问,任何尝试从XN区域获得一个指令导致内存管理错误异常。

       对于由明确内存访问指令引起的大多数内存访问,内存系统不能保证访问顺序完全匹配指令的编程顺序,倘若这不会影响指令顺序的行为。一般地,如果正确程序执行依赖两个内存存取完成以程序顺序,软件必须在内存访问指令之间插入内存屏障指令。

       然而,内存系统不保证一些访问设备和强有序内存的顺序。加入两个内存范围指令A1和A2在程序顺序上,实际内存访问顺序如下:

       访问在内存地图中每一区域的行为:


       代码区、SRAM、外部RAM区域可以存放代码。但是建议代码一直在代码区域。因为处理器有独立的总线可以使指令获取和数据访问同步进行。

       在代码流中的指令顺序不一定保证相应的内存处理顺序。因为:处理器可能重新排序一些内存范围改善效率,倘若这不影响指令顺序的行为;处理器有多个总线接口;内存和设备在内存地图中有不同的等待状态;一些内存访问被缓冲或预测访问。

       如果内存访问顺序是严格的,软件必须包括内存屏障指令强制顺序。处理器提供以下内存屏障指令:

       DMB     数据内存屏障指令,保证未解决的内存处理完成在后序的内存处理之前。

       DSB        数据同步屏障指令,保证未解决的内存处理完成在后续的指令执行之前,清空写缓冲。

       ISB          指令同步屏障,保证所有完成的内存处理的效果被随后的指令认知。清洗流水线。

       应用内存屏障指令在,例如:

       向量表。如果程序改变了向量表中的一个入口,然后使能相应的异常。使用DMB指令在两个操作之间。确保异常被迅速采用使能在处理器使用新异常向量之后。

       自修改代码。如果一个程序包含自修改代码,在程序中代码更新之后迅速使用一个ISB指令。确保随后的指令使用更新的代码执行。

       内存地图切换。如果系统包含内存地图切换机制,在程序中切换内存地图后使用DSB指令,确保随后的指令执行使用更新的内存地图执行。

       动态异常优先级变化。当异常停止或活跃时,一个异常的优先级不得不变化,在改变后使用DSB指令。确保在DSB指令完成后变化产生影响。

       使用信号量在多控制系统。如果系统包含多于一个的总线控制,例如,如果另一个处理器出现在系统中,每一个处理器必须在信号量指令后使用DMB指令,确保其它总线控制器看到在他们执行顺序上的内存处理。

       一个位带区域映射在位带别名区域的一个字到在位带区域的一个位。位带区域占据SRAM和外设内存区域最低的1MB。内存地图有两个32MB的别名区域分别映射到两个1MB位带区域。


一个字访问在SRAM或外设位带别名区域映射到在SRAM和外设位带区域的单独位。

映射关系:


直接访问一个别名区域,在别名区域写一个字更新位带区域中的一个单独位。写在别名区域一个字中Bit[0]的值决定写进位带区域目标位的值。在bit[0]写1将会在位带位写1,在bit[0]写0将会在位带位写0。位带别名区域字中Bit[31:1]无效果。写0x01与写0xFF有同样的效果。写0x00与写0x0E有同样的效果。读位带别名区域类似,0x00000000表明在位带区域目标位为0,0x00000001表明在位带区域目标位为1。

内存字节序,处理器查看内存作为编码从0升序的字节线性集合。例如,字节0-3保存第一个存储的字,字节4-7保存第二个存储的字。

小端格式,处理器存储一个字的最低有效字节在编码最小的字节,最高有效字节在编码最大的字节。


同步原语,Cortex-M3指令集包含数对同步原语。它们提供非阻塞机制,一个线程或进程可以使用去获得对一个内存的互斥访问。软件可以用它们完成有保证的读-修改-写内存更新顺序,或者一个信号量机制。

       一对信号量原语包含:

              加载互斥指令,用于读取内存的值,需要互斥访问盖内存位置。

              存储互斥指令,用于尝试写在内存位置。返回一个寄存器状态位。如果状态位为0,表明线程或进程获得内存的互斥访问,并且写成功;如果状态位为1,表明线程或进程没有获得内存的互斥访问,而且没有执行写。

       成对的载入互斥和存储互斥指令有:字指令LDREX和STREX; 半字指令LDREXH和STREXH; 字节指令LDREXB和STREXB。

       软件必须使用载入互斥指令和相应的存储互斥指令。

       为了保证一个内存位置的读-修改-写,软件必须:使用载入互斥指令读取该位置的值;根据需要,更新这个值;使用存储互斥指令尝试写入新值到内存位置,测试返回状态位,如果是0,这读-修改-写成功完成,如果是1,写没有执行,这表明第一步返回的值可能已经过时,软件需要重新尝试读-修改-写顺序。

       软件可以使用同步原语实现信号量:用载入互斥指令读取信号量地址检查信号量是否被释放;如果信号量被释放,使用存储互斥指令写要求的值到信号量地址;如果从第二步返回的状态标志位表明存储互斥指令成功,软件声称了信号量,然而,如果存储互斥指令失败,另一个进程可能已经声称了信号量在软件执行了读之后。

       Cortex-M3包含一个互斥访问监视器,它标记处理器已经执行了载入互斥指令。处理器移除它的互斥访问标记如果:它执行了一个CLREX执行;它执行了一个存储互斥指令,不管是否写成功;一个异常出现,这意味着处理器可以解决在不同线程中的信号量冲突。

       ANSIC不能直接生成互斥访问指令。一些C编译器提供了内部函数以声称这些指令。


实际的互斥访问指令声称依赖于指针数据类型传到内部函数。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值