转载: http://infocenter./help/index.jsp?topic=/com.arm.doc.dui0204hc/CIHJFGFE.html http://www./h/Cortex_M3_DefinGuide/29.php
4.11.9. DBG、DMB、DSB 和 ISB调试指令、数据内存屏障指令、数据同步屏障指令和指令同步屏障指令。 DBG{ DMB{ DSB{ ISB{ 其中:
这些是提示指令。 是否实现这些指令是可选的。 只要其中任何一个指令未实现,则与 数据内存屏障可作为内存屏障使用。 它可确保会先检测到程序中位于
数据同步屏障是一种特殊类型的内存屏障。 只有当此指令执行完毕后,才会执行程序中位于此指令后的指令。 当满足以下条件时,此指令才会完成:
允许的值为:
指令同步屏障可刷新处理器中的管道,因此可确保在 此外,
访问存储器指令 编译器不能用C语言直接生成的主存储器指令是用于装载和存储的专用指令(LDREX和STREX)。这些指令常常专用于存储器的存取操作,例如在不同的线程之间提供人工干预操作。
屏蔽指令 Cortex-M3,这种内核支持许多屏蔽指令。在下一个指令或者事件开始执行以前,这些屏蔽指令常常用于确保必然事件执行完成。 在处理器内部,指令同步屏蔽(ISB)刷新流水线;以致于这个指令执行完以后,紧接着从缓存或者存储器取出指令表。这个表会改变这个系统,例如MPU立即生效。 数据同步屏蔽(DSB)指令作为一种特殊的存储器屏蔽指令。访问外部存储器操作完成之前,执行完成数据同步屏蔽指令(DSB)。执行数据同步屏蔽指令,在该指令没有完成以前不再执行任何指令——换句话说,执行完成所有的挂起操作。 数据存储屏蔽(DMB)指令作为一种存储器屏蔽指令。数据存储屏蔽(DMB)指令和数据同步屏蔽(DSB)指令有微小的差别。数据存储屏蔽(DMB)指令确保:数据同步屏蔽(DSB)指令执行完成之前,访问任意存储器;执行数据同步屏蔽(DSB)指令后,紧接着执行访问任意存储器操作。 如例8所示,典型MPU代码的一部分显示如何这些屏蔽指令。用嵌入汇编完成一个小的功能,每个功能都含有一条屏蔽指令。编译时链接器将连接这些功能。 例8用预处理指令使用屏蔽指令的范例 /*pseudo_intrinsics.c */ /*Small embedded assembly functions for barrier instructions*/ /*Link with armlink --inline ... */ __asmvoid __ISB(void) { ISB BXlr } __asmvoid __DSB(void) { DSB BXlr } /*scs.c - Initialize System Control Space registers */ voidSCS_init(void) { /*Code to configure the MPU regions inserted here … */ /*Enable the MPU */ SCS.MPU.Ctrl|= 1; /*Force Memory Writes before continuing */ __DSB(); /*Flush and refill pipline with updated permissions */ __ISB(); }
4.3.5 汇编语言:指令隔离(barrier)指令和存储器隔离指令 CM3 中的另一股新鲜空气是一系列的隔离指令(亦可以译成“屏障”、“路障”,可互换使用——译者 注)。它们在一些结构比较复杂的存储器系统中是需要的(典型地用于流水线和写缓冲——译者注)。在 这类系统中,如果没有必要的隔离,会导致系统发生紊乱危象(race condition),(相当于数电中的“竞争 与冒险”——译者注). 举例来说,如果可以在运行时更改存储器的映射关系或者内存保护区的设置,(通过写 MPU 的寄存 器),就必须在更改之后立即补上一条 DSB 指令(数据同步指令)。因为对 MPU 的写操作很可能会被放 到一个写缓冲中。写缓冲是为了提高存储器的总体访问效率而设的,但它也有副作用,其中之一,就是 会导致写内存的指令被延迟几个周期执行,因此对存储器的设置不能即刻生效,这会导致紧临着的下一 条指令仍然使用旧的存储器设置——但程序员的本意显然是使用新的存储器设置。这种紊乱危象是后患 无穷的,常会破坏未知地址的数据,有时也会产生非法地址访问 fault。紊乱危象还有其它的表现形式, 后续章节会一一介绍。CM3 提供隔离指令族,就是要消灭这些紊乱危象(在有些讲解计算机体系体系结 构的书中,这类紊乱危象也被称为“存储器相关”——译注)。 CM3 中共有3 条隔离指令,如表4.27 所列 表4.27 隔离指令
DMB 在双口 RAM 以及多核架构的操作中很有用。如果 RAM 的访问是带缓冲的,并且写完之后 马上读,就必须让它“喘口气”——用 DMB 指令来隔离,以保证缓冲中的数据已经落实到 RAM 中。 DSB 比 DMB 更保险(当然也是有执行代价的),它是宁可错杀也不漏网——清空了写缓冲,使得任 何它后面的指令,不管要不要使用先前的存储器访问结果,通通等待访问完成。大虾们可以在有绝 对信心时使用 DMB,新手还是使用 DSB 比较保险。 |
|
来自: BeautymengRoom > 《嵌入式系统》