|
轉(zhuǎn)載: 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調(diào)試指令、數(shù)據(jù)內(nèi)存屏障指令、數(shù)據(jù)同步屏障指令和指令同步屏障指令。 DBG{
DMB{
DSB{
ISB{
其中:
這些是提示指令。 是否實(shí)現(xiàn)這些指令是可選的。 只要其中任何一個(gè)指令未實(shí)現(xiàn),則與 調(diào)試提示可向調(diào)試系統(tǒng)及其相關(guān)系統(tǒng)發(fā)送提示。 有關(guān)這些系統(tǒng)如何使用此指令的信息,請(qǐng)參這些系統(tǒng)的文檔。 數(shù)據(jù)內(nèi)存屏障可作為內(nèi)存屏障使用。 它可確保會(huì)先檢測(cè)到程序中位于
數(shù)據(jù)同步屏障是一種特殊類型的內(nèi)存屏障。 只有當(dāng)此指令執(zhí)行完畢后,才會(huì)執(zhí)行程序中位于此指令后的指令。 當(dāng)滿足以下條件時(shí),此指令才會(huì)完成:
允許的值為:
指令同步屏障可刷新處理器中的管道,因此可確保在 此外,
訪問(wèn)存儲(chǔ)器指令 編譯器不能用C語(yǔ)言直接生成的主存儲(chǔ)器指令是用于裝載和存儲(chǔ)的專用指令(LDREX和STREX)。這些指令常常專用于存儲(chǔ)器的存取操作,例如在不同的線程之間提供人工干預(yù)操作。
屏蔽指令 Cortex-M3,這種內(nèi)核支持許多屏蔽指令。在下一個(gè)指令或者事件開(kāi)始執(zhí)行以前,這些屏蔽指令常常用于確保必然事件執(zhí)行完成。 在處理器內(nèi)部,指令同步屏蔽(ISB)刷新流水線;以致于這個(gè)指令執(zhí)行完以后,緊接著從緩存或者存儲(chǔ)器取出指令表。這個(gè)表會(huì)改變這個(gè)系統(tǒng),例如MPU立即生效。 數(shù)據(jù)同步屏蔽(DSB)指令作為一種特殊的存儲(chǔ)器屏蔽指令。訪問(wèn)外部存儲(chǔ)器操作完成之前,執(zhí)行完成數(shù)據(jù)同步屏蔽指令(DSB)。執(zhí)行數(shù)據(jù)同步屏蔽指令,在該指令沒(méi)有完成以前不再執(zhí)行任何指令——換句話說(shuō),執(zhí)行完成所有的掛起操作。 數(shù)據(jù)存儲(chǔ)屏蔽(DMB)指令作為一種存儲(chǔ)器屏蔽指令。數(shù)據(jù)存儲(chǔ)屏蔽(DMB)指令和數(shù)據(jù)同步屏蔽(DSB)指令有微小的差別。數(shù)據(jù)存儲(chǔ)屏蔽(DMB)指令確保:數(shù)據(jù)同步屏蔽(DSB)指令執(zhí)行完成之前,訪問(wèn)任意存儲(chǔ)器;執(zhí)行數(shù)據(jù)同步屏蔽(DSB)指令后,緊接著執(zhí)行訪問(wèn)任意存儲(chǔ)器操作。 如例8所示,典型MPU代碼的一部分顯示如何這些屏蔽指令。用嵌入?yún)R編完成一個(gè)小的功能,每個(gè)功能都含有一條屏蔽指令。編譯時(shí)鏈接器將連接這些功能。 例8用預(yù)處理指令使用屏蔽指令的范例 /*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 匯編語(yǔ)言:指令隔離(barrier)指令和存儲(chǔ)器隔離指令 CM3 中的另一股新鮮空氣是一系列的隔離指令(亦可以譯成“屏障”、“路障”,可互換使用——譯者 注)。它們?cè)谝恍┙Y(jié)構(gòu)比較復(fù)雜的存儲(chǔ)器系統(tǒng)中是需要的(典型地用于流水線和寫(xiě)緩沖——譯者注)。在 這類系統(tǒng)中,如果沒(méi)有必要的隔離,會(huì)導(dǎo)致系統(tǒng)發(fā)生紊亂危象(race condition),(相當(dāng)于數(shù)電中的“競(jìng)爭(zhēng) 與冒險(xiǎn)”——譯者注). 舉例來(lái)說(shuō),如果可以在運(yùn)行時(shí)更改存儲(chǔ)器的映射關(guān)系或者內(nèi)存保護(hù)區(qū)的設(shè)置,(通過(guò)寫(xiě) MPU 的寄存 器),就必須在更改之后立即補(bǔ)上一條 DSB 指令(數(shù)據(jù)同步指令)。因?yàn)閷?duì) MPU 的寫(xiě)操作很可能會(huì)被放 到一個(gè)寫(xiě)緩沖中。寫(xiě)緩沖是為了提高存儲(chǔ)器的總體訪問(wèn)效率而設(shè)的,但它也有副作用,其中之一,就是 會(huì)導(dǎo)致寫(xiě)內(nèi)存的指令被延遲幾個(gè)周期執(zhí)行,因此對(duì)存儲(chǔ)器的設(shè)置不能即刻生效,這會(huì)導(dǎo)致緊臨著的下一 條指令仍然使用舊的存儲(chǔ)器設(shè)置——但程序員的本意顯然是使用新的存儲(chǔ)器設(shè)置。這種紊亂危象是后患 無(wú)窮的,常會(huì)破壞未知地址的數(shù)據(jù),有時(shí)也會(huì)產(chǎn)生非法地址訪問(wèn) fault。紊亂危象還有其它的表現(xiàn)形式, 后續(xù)章節(jié)會(huì)一一介紹。CM3 提供隔離指令族,就是要消滅這些紊亂危象(在有些講解計(jì)算機(jī)體系體系結(jié) 構(gòu)的書(shū)中,這類紊亂危象也被稱為“存儲(chǔ)器相關(guān)”——譯注)。 CM3 中共有3 條隔離指令,如表4.27 所列 表4.27 隔離指令
DMB 在雙口 RAM 以及多核架構(gòu)的操作中很有用。如果 RAM 的訪問(wèn)是帶緩沖的,并且寫(xiě)完之后 馬上讀,就必須讓它“喘口氣”——用 DMB 指令來(lái)隔離,以保證緩沖中的數(shù)據(jù)已經(jīng)落實(shí)到 RAM 中。 DSB 比 DMB 更保險(xiǎn)(當(dāng)然也是有執(zhí)行代價(jià)的),它是寧可錯(cuò)殺也不漏網(wǎng)——清空了寫(xiě)緩沖,使得任 何它后面的指令,不管要不要使用先前的存儲(chǔ)器訪問(wèn)結(jié)果,通通等待訪問(wèn)完成。大蝦們可以在有絕 對(duì)信心時(shí)使用 DMB,新手還是使用 DSB 比較保險(xiǎn)。 |
|
|
來(lái)自: BeautymengRoom > 《嵌入式系統(tǒng)》