ARM64中的內(nèi)存屏障指令(DMB,DSB,ISB) - 知乎首發(fā)于STM32-筆記切換模式寫文章登錄/注冊ARM64中的內(nèi)存屏障指令(DMB,DSB,ISB)隨風(fēng)新時(shí)代農(nóng)民工!內(nèi)存屏障指令是系統(tǒng)編程中很重要的一部分,特別是在多核并行編程中。本章重點(diǎn)介紹內(nèi)存屏障指令產(chǎn)生的原因、ARM64處理器內(nèi)存屏障指令以及內(nèi)存屏障的案例分析等內(nèi)容。18.2.1 使用內(nèi)存屏障的場景在大部分場景下,我們不用特意關(guān)注內(nèi)存屏障的,特別是在單處理器系統(tǒng)里,雖然CPU內(nèi)部支持亂序執(zhí)行以及預(yù)測式的執(zhí)行,但是總體來說,CPU會(huì)保證最終執(zhí)行結(jié)果符合程序員的要求。在多核并發(fā)編程的場景下,程序員需要考慮是不是應(yīng)該用內(nèi)存屏障指令。下面是一些需要考慮使用內(nèi)存屏障指令的典型場景。在多個(gè)不同CPU內(nèi)核之間共享數(shù)據(jù)。在弱一致性內(nèi)存模型下,某個(gè)CPU亂的內(nèi)存訪問次序可能會(huì)產(chǎn)生競爭訪問。執(zhí)行和外設(shè)相關(guān)的操作,例如DMA操作。啟動(dòng)DMA操作的流程通常是這樣的:第一步,把數(shù)據(jù)寫入DMA緩沖區(qū)里;第二步,設(shè)置DMA相關(guān)寄存器來啟動(dòng)DMA。如果這中間沒有內(nèi)存屏障指令,第二步的相關(guān)操作有可能在第一步前面執(zhí)行,這樣DMA就傳輸了錯(cuò)誤的數(shù)據(jù)。修改內(nèi)存管理的策略,例如上下文切換、請求缺頁以及修改頁表等。修改存儲(chǔ)指令的內(nèi)存區(qū)域,例如自修改代碼的場景。總之,我們使用內(nèi)存屏障指令的目的是想讓CPU按照程序代碼邏輯來執(zhí)行,而不是被CPU亂序執(zhí)行和預(yù)測執(zhí)行打亂了代碼的執(zhí)行次序。18.2.2 ARM64里的內(nèi)存屏障指令A(yù)RMv8指令集提供了3條內(nèi)存屏障指令。數(shù)據(jù)存儲(chǔ)屏障(Data Memory Barrier,DMB)指令:僅當(dāng)所有在它前面的存儲(chǔ)器訪問操作都執(zhí)行完畢后,才提交(commit)在它后面的訪問指令。DMB指令保證的是DMB指令之前的所有內(nèi)存訪問指令和DMB指令之后的所有內(nèi)存訪問指令的執(zhí)行順序。也就是說,DMB指令之后的內(nèi)存訪問指令不會(huì)被處理器重排到DMB指令的前面。DMB指令不會(huì)保證內(nèi)存訪問指令在內(nèi)存屏障指令之前完成,它僅僅保證內(nèi)存屏障指令前后的內(nèi)存訪問的執(zhí)行順序。DMB指令僅僅影響內(nèi)存訪問指令、數(shù)據(jù)高速緩存指令以及高速緩存管理指令等,并不會(huì)影響其他指令(例如算術(shù)運(yùn)算指令等)的順序。數(shù)據(jù)同步屏障(Data Synchronization Barrier,DSB)指令:比DMB指令要嚴(yán)格一些,僅當(dāng)所有在它前面的內(nèi)存訪問指令都執(zhí)行完畢后,才會(huì)執(zhí)行在它后面的指令,即任何指令都要等待DSB指令前面的內(nèi)存訪問指令完成。位于此指令前的所有緩存(如分支預(yù)測和TLB維護(hù))操作需要全部完成。指令同步屏障(Instruction Synchronization Barrier,ISB)指令:確保所有在ISB指令之后的指令都從指令高速緩存或內(nèi)存中重新預(yù)取。它刷新流水線(flush pipeline)和預(yù)取緩沖區(qū)后才會(huì)從指令高速緩存或者內(nèi)存中預(yù)取ISB指令之后的指令。ISB指令通常用來保證上下文切換(如ASID更改、TLB維護(hù)操作等)的效果。18.2.3 DMB指令DMB指令僅僅影響數(shù)據(jù)訪問的序列。注意,DMB指令不能保證任何指令必須在某個(gè)時(shí)刻一定執(zhí)行完,它僅僅保證的是DMB指令前后的內(nèi)存訪問指令的執(zhí)行次序。數(shù)據(jù)訪問包括普通的加載操作(load)和存儲(chǔ)操作(store),也包括數(shù)據(jù)高速緩存(data cache)維護(hù)指令(因?yàn)樗菜銛?shù)據(jù)訪問指令)。DMB指令通常用來保證DMB指令之前的數(shù)據(jù)訪問可以被DMB后面的數(shù)據(jù)訪問指令觀察到。所謂的觀察到指的是先執(zhí)行完A指令,然后執(zhí)行B指令,于是B指令可以觀察到A指令的執(zhí)行結(jié)果。如果B指令先于A指令執(zhí)行,那么B指令沒有辦法觀察到A指令的執(zhí)行結(jié)果??傊珼MB指令強(qiáng)調(diào)的是內(nèi)存屏障前后數(shù)據(jù)訪問指令的訪問次序。這里有兩個(gè)要點(diǎn):一個(gè)是數(shù)據(jù)訪問指令,另一個(gè)是保證訪問的次序。DMB指令后面必須帶參數(shù),用來指定共享屬性域(share ability domain)以及指定具體的訪問順序(before-after)?!纠?8-1】CPU執(zhí)行下面兩條指令。ldr x0,[x1]
str x2,[x3]LDR指令讀取X1地址的值,STR指令把X2的值寫入X3地址。如果這兩條指令沒有數(shù)據(jù)依賴(data dependency)或者地址依賴(address dependency),那么CPU可以先執(zhí)行STR指令或者先執(zhí)行LDR指令,從最終結(jié)果來看沒有區(qū)別。數(shù)據(jù)依賴指的是相鄰的讀寫操作是否存在數(shù)據(jù)依賴,例如,從Xn地址讀取內(nèi)容到Xm地址中,然后把Xm地址中的值寫入Xy地址中,那么Xm為這兩條指令的數(shù)據(jù)依賴,下面是偽代碼。ldr xm,[xn]
str xm,[xy]地址依賴指的相鄰的讀寫操作是否存在地址依賴,例如,從Xn地址讀取內(nèi)容到Xm地址中,然后把另外的一個(gè)值Xy寫入Xm地址中,那么Xm為這兩條指令的地址依賴,下面是偽代碼。ldr xm,[xn]
str xy,[xm]在例18-1中,如果想要確保CPU一定按照寫的序列來執(zhí)行代碼,那么就需要加入一條DMB指令,這樣就可以保證CPU一定先執(zhí)行LDR指令,后執(zhí)行STR指令,例如下面的代碼片段。ldr x0,[x1]
dmb ish
str x2,[x3]【例18-2】CPU執(zhí)行下面兩條指令。ldr x0,[x1]
str x0,[x3]LDR指令讀取X1地址的值到X0寄存器,然后把X0寄存器的值寫入X3地址。這兩條指令存在數(shù)據(jù)依賴,不使用內(nèi)存屏障指令也能保證上述兩條指令的執(zhí)行次序。【例18-3】CPU執(zhí)行如下3條指令。ldr x0,[x1]
dmb ish
add x2,x3,x4第一條指令是加載指令,第二條指令是DMB內(nèi)存屏障指令,第三條指令是算術(shù)運(yùn)算(ADD)指令。盡管加載和算術(shù)運(yùn)算指令之間有一條DMB內(nèi)存屏障指令,但是第三條指令是有可能在加載指令前面執(zhí)行的。DMB內(nèi)存屏障指令只能保證數(shù)據(jù)訪問指令的執(zhí)行次序,但是ADD指令不是數(shù)據(jù)訪問指令,因此無法阻止ADD指令被重排到第一條指令前面。解決辦法是把DMB指令換成DSB指令?!纠?8-4】CPU執(zhí)行如下4條指令。ldr x0, [x2]
dmb ish
add x3, x3, #1
str x4, [x5]第一條指令是LDR指令,把X2地址的內(nèi)容加載到X0寄存器。第二條指令是DMB指令,第三條指令是ADD運(yùn)算指令,它不屬于數(shù)據(jù)訪問指令。第四條指令是STR指令,把X4寄存器的值存到X5地址處。這里的數(shù)據(jù)訪問指令只有第一條和第四條,因此LDR指令的執(zhí)行結(jié)果必須要被DMB后面的STR指令觀察到,即LDR指令要先于STR指令執(zhí)行。此外,由于這里的ADD指令不是數(shù)據(jù)訪問指令,因此它可以被亂序重排到LDR指令前面?!纠?8-5】CPU執(zhí)行如下4條指令。dc cvac,x6
ldr x1, [x2]
dmb ish
ldr x3, [x7]第一條指令是數(shù)據(jù)高速緩存維護(hù)指令,它用于清理X6對應(yīng)地址的數(shù)據(jù)高速緩存。第二條指令是LDR指令,第三條指令是DMB指令,第四條指令也是LDR指令。前面兩條指令之間沒有DMB指令,而且都是數(shù)據(jù)訪問指令,因此從執(zhí)行順序角度來觀察,LDR指令可以亂序重排到DC指令前面。第四條指令能觀察到DC指令執(zhí)行完成,或者說第四條指令不能在DMB指令前面執(zhí)行。數(shù)據(jù)高速緩存和統(tǒng)一高速緩存(unified cache)相關(guān)的維護(hù)指令其實(shí)也算數(shù)據(jù)訪問指令,所以,在DMB指令前面的數(shù)據(jù)高速緩存維護(hù)指令必須在DMB指令后面的內(nèi)存訪問指令之前執(zhí)行完。通過上述幾個(gè)例子的分析可知,DMB指令關(guān)注的是內(nèi)存訪問的序列,不需要關(guān)心內(nèi)存訪問指令什么時(shí)候執(zhí)行完。DMB前面的數(shù)據(jù)訪問指令必須被DMB后面的數(shù)據(jù)訪問指令觀察到。18.2.4 DSB指令DSB指令要比DMB指令嚴(yán)格得多。DSB后面的任何指令必須滿足下面兩個(gè)條件才能開始執(zhí)行。DSB指令前面的所有數(shù)據(jù)訪問指令(內(nèi)存訪問指令)必須執(zhí)行完。DSB指令前面的高速緩存、分支預(yù)測、TLB等維護(hù)指令也必須執(zhí)行完。這兩個(gè)條件滿足之后才能執(zhí)行DSB指令后面的指令。注意,DSB指令后面的指令指的是任意指令。與DMB指令相比,DSB指令規(guī)定了DSB指令在什么條件下才能執(zhí)行,而DMB指令僅僅約束屏障前后的數(shù)據(jù)訪問指令的執(zhí)行次序?!纠?8-6】CPU執(zhí)行如下3條指令。ldr x0,[x1]
dsb ish
add x2,x3,x4ADD指令必須要等待DSB指令執(zhí)行完才能開始執(zhí)行,它不能重排到LDR指令前面。如果把DSB指令換成DMB指令,那么ADD指令可以重排到LDR指令前面。【例18-7】CPU執(zhí)行如下4條指令。dc civa x5
str x1, [x2]
dsb ish
add x3,x3,#1第一條指令是DC指令,它清空虛擬地址(X5寄存器)對應(yīng)的數(shù)據(jù)高速緩存并使其失效。第二條指令把X1寄存器的值存儲(chǔ)到X2地址處。第三條指令是DSB指令。第四條指令是ADD指令,讓X3寄存器的值加1。DC指令和STR指令必須在DSB指令之前執(zhí)行完。ADD指令必須等到DSB指令執(zhí)行完才能開始執(zhí)行。盡管ADD指令不是數(shù)據(jù)訪問指令,但是它也必須等到DSB指令執(zhí)行完才能開始執(zhí)行。在一個(gè)多核系統(tǒng)里,高速緩存和TLB維護(hù)指令會(huì)廣播到其他CPU內(nèi)核,執(zhí)行本地相關(guān)的維護(hù)操作。DSB指令等待這些廣播并收到其他CPU內(nèi)核發(fā)送的應(yīng)答信號才算執(zhí)行完。所以,當(dāng)DSB指令執(zhí)行完時(shí),其他CPU內(nèi)核已經(jīng)看到第一條DC指令執(zhí)行完。18.2.5 DMB和DSB指令的參數(shù)DMB和DSB指令后面可以帶參數(shù),用于指定共享屬性域以及具體的訪問順序。共享屬性域是內(nèi)存屏障指令的作用域。ARMv8體系結(jié)構(gòu)里定義了4種域。全系統(tǒng)共享(full system sharable)域,指的是全系統(tǒng)的范圍。外部共享(outer sharable)域。內(nèi)部共享(inner sharable)域。不指定共享(non-sharable)域。除指定范圍之外,我們還可以進(jìn)一步細(xì)化內(nèi)存屏障指令的訪問方向,例如,細(xì)分為讀內(nèi)存屏障、寫內(nèi)存屏障以及讀寫內(nèi)存屏障。第一種是讀內(nèi)存屏障(Load-Load/Store)指令,在參數(shù)里的后綴為LD。在內(nèi)存屏障指令之前的所有加載指令必須完成,但是不需要保證存儲(chǔ)指令執(zhí)行完。在內(nèi)存屏障指令后面的加載和存儲(chǔ)指令必須等到內(nèi)存屏障指令執(zhí)行完。第二種是寫內(nèi)存屏障(Store-Store)指令,在參數(shù)里的后綴為ST。寫內(nèi)存屏障指令僅僅影響存儲(chǔ)操作,對加載操作則沒有約束。第三種為讀寫內(nèi)存屏障指令。在內(nèi)存屏障指令之前的所有讀寫指令必須在內(nèi)存屏障指令之前執(zhí)行完。第一種和第二種指令相當(dāng)于把功能弱化成單一功能的內(nèi)存屏障指令,而第三種指令就是全功能的內(nèi)存屏障指令。內(nèi)存屏障指令的參數(shù)如表18.1所示。表18.1 內(nèi)存屏障指令的參數(shù)18.2.6 單方向內(nèi)存屏障原語ARMv8指令集還支持隱含內(nèi)存屏障原語的加載和存儲(chǔ)指令,這些內(nèi)存屏障原語影響了加載和存儲(chǔ)指令的執(zhí)行順序,它們對執(zhí)行順序的影響是單方向的。獲取(acquire)屏障原語:該屏障原語之后的讀寫操作不能重排到該屏障原語前面,通常該屏障原語和加載指令結(jié)合。釋放(release)屏障原語:該屏障原語之前的讀寫操作不能重排到該屏障原語后面,通常該屏障原語和存儲(chǔ)指令結(jié)合。加載-獲?。╨oad-acquire)屏障原語:含有獲取屏障原語的讀操作,相當(dāng)于單方向向后的屏障指令。所有加載-獲取內(nèi)存屏障指令后面的內(nèi)存訪問指令只能在加載-獲取內(nèi)存屏障指令執(zhí)行后才能開始執(zhí)行,并且被其他CPU觀察到。如圖18.1所示,讀指令1和寫指令1可以向前(如圖18.1中指令執(zhí)行的方向)越過該屏障指令,但是讀指令2和寫指令2不能向后(如圖18.1中指令執(zhí)行的方向)越過該屏障指令?!鴪D18.1 加載-獲取屏障原語存儲(chǔ)-釋放(store-release)屏障原語:含有釋放屏障原語的寫操作,相當(dāng)于單方向向前的屏障指令。只有所有存儲(chǔ)-釋放屏障原語之前的指令完成了,才能執(zhí)行存儲(chǔ)-釋放屏障原語之后的指令,這樣其他CPU可以觀察到存儲(chǔ)-釋放屏障原語之前的指令已經(jīng)執(zhí)行完。讀指令2和寫指令2可以向后(如圖18.2中指令執(zhí)行的方向)越過存儲(chǔ)-釋放屏障指令,但是讀指令1和寫指令1不能向前(如圖18.2中指令執(zhí)行的方向)越過存儲(chǔ)-釋放屏障指令。▲圖18.2 存儲(chǔ)-釋放屏障原語加載-獲取和存儲(chǔ)-釋放屏障指令相當(dāng)于單方向的DMB指令,而DMB指令相當(dāng)于全方向的柵障。任何讀寫操作都不能越過該柵障。它們組合使用可以增強(qiáng)代碼靈活性并提高執(zhí)行效率。如圖18.3所示,加載-獲取屏障指令和存儲(chǔ)-釋放屏障指令組成了一個(gè)臨界區(qū),這相當(dāng)于一個(gè)柵障。讀指令1和寫指令1可以挪到加載-獲取屏障指令后面,但是不能向前(如圖18.3中指令執(zhí)行的方向)越過存儲(chǔ)-釋放屏障指令。讀指令3和寫指令3不能向后(如圖18.3中指令執(zhí)行的方向)越過加載-獲取屏障指令。在臨界區(qū)中的內(nèi)存訪問指令不能越過臨界區(qū),如讀指令2和寫指令2不能越過臨界區(qū)。▲圖18.3 加載-獲取屏障指令與存儲(chǔ)-釋放屏障指令A(yù)RMv8 體系結(jié)構(gòu)還提供一組新的加載和存儲(chǔ)指令,其中顯式包含了上述內(nèi)存屏障原語,如表18.2所示。表18.2 新的加載和存儲(chǔ)指令此外,ARMv8指令集還提供一組內(nèi)置了上述屏障原語的獨(dú)占加載與存儲(chǔ)指令,如表18.3所示。表18.3 獨(dú)占加載和存儲(chǔ)指令18.2.7 ISB指令I(lǐng)SB指令會(huì)沖刷流水線,然后從指令高速緩存或者內(nèi)存中重新預(yù)取指令。ARMv8體系結(jié)構(gòu)中有一個(gè)術(shù)語——更改上下文操作(context-changing operation)。更改上下文操作包括高速緩存、TLB、分支預(yù)測等維護(hù)操作以及改變系統(tǒng)控制寄存器等操作。使用ISB確保在ISB之前執(zhí)行的上下文更改操作的效果對在ISB指令之后獲取的指令是可見的。更改上下文操作的效果僅僅在上下文同步事件(context synchronization event)之后能看到。上下文同步事件包括:發(fā)生一個(gè)異常(exception);從一個(gè)異常返回;執(zhí)行了ISB指令。發(fā)生上下文同步事件產(chǎn)生的影響包括:在上下文同步事件發(fā)生時(shí)掛起的所有未屏蔽中斷都會(huì)在上下文同步事件之后的第一條指令執(zhí)行之前處理;在觸發(fā)上下文同步事件的指令后面的所有指令不會(huì)執(zhí)行,直到上下文同步事件處理完;在上下文同步事件之前完成的使TLB失效、指令高速緩存以及分支預(yù)測操作,都會(huì)影響在上下文同步事件后面出現(xiàn)的指令。例如,如果在上下文同步事件之前完成了使指令高速緩存失效的操作,那么在上下文同步事件之后,CPU會(huì)從指令高速緩存中重新取指令,相當(dāng)于把流水線之前預(yù)取的指令清空。另外,修改系統(tǒng)控制寄存器通常是需要使用ISB指令的,但是并不是修改所有系統(tǒng)寄存器都需要ISB指令,例如修改PSTATE寄存器就不需要ISB指令?!纠?8-8】CPU執(zhí)行如下代碼來打開FPU功能。//打開FPU
mrs x1,cpacr_el1
orr x1, x1 #(0x3 << 20)
msr cpacr_el1, x1
isb
fadd s0, s1, s2把cpacr_el1的Bit[21:20]設(shè)置為0x3,即可以打開浮點(diǎn)運(yùn)算單元。但是在打開之后,馬上執(zhí)行一條FADD指令,有可能會(huì)導(dǎo)致CPU異常。因?yàn)镕ADD這條指令可能已經(jīng)在流水線里,并且有可能會(huì)提前執(zhí)行,即打開浮點(diǎn)運(yùn)算單元之前就提前執(zhí)行了,所以出現(xiàn)錯(cuò)誤了。解決辦法就是插入一條ISB指令。這里的ISB指令是為了保證前面打開FPU的設(shè)置已經(jīng)完成,才從指令高速緩存里預(yù)取FADD這條指令。【例18-9】改變頁表項(xiàng)。1 str x10,[x1]
2 dsb ish
3 tlbi vae1is, x11
4 dsb ish
5 isb在第1行中,[x1]是頁表項(xiàng)的地址,這里STR指令用來更新這個(gè)頁表項(xiàng)的內(nèi)容。在第2行中,DSB指令保證STR指令執(zhí)行完。在第3行中,使頁表項(xiàng)對應(yīng)的TLB項(xiàng)失效。在第4行中,DSB指令保證TLB指令執(zhí)行完。在第5行中,觸發(fā)一個(gè)上下文同步事件,保證ISB后面的指令可以看到上述操作都完成,并且從指令高速緩存里重新預(yù)取指令。第5行是否可以換成DSB指令?答案是不可以,因?yàn)楹竺娴闹噶钤诘?行以及第4行的指令沒執(zhí)行完時(shí)可能已經(jīng)位于流水線中,即已經(jīng)預(yù)取了舊的頁表項(xiàng)的內(nèi)容,這會(huì)導(dǎo)致程序執(zhí)行錯(cuò)誤。【例18-10】下面是一段自修改代碼。自修改代碼就是當(dāng)代碼執(zhí)行時(shí)修改自身的指令。要保證自修改代碼執(zhí)行的正確性,需要使用高速緩存維護(hù)指令和內(nèi)存屏障指令。在本案例中我們重點(diǎn)關(guān)注內(nèi)存屏障指令的使用。首先,CPU0修改代碼。1 str x11, [x1]
2 dc cvau,x1
3 dsb ish
4 ic ivau,x1
5 dsb ish
6 str x0,[x2]
7 isb
8 br x1在第1行中,[x1]是執(zhí)行代碼存儲(chǔ)的地方,這里STR指令修改和更新最新代碼。在第2行中,清理[x1]地址處的代碼對應(yīng)的數(shù)據(jù)高速緩存,把[x1]對應(yīng)的數(shù)據(jù)高速緩存寫回[x1]指向的地址中。在第3行中,DSB指令保證DC指令執(zhí)行完,所有的CPU內(nèi)核都看到這條指令已經(jīng)執(zhí)行完。在第4行中,使[x1]對應(yīng)的指令高速緩存失效。在第5行中,DSB指令保證其他CPU內(nèi)核都能觀察到,使指令高速緩存失效的操作完成。在第6行中,[x2]表示標(biāo)志位(flag),設(shè)置標(biāo)志位為1,通知其他CPU代碼已經(jīng)更新了。在第7行中,ISB指令保證CPU0從指令高速緩存中重新預(yù)取指令。在第8行中,跳轉(zhuǎn)到最新的代碼中。上述的第7行指令一定使用ISB指令,否則第8行指令就會(huì)提前位于流水線里,預(yù)取X1寄存器的舊數(shù)據(jù),導(dǎo)致程序錯(cuò)誤。CPU1也開始執(zhí)行新代碼。1 WAIT (x2 == 1)
2 isb
3 br x1第1行的偽代碼WAIT表示等待標(biāo)志位置位。當(dāng)置位之后,我們需要使用一條ISB指令來保證CPU1從指令高速緩存里重新預(yù)取指令。在這個(gè)例子里,有如下幾個(gè)有趣的地方。在更新代碼與清理對應(yīng)數(shù)據(jù)高速緩存之間(見CPU0的代碼片段中的第1行和第2行)沒有使用內(nèi)存屏障指令。因?yàn)楦麓a內(nèi)容和清理數(shù)據(jù)高速緩存都操作相同的地址,它們之間有數(shù)據(jù)依賴性,可以理解為相同的觀察者,所以可以保證程序執(zhí)行的次序(program order)。在清理數(shù)據(jù)高速緩存和使指令高速緩存無效之間需要內(nèi)存屏障指令(見CPU0的代碼片段中第2~4行)。雖然這兩條高速緩存維護(hù)指令都操作相同的地址,但是它們是不同的觀察者(一個(gè)在數(shù)據(jù)訪問端,另一個(gè)在指令訪問端),因此需要使用DSB指令來保證清理完數(shù)據(jù)高速緩存之后才去使指令高速緩存失效。在一個(gè)多核一致性的系統(tǒng)中,DSB指令能保證高速緩存維護(hù)指令執(zhí)行完,其他CPU內(nèi)核能觀察到高速緩存維護(hù)指令完。DSB指令會(huì)等待高速緩存維護(hù)指令發(fā)送廣播到其他CPU內(nèi)核,并且等待這些CPU內(nèi)核返回應(yīng)答信號。18.2.8 高速緩存維護(hù)指令與內(nèi)存屏障指令在ARMv8體系結(jié)構(gòu)里,高速緩存維護(hù)指令(例如DC和IC指令)的執(zhí)行順序需要分情況來討論。指令單元、數(shù)據(jù)單元、MMU等都可以看成不同的觀察者。【例18-11】CPU執(zhí)行如下兩條指令。dc civau x2
ic ivau x2第一條是數(shù)據(jù)高速緩存維護(hù)指令,第二條是指令高速緩存維護(hù)指令。盡管二者都對X2寄存器進(jìn)行高速緩存的維護(hù),但是IC指令可以亂序并提前執(zhí)行,或者DC指令還沒清理完高速緩存就開始執(zhí)行IC指令,這會(huì)導(dǎo)致IC指令有可能獲取了X2寄存器中的舊數(shù)據(jù)。解決辦法是在上述兩條指令中間加入一條DSB指令,保證DC和IC指令的執(zhí)行順序,這樣IC指令就可以獲取X2的最新數(shù)據(jù)了。這里加入一條DMB指令行不行?數(shù)據(jù)高速緩存維護(hù)指令可以當(dāng)成數(shù)據(jù)訪問指令,但是指令高速緩存維護(hù)指令不能當(dāng)成數(shù)據(jù)訪問指令。如果這里改成DMB指令,那么后面的IC指令可能會(huì)在DC指令前面執(zhí)行。因此,這里必須使用DSB指令。下面總結(jié)數(shù)據(jù)高速緩存、指令高速緩存以及TLB與內(nèi)存屏障指令之間執(zhí)行次序的關(guān)系。1.?dāng)?shù)據(jù)高速緩存與統(tǒng)一高速緩存維護(hù)指令通常L1高速緩存分成指令高速緩存和數(shù)據(jù)高速緩存,而L2和L3高速緩存是統(tǒng)一高速緩存。在單處理器系統(tǒng)中,使用一條DMB指令來保證數(shù)據(jù)高速緩存和統(tǒng)一高速緩存維護(hù)指令執(zhí)行完。在多核系統(tǒng)中,同樣使用DMB指令來保證高速緩存維護(hù)指令在指定的共享域中執(zhí)行完。這里說的指定共享域通常指的是內(nèi)部共享域和外部共享域。以DC指令為例,使某個(gè)虛擬地址(VA)失效。在多核系統(tǒng)中,這條使高速緩存失效的指令會(huì)向所有CPU內(nèi)核的L1高速緩存發(fā)送廣播,然后等待回應(yīng)。當(dāng)所有的CPU內(nèi)核都回復(fù)了一個(gè)回應(yīng)信號之后,這條指令才算執(zhí)行完。DMB指令會(huì)等待和保證在指定共享域中所有的CPU都完成了使本地高速緩存失效的操作并回復(fù)了應(yīng)答信號。注意,加載-獲取和存儲(chǔ)-釋放內(nèi)存屏障原語對高速緩存維護(hù)指令沒有作用,它不能等待高速緩存的廣播答應(yīng)。DC指令與其他指令之間的執(zhí)行次序需要分多種情況來討論,我們假設(shè)這些指令之間沒有顯式地使用DSB/DMB指令(下面不討論DC ZVA指令)。DC指令與加載/存儲(chǔ)指令之間保證程序執(zhí)行次序(program order)的條件如下。加載/存儲(chǔ)指令訪問的地址屬于內(nèi)部回寫或者寫直通策略的普通類型內(nèi)存,并且它們訪問的地址在同一個(gè)高速緩存行中。DC指令指定的地址與加載/存儲(chǔ)指令訪問的地址具有同一個(gè)高速緩存共享屬性。DC指令與加載/存儲(chǔ)指令之間可以是任意執(zhí)行次序的情況有好幾種。第一種情況如下。加載/存儲(chǔ)指令訪問的地址屬于內(nèi)部回寫或者寫直通策略的普通類型內(nèi)存,并且訪問的地址在同一個(gè)高速緩存行中。DC指令指定的地址與加載和存儲(chǔ)指令訪問的地址不具有同一個(gè)高速緩存共享屬性。DC指令與加載/存儲(chǔ)指令之間沒有使用DSB或者DMB指令。第二種情況如下。加載/存儲(chǔ)指令訪問的地址屬于設(shè)備類型內(nèi)存或者沒有使能高速緩存的普通類型內(nèi)存。DC指令與加載/存儲(chǔ)指令之間沒有使用DSB或者DMB指令。第三種情況是加載/存儲(chǔ)指令訪問的地址和DC指令指定的地址不在同一個(gè)高速緩存行。多條DC指令之間的執(zhí)行次序如下:如果DC指令指定的地址屬于同一個(gè)高速緩存行,那么多條DC指令之間可以保證程序執(zhí)行次序;如果DC指令指定的地址不在同一條高速緩存行或者沒有指定地址,那么多條DC指令之間可以有任意執(zhí)行次序。DC指令與IC指令之間可以有任意執(zhí)行次序。綜上所述,如果想保證DC指令與其他指令的執(zhí)行次序,建議在DC指令后面添加DSB/DMB等內(nèi)存屏障指令。2.指令高速緩存維護(hù)指令指令高速緩存與數(shù)據(jù)高速緩存在內(nèi)存系統(tǒng)中是兩個(gè)獨(dú)立的觀察者。與指令高速緩存相關(guān)的一些操作包括指令的預(yù)取、指令高速緩存行的填充等。與數(shù)據(jù)高速緩存相關(guān)的一些操作包括數(shù)據(jù)高速緩存行填充和數(shù)據(jù)預(yù)取等。在指令高速緩存維護(hù)操作完成之后需要執(zhí)行一條DSB指令,確保在指定的共享域里所有的CPU內(nèi)核都能看到這條高速緩存維護(hù)指令執(zhí)行完。使指令高速緩存失效的指令會(huì)向指定共享域中所有CPU內(nèi)核發(fā)送廣播,DSB指令會(huì)等待所有CPU內(nèi)核的回應(yīng)。3.TLB維護(hù)指令遍歷頁表的硬件單元和數(shù)據(jù)訪問的硬件單元在內(nèi)存系統(tǒng)中是兩個(gè)不同的觀察者。遍歷頁表的硬件單元就包括MMU以及TLB操作。在TLB維護(hù)指令后面需要執(zhí)行一條DSB指令,來保證在指定的共享域里面的所有CPU內(nèi)核都能完成了TLB維護(hù)操作。在多核處理器系統(tǒng)中,TLB維護(hù)指令會(huì)發(fā)廣播給指定共享域中的所有CPU內(nèi)核,DSB指令會(huì)等待這些CPU的應(yīng)答信號。4.ISB指令不會(huì)等待廣播應(yīng)答ISB指令不會(huì)等待廣播應(yīng)答信號,如果有需要,則每個(gè)CPU內(nèi)核單獨(dú)調(diào)用ISB指令。發(fā)布于 2023-01-26 14:39?IP 屬地湖北ARM指令指令屏蔽?贊同 15??5 條評論?分享?喜歡?收藏?申請轉(zhuǎn)載?文章被以下專欄收錄STM32
ARM基礎(chǔ)(6):內(nèi)存屏障指令之DMB、DSB和ISB詳解_dmb dsb isb-CSDN博客
ARM基礎(chǔ)(6):內(nèi)存屏障指令之DMB、DSB和ISB詳解
最新推薦文章于?2024-03-06 14:57:51?發(fā)布
tilblackout
最新推薦文章于?2024-03-06 14:57:51?發(fā)布
閱讀量3.4k
收藏
25
點(diǎn)贊數(shù)
4
分類專欄:
ARM
文章標(biāo)簽:
arm開發(fā)
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/tilblackout/article/details/131949061
版權(quán)
ARM
專欄收錄該內(nèi)容
20 篇文章
30 訂閱
訂閱專欄
內(nèi)存屏障是一個(gè)通用術(shù)語,用于指代一條或多條指令,它們強(qiáng)制處理器在執(zhí)行加載(load)或存儲(chǔ)(store)指令時(shí)進(jìn)行同步事件。ARMv7-M 和 ARMv6-M架構(gòu)都提供了三個(gè)內(nèi)存屏障指令來支持內(nèi)存順序模型。這三個(gè)內(nèi)存屏障指令分別是:DMB、DSB和ISB。
文章目錄
1 DMB、DSB和ISB之概述2 三種指令的典型案例3 總結(jié)
1 DMB、DSB和ISB之概述
(1)Data Memory Barrier(DMB):數(shù)據(jù)內(nèi)存屏障 主要用于多核處理器系統(tǒng)中,不同的處理器可能同時(shí)執(zhí)行數(shù)據(jù)內(nèi)存?zhèn)鬏斨噶?。DMB指令確保在DMB之前的所有顯式數(shù)據(jù)內(nèi)存?zhèn)鬏斨噶疃家呀?jīng)在內(nèi)存中讀取或?qū)懭胪瓿桑瑫r(shí)確保任何后續(xù)的數(shù)據(jù)內(nèi)存?zhèn)鬏斨噶疃紝⒃贒MB執(zhí)行之后開始執(zhí)行,否則有些數(shù)據(jù)傳輸指令可能會(huì)提前執(zhí)行。 (2)Data Synchronization Barrier(DSB):數(shù)據(jù)同步屏障 在計(jì)算機(jī)的體系結(jié)構(gòu)中,處理器在執(zhí)行指令時(shí)通常會(huì)利用指令流水線來提高性能。但也會(huì)產(chǎn)生一些問題,比如在多線程編程中,兩個(gè)線程同時(shí)對共享的內(nèi)存進(jìn)行讀寫操作,由于讀/寫操作的重排序,就會(huì)導(dǎo)致數(shù)據(jù)的不一致。
當(dāng)執(zhí)行DSB指令時(shí),它確保在DSB之前的所有顯式數(shù)據(jù)內(nèi)存?zhèn)鬏斨噶疃家呀?jīng)在內(nèi)存中讀取或?qū)懭胪瓿?,同時(shí)確保任何后續(xù)的指令都將在DSB執(zhí)行之后開始執(zhí)行。
(3)Instruction Synchronization Barrier(ISB):指令同步屏障 指令的流水線允許處理器同時(shí)執(zhí)行多條指令的不同階段,然而這樣并行執(zhí)行可能會(huì)導(dǎo)致一些問題,特別是涉及到上下文切換的情況,如實(shí)時(shí)操作系統(tǒng)的任務(wù)切換。當(dāng)上下文切換時(shí),可能指令流水線中的指令還在執(zhí)行,而此時(shí)上下文已經(jīng)改變,導(dǎo)致指令執(zhí)行的結(jié)果不正確。
通過插入ISB指令,處理器會(huì)將流水線中的指令全部刷新,從而確保之前的指令不會(huì)影響后續(xù)指令的執(zhí)行,并且后續(xù)指令將從正確的上下文開始重新獲取。
tips:大多數(shù)CPU的體系架構(gòu)在異常的入口和出口都有ISB的語義(自動(dòng)執(zhí)行) 當(dāng)處理器執(zhí)行代碼時(shí),可能會(huì)遇到異常情況,例如中斷、系統(tǒng)調(diào)用、或者其他外部事件的觸發(fā)。在這些情況下,處理器需要暫時(shí)中止當(dāng)前的任務(wù),轉(zhuǎn)而處理異常事件,然后再返回到之前的任務(wù)繼續(xù)執(zhí)行。
具體來說,在進(jìn)行異常進(jìn)入之前,處理器會(huì)執(zhí)行ISB操作。這樣做的目的是刷新指令流水線,確保異常處理程序的指令是從正確的地址開始執(zhí)行,避免異常之前的指令對異常處理程序造成干擾。
而在異常處理程序執(zhí)行完畢后,處理器需要返回到之前被中斷的任務(wù)繼續(xù)執(zhí)行。在進(jìn)行異常返回之前,處理器同樣會(huì)執(zhí)行ISB操作。這樣做的目的是刷新指令流水線,確保返回時(shí)從正確的地址重新獲取指令,避免異常處理程序的指令對正常任務(wù)造成干擾。
(4)API 在C語言中,可以使用CMSIS或各種C編譯器提供的函數(shù)來調(diào)用內(nèi)存屏障指令。
內(nèi)存屏障CMSIS函數(shù)MDK-ARM,DS-5和RVDS中集成的C編譯器DMB_DMB()_dmb(0xF)DSB_DSB()_dsb(0xF)ISB_ISB()_isb(0xF)
這里的0xF表示指定一個(gè)完整系統(tǒng)屏障(Full System Barrier)操作,它將確保讀寫的屏障操作,適用于芯片內(nèi)部的內(nèi)存(如SRAM)和外部的內(nèi)存(如自己接的HyperRAM),無論該內(nèi)存是Shareable還是Non-Shareable。
2 三種指令的典型案例
1、DMB DMB指令保證了兩個(gè)內(nèi)存訪問能按正確的順序執(zhí)行。實(shí)際上DMB在Cortex-M的處理器中用得并不多,因?yàn)镃ortex-M處理器不會(huì)重新排序內(nèi)存事務(wù)(Memory transaction)。但如果想要軟件能在其他ARM處理器上重用(如Cortex-M移植到Cortex-A),尤其是在多主系統(tǒng)中,DMB是必要的。下面舉幾個(gè)例子: (1)DMA 在使用DMA控制器時(shí),需要在CPU內(nèi)存訪問和DMA操作之間插入DMB屏障,以確保CPU當(dāng)前的內(nèi)存讀寫操作在DMA開始之前完成。
(2)多核系統(tǒng)中的信號量 在多核系統(tǒng)中,使用信號量進(jìn)行核間同步。需要使用DMB來強(qiáng)制指定內(nèi)存執(zhí)行順序,以避免潛在的競態(tài)條件或數(shù)據(jù)不一致性。
當(dāng)一個(gè)核要訪問共享資源之前,它會(huì)先檢查信號量的狀態(tài)。如果信號量已經(jīng)被另一個(gè)核獲取,當(dāng)前核就必須等待,直到信號量狀態(tài)變?yōu)榭捎?。這個(gè)等待過程需要保證在一個(gè)核釋放信號量之后,其他核能夠立即看到信號量狀態(tài)的變化,而不是因?yàn)樘幚砥鲀?yōu)化或緩存導(dǎo)致的無效讀取而產(chǎn)生錯(cuò)誤。
在這里,DMB的作用就是強(qiáng)制執(zhí)行內(nèi)存順序。通過在核獲取信號量之前插入DMB屏障,確保在DMB之前的所有內(nèi)存操作都完成。這樣,在一個(gè)核釋放信號量之后,其他核獲取信號量的操作能夠看到最新的信號量狀態(tài),從而實(shí)現(xiàn)正確的同步。
(3)多核系統(tǒng)中的郵箱 類似地,在核之間通過郵箱機(jī)制通信時(shí),需要使用DMB來對郵箱的內(nèi)存訪問正確順序,避免通信問題。
2、DSB 在Cortex-M處理器中,DSB可以用來: (1) 確保對SCS(System Control Space)的修改在下一條指令執(zhí)行之前生效
在ARM Cortex-M處理器中,SCS是一個(gè)特殊的內(nèi)存區(qū)域,包含了一些系統(tǒng)控制寄存器和配置信息,用于管理處理器和系統(tǒng)的各種功能和特性。訪問SCS的寄存器可以影響處理器的行為,例如啟用或禁用特定的中斷、配置時(shí)鐘、設(shè)置系統(tǒng)控制位等。為了確保對SCS的修改在下一條指令執(zhí)行之前生效,需要使用DSB指令進(jìn)行數(shù)據(jù)同步。
(2)確保在執(zhí)行特權(quán)級指令之前,內(nèi)存中的數(shù)據(jù)已經(jīng)更新 在ARM Cortex-M處理器中,一些特殊的指令如SVC(Supervisor Call,特權(quán)級調(diào)用)、WFI(Wait For Interrupt,等待中斷)、WFE(Wait For Event,等待事件)等操作,涉及到特權(quán)級的轉(zhuǎn)換或者等待系統(tǒng)事件發(fā)生,需要使用DSB指令。
3、ISB ISB指令用于清空流水線,確保在ISB指令之前的所有上下文修改操作的效果被后續(xù)操作正確識別。有一個(gè)很典型的例子: CONTROL寄存器的修改 在修改CONTROL寄存器后,應(yīng)該使用ISB指令。比如我們修改CONTROL寄存器中的相關(guān)字段以進(jìn)入特權(quán)模式,然后下一行代碼就是一些特權(quán)操作,在這之前就需要使用ISB指令來讓處理器正確識別新的特權(quán)級。
3 總結(jié)
本文詳細(xì)說明了DMB、DSB和ISB三個(gè)指令的含義和使用時(shí)機(jī)。但大多數(shù)簡單處理器不會(huì)對內(nèi)存?zhèn)鬏斶M(jìn)行重新排序,因此,體系結(jié)構(gòu)的需求和處理器的實(shí)現(xiàn)需求是不同的。例如,大多數(shù)應(yīng)用程序可以在現(xiàn)有的Cortex-M處理器上正確運(yùn)行,而無需使用任何內(nèi)存屏障指令。
但是,如果要將應(yīng)用程序移植到高端處理器,則內(nèi)存屏障指令的遺漏可能會(huì)導(dǎo)致應(yīng)用程序出現(xiàn)故障。如果要將軟件移植到具有多個(gè)處理器的系統(tǒng)上,內(nèi)存屏障的使用也很重要。例如,在多處理器系統(tǒng)中處理信號量時(shí),應(yīng)該使用內(nèi)存屏障指令來確保系統(tǒng)中的其他處理器能夠以正確的順序觀察到數(shù)據(jù)的變化。
ARM建議軟件開發(fā)人員基于架構(gòu)需求開發(fā)軟件,而不是基于處理器特定的行為。這確保了軟件代碼的可移植性和可重用性。處理器特定的行為在相同架構(gòu)的不同的發(fā)布版本之間也可能有所不同。
關(guān)注博主即可閱讀全文
優(yōu)惠劵
tilblackout
關(guān)注
關(guān)注
4
點(diǎn)贊
踩
25
收藏
覺得還不錯(cuò)?
一鍵收藏
打賞
知道了
2
評論
ARM基礎(chǔ)(6):內(nèi)存屏障指令之DMB、DSB和ISB詳解
本文詳細(xì)說明了DMB、DSB和ISB三個(gè)指令的含義和使用時(shí)機(jī)。但大多數(shù)簡單處理器不會(huì)對內(nèi)存?zhèn)鬏斶M(jìn)行重新排序,因此,體系結(jié)構(gòu)的需求和處理器的實(shí)現(xiàn)需求是不同的。例如,大多數(shù)應(yīng)用程序可以在現(xiàn)有的Cortex-M處理器上正確運(yùn)行,而無需使用任何內(nèi)存屏障指令。
復(fù)制鏈接
掃一掃
專欄目錄
【ARM Cache 系列文章 5 – 內(nèi)存屏障ISB/DSB/DMB】
CodingCos的博客
11-06
2129
舉個(gè)例子,如果dmb前后的兩次訪存指令訪問的都是同一個(gè)終點(diǎn)(比如都是ddr,或者都是spi的fifo),它在能保證兩次訪問放射順序的同時(shí),其實(shí)就能保證實(shí)際的完成順序了。DMB不能保證它前面的指令在它后面的指令之前完成,只能保證后面的指令能觀察到前面的指令執(zhí)行了(即在LSU的執(zhí)行順序是能得到保證的),可能你會(huì)問這樣的屏障有什么實(shí)際的作用呢?DMB指令保證DMB指令前后的內(nèi)存訪問指令的執(zhí)行次序,內(nèi)存訪問包括load、store、data cache維護(hù)指令, 像add指令DMB是管不到的。
DBG-DMB-DSB-ISB.zip_cannotmqq_dmb dsb dsb 區(qū)別_dsb() isb()_dsb指令使用
09-19
ARM處理器匯編指令描述,DBG、DMB、DSB 和 ISB指令
2?條評論
您還未登錄,請先
登錄
后發(fā)表或查看評論
指令隔離DMB,DSB,ISB
leekay123的博客
12-05
3178
像ARM7TDMI這樣經(jīng)典的ARM處理器會(huì)按照程序的順序來執(zhí)行指令或訪問數(shù)據(jù)。而最新的ARM處理器會(huì)對執(zhí)行指令和訪問數(shù)據(jù)的順序進(jìn)行優(yōu)化。舉個(gè)例子,ARM v6/v7的處理器會(huì)對以下指令順序進(jìn)行優(yōu)化。
?
LDR r0, [r1] ; 從普通/可Cache的內(nèi)存中讀取,并導(dǎo)致cache未命中STR r2, [r3] ; 寫入普通/不可Cache的內(nèi)存
?
假設(shè)第一條LDR...
關(guān)于__DSB(); __ISB();
weixin_34384915的博客
04-07
7316
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>>
...
NSBL:NSBL(DMB模擬棒球聯(lián)盟)數(shù)據(jù),分析和研究
05-14
國家統(tǒng)計(jì)局
該項(xiàng)目根據(jù)MIT許可條款獲得許可。
此存儲(chǔ)庫主要包含一組python腳本,用于為NSBL模擬聯(lián)盟( )構(gòu)建和更新我的個(gè)人MySQL數(shù)據(jù)庫。
可以從以下鏈接找到數(shù)據(jù)庫的完整備份(.csv和SQL格式)。
一、barrier指令DSB,DMB,ISB,fence——內(nèi)存屏障,指令屏障
iot_aaker的博客
12-23
7995
最近工作中遇到一個(gè)問題,大致描述一下:
我們SOC用的arm cortex m7內(nèi)核,在設(shè)計(jì)時(shí)設(shè)計(jì)人員圖方便,將SPI controller的寄存器(即原本應(yīng)該是APB空間)放在了0x60000000的某一塊空間(此空間arm的memory定義區(qū)間為external memory),然后同時(shí)把SPI flash的存儲(chǔ)空間也映射在了0x60000000的這一塊區(qū)間內(nèi)。后者將spi flash memory映射在此區(qū)間內(nèi)其實(shí)時(shí)合理的。但是將spi controller的寄存器也放在這塊空間,驗(yàn)...
ARM內(nèi)存屏障指令(DMB,DSB,ISB)
propor的專欄
06-14
913
ARM,內(nèi)存屏障指令
DMB DSB ISB 簡介
熱門推薦
wangbinyantai的專欄
01-06
1萬+
DMB:?Data memory barrier
理解DMB指令,先看下面例子,在core 0和core1上同時(shí)跑兩個(gè)不同的指令(如下表所示)
core 0
core 1
Write A;
Write B;
Load B;
Load A;
這里core0在執(zhí)行兩個(gè)指令,寫A B兩個(gè)值的時(shí)候,可能會(huì)發(fā)生亂序也可能Write A時(shí)發(fā)生Ca
ARM進(jìn)階:內(nèi)存屏障(DMB/DSB/ISB)的20個(gè)使用例子詳解
主要分享硬件、嵌入式軟件部分知識
08-04
1775
在ARM體系架構(gòu)中,內(nèi)存屏障是一種用來確保程序在多核或多線程環(huán)境下按照預(yù)期順序執(zhí)行的機(jī)制。ARM定義了三種內(nèi)存屏障指令,分別是DMB(數(shù)據(jù)內(nèi)存屏障)、DSB(數(shù)據(jù)同步屏障)和ISB(指令同步屏障)。DMB指令用于確保內(nèi)存訪問的順序性。在多核處理器中,不同核的緩存可能會(huì)引起數(shù)據(jù)一致性的問題,DMB指令在多核之間添加屏障,確保指令的執(zhí)行順序與內(nèi)存訪問的順序一致,避免數(shù)據(jù)的讀寫亂序。DSB指令用于確保指令的完成和數(shù)據(jù)的同步。它保證在DSB指令之前的所有指令都已經(jīng)完成執(zhí)行,然后再執(zhí)行DSB指令之后的指令。
I&C開發(fā)成功用于DMB的RF和Baseband一體化芯片
12-03
Mobile TV領(lǐng)域非制造工廠I&C Technology開發(fā)成功了用于DMB(Digital Multimedia Broadcasting,數(shù)字多媒體廣播)的半導(dǎo)體RF Chip和Baseband Chip的一體化(One Chip),并透露8月份開始進(jìn)行量產(chǎn)。 ?收聽DMB必須裝載在...
Frontier低功耗接收單芯片支持T-DMB和DAB-IP
12-02
Frontier Silicon推出了一款用于T-DMB和DAB-IP廣播的單芯片接收器,擴(kuò)大了該公司移動(dòng)電視系列解決方案。這種被稱為Paradiso 1T (FS1032)的新型集成電路采用增強(qiáng)系統(tǒng)級封裝(SiP)技術(shù)且融合了Frontier Silicon獨(dú)特的...
RFID技術(shù)中的I&C最新DMB單芯片集成了RF和Baseband模塊
11-21
Mobile TV領(lǐng)域非制造工廠I&C Technology開發(fā)成功了用于DMB(Digital Multimedia Broadcasting,數(shù)字多媒體廣播)的半導(dǎo)體RF Chip和Baseband Chip的一體化(One Chip),并透露8月份開始進(jìn)行量產(chǎn)。 收聽DMB必須裝載在...
鴻蒙Harmony應(yīng)用開發(fā)—ArkTS聲明式開發(fā)(通用屬性:形狀裁剪)
m0_64420071的博客
03-02
891
ArkTS聲明式開發(fā)(通用屬性:形狀裁剪)
鴻蒙Harmony應(yīng)用開發(fā)—ArkTS聲明式開發(fā)(事件獨(dú)占控制)
m0_64420071的博客
03-06
837
ArkTS聲明式開發(fā)(事件獨(dú)占控制)
鴻蒙Harmony應(yīng)用開發(fā)—ArkTS聲明式開發(fā)(手勢處理:綁定手勢方法)
最新發(fā)布
m0_64420071的博客
03-06
681
ArkTS聲明式開發(fā)-手勢處理:綁定手勢方法
Rio: Order-Preserving and CPU-Efficient Remote Storage Access——論文泛讀
重新開始寫博客
03-04
900
針對網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)由于順序執(zhí)行導(dǎo)致CPU和IO性能下降。本文提出Rio,一個(gè)保序網(wǎng)絡(luò)存儲(chǔ)堆棧。允許異步處理有序?qū)懭?、合并連續(xù)有序請求、使用順序保留技術(shù)來強(qiáng)制執(zhí)行持久性順序。原理是添加了特殊結(jié)構(gòu),嵌入在原始請求中,使亂序執(zhí)行的請求隨時(shí)可以重建原始順序。提出兩個(gè)建議:I/O堆棧應(yīng)該利用現(xiàn)代NIC和SSD的異步接口(即多個(gè)深層硬件隊(duì)列和異步DMA引擎),以充分利用其高帶寬;
鴻蒙Harmony應(yīng)用開發(fā)—ArkTS聲明式開發(fā)(通用屬性:圖片邊框設(shè)置)
m0_64420071的博客
03-01
1269
ArkTS聲明式開發(fā)(通用屬性:圖片邊框設(shè)置)
鴻蒙Harmony應(yīng)用開發(fā)—ArkTS聲明式開發(fā)(通用屬性:鼠標(biāo)光標(biāo)控制)
m0_64420071的博客
03-06
671
ArkTS聲明式開發(fā)-通用屬性:鼠標(biāo)光標(biāo)控制
鴻蒙Harmony應(yīng)用開發(fā)—ArkTS聲明式開發(fā)(通用屬性:圖形變換)
m0_64420071的博客
03-02
1042
ArkTS聲明式開發(fā)(通用屬性:圖形變換)
DSB, DMB, ISB
11-04
DSB、DMB和ISB是ARM處理器中的三種同步指令。它們的作用分別是:
- DSB(Data Synchronization Barrier):強(qiáng)制CPU等待它之前的所有指令執(zhí)行完畢,確保所有內(nèi)存訪問都已完成。
- DMB(Data Memory Barrier):確保所有在DMB指令之前的內(nèi)存訪問都已完成,然后才能執(zhí)行DMB指令之后的內(nèi)存訪問。
- ISB(Instruction Synchronization Barrier):清空處理器流水線,確保ISB指令之后的所有指令都從緩存或內(nèi)存中重新獲取,以避免指令重排等問題。
這三種同步指令在ARM處理器中都有重要的作用,可以保證程序的正確性和穩(wěn)定性。
“相關(guān)推薦”對你有幫助么?
非常沒幫助
沒幫助
一般
有幫助
非常有幫助
提交
tilblackout
CSDN認(rèn)證博客專家
CSDN認(rèn)證企業(yè)博客
碼齡7年
嵌入式領(lǐng)域優(yōu)質(zhì)創(chuàng)作者
152
原創(chuàng)
1376
周排名
8935
總排名
33萬+
訪問
等級
2776
積分
7091
粉絲
781
獲贊
119
評論
2816
收藏
私信
關(guān)注
熱門文章
死區(qū)時(shí)間的分析與設(shè)置
17658
Git合并操作之merge、rebase、squash詳解
15376
LVGL學(xué)習(xí)(3):頁面切換原理和頁面管理實(shí)現(xiàn)
9370
BLE學(xué)習(xí)(2):廣播包報(bào)文格式詳解
8757
C語言正余弦函數(shù)定點(diǎn)查表算法原理及實(shí)現(xiàn)
8170
分類專欄
嵌入式硬件
1篇
嵌入式Linux
14篇
LVGL
6篇
嵌入式
23篇
ARM
20篇
RT1170
11篇
Linux
6篇
RTOS
4篇
網(wǎng)絡(luò)編程
13篇
git
3篇
C++
10篇
Peripheral
6篇
BLE
6篇
algorithm
6篇
FOC
7篇
LwIP
4篇
模擬電路
4篇
最新評論
ARM基礎(chǔ)(6):內(nèi)存屏障指令之DMB、DSB和ISB詳解
anglaberber:
寫的真不錯(cuò)
OpenCV NAO機(jī)器人輔助撿球丟球
A870994:
作者有g(shù)it倉庫嗎 能看一下代碼嗎
LVGL學(xué)習(xí)(3):頁面切換原理和頁面管理實(shí)現(xiàn)
tilblackout:
網(wǎng)上找了個(gè)可以運(yùn)行的codeblocks LVGL工程,把沒用的代碼刪了,然后按照GUI GUIDER的代碼結(jié)構(gòu)修改了一下,后面就只需要往工程里添加一下文件就行了。
LVGL學(xué)習(xí)(3):頁面切換原理和頁面管理實(shí)現(xiàn)
ceh0315:
大佬,我看你用的nxp的guider,這個(gè)是怎么移植到codeblocks上的啊?我之前畫了一個(gè)界面,始終移植不上去,現(xiàn)在只能用lvgl手搓
CORDIC算法 arctan反正切計(jì)算原理及C語言定點(diǎn)實(shí)現(xiàn)
tilblackout:
代碼肯定沒有錯(cuò),我已經(jīng)用于FOC算法跑過了。輸入的數(shù)據(jù)要是標(biāo)幺值,輸出的也是對應(yīng)的標(biāo)幺值。
您愿意向朋友推薦“博客詳情頁”嗎?
強(qiáng)烈不推薦
不推薦
一般般
推薦
強(qiáng)烈推薦
提交
最新文章
嵌入式硬件設(shè)計(jì)實(shí)例:基于STM32的流水燈原理圖和PCB設(shè)計(jì)
Linux內(nèi)核學(xué)習(xí)(1):目錄結(jié)構(gòu)、配置、編譯和常用Shell命令
U-Boot學(xué)習(xí)(7):內(nèi)核啟動(dòng)之bootz啟動(dòng)zImage源碼分析
2024年12篇
2023年75篇
2022年43篇
2021年19篇
2020年4篇
目錄
目錄
分類專欄
嵌入式硬件
1篇
嵌入式Linux
14篇
LVGL
6篇
嵌入式
23篇
ARM
20篇
RT1170
11篇
Linux
6篇
RTOS
4篇
網(wǎng)絡(luò)編程
13篇
git
3篇
C++
10篇
Peripheral
6篇
BLE
6篇
algorithm
6篇
FOC
7篇
LwIP
4篇
模擬電路
4篇
目錄
評論?2
被折疊的??條評論
為什么被折疊?
到【灌水樂園】發(fā)言
查看更多評論
添加紅包
祝福語
請?zhí)顚懠t包祝福語或標(biāo)題
紅包數(shù)量
個(gè)
紅包個(gè)數(shù)最小為10個(gè)
紅包總金額
元
紅包金額最低5元
余額支付
當(dāng)前余額3.43元
前往充值 >
需支付:10.00元
取消
確定
下一步
知道了
成就一億技術(shù)人!
領(lǐng)取后你會(huì)自動(dòng)成為博主和紅包主的粉絲
規(guī)則
hope_wisdom 發(fā)出的紅包
打賞作者
tilblackout
你的鼓勵(lì)將是我創(chuàng)作的最大動(dòng)力
¥1
¥2
¥4
¥6
¥10
¥20
掃碼支付:¥1
獲取中
掃碼支付
您的余額不足,請更換掃碼支付或充值
打賞作者
實(shí)付元
使用余額支付
點(diǎn)擊重新獲取
掃碼支付
錢包余額
0
抵扣說明:
1.余額是錢包充值的虛擬貨幣,按照1:1的比例進(jìn)行支付金額的抵扣。 2.余額無法直接購買下載,可以購買VIP、付費(fèi)專欄及課程。
余額充值
ARM進(jìn)階:內(nèi)存屏障(DMB/DSB/ISB)的20個(gè)使用例子詳解___dsb();-CSDN博客
ARM進(jìn)階:內(nèi)存屏障(DMB/DSB/ISB)的20個(gè)使用例子詳解
tilblackout
已于?2023-08-04 00:26:16?修改
閱讀量1.7k
收藏
22
點(diǎn)贊數(shù)
2
分類專欄:
ARM
文章標(biāo)簽:
arm開發(fā)
于?2023-08-04 00:25:45?首次發(fā)布
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/tilblackout/article/details/132030663
版權(quán)
ARM
專欄收錄該內(nèi)容
20 篇文章
30 訂閱
訂閱專欄
在上一節(jié)內(nèi)存屏障指令之DMB、DSB和ISB詳解中,介紹了一下內(nèi)存屏障的三個(gè)指令的作用并舉了一些例子,對于內(nèi)存屏障指令的使用時(shí)機(jī),與處理器架構(gòu)(比如Cortex-M和Cortex-A)和處理器的系統(tǒng)實(shí)現(xiàn)(同樣的架構(gòu),有不同的實(shí)現(xiàn),如STM32、NXP都有基于Cortex-M4的單片機(jī))都有關(guān)系。
本節(jié)將通過20個(gè)例子繼續(xù)深入理解內(nèi)存屏障,主要從以下兩方面來介紹: (1)處理器架構(gòu)要求:指在硬件體系結(jié)構(gòu)中定義的規(guī)范和要求。它描述了處理器的指令集、寄存器、中斷控制、內(nèi)存訪問、流水線結(jié)構(gòu)等硬件特性。這些規(guī)范通常由處理器設(shè)計(jì)者或者架構(gòu)定義組織(如ARM,x86等)確定。架構(gòu)要求是通用的,適用于所有基于該架構(gòu)的處理器。
(2)系統(tǒng)實(shí)現(xiàn)要求:指在具體處理器實(shí)現(xiàn)中,根據(jù)架構(gòu)要求來實(shí)現(xiàn)這些規(guī)范的具體方法。每個(gè)處理器制造商可以根據(jù)架構(gòu)規(guī)范,設(shè)計(jì)和生產(chǎn)自己的處理器,但他們的實(shí)現(xiàn)必須遵循架構(gòu)規(guī)范。實(shí)現(xiàn)要求可能因處理器型號、版本和制造商而異。
文章目錄
1 內(nèi)存中普通數(shù)據(jù)的訪問2 設(shè)備(外設(shè))間的訪問3 位帶訪問4 SCS外設(shè)訪問5 通過NVIC使能中斷6 通過NVIC關(guān)閉中斷7 用CPS和MSR指令使能中斷8 用CPS和MSR指令關(guān)閉中斷9 禁用外設(shè)中斷10 更改中斷的優(yōu)先級11 向量表配置-VTOR12 向量表?xiàng)l目配置13 內(nèi)存映射的改變14 進(jìn)入睡眠模式15 自啟16 CONTROL寄存器17 MPU編程18 多主系統(tǒng)19 信號量和互斥鎖(單核和多核)20 自修改代碼總結(jié)
1 內(nèi)存中普通數(shù)據(jù)的訪問
這種情況下沒有必要在每次內(nèi)存訪問之間都使用內(nèi)存屏障:
處理器架構(gòu):只要不影響程序的運(yùn)行,處理器就可以對數(shù)據(jù)傳輸重新排序系統(tǒng)實(shí)現(xiàn):在Cortex-M處理器中,數(shù)據(jù)傳輸是按照編程的順序進(jìn)行的
2 設(shè)備(外設(shè))間的訪問
在外設(shè)編程或外設(shè)訪問期間,不需要在每一步之間使用內(nèi)存屏障指令:
處理器架構(gòu):對同一設(shè)備的訪問必須按照程序的順序進(jìn)行系統(tǒng)實(shí)現(xiàn):Cortex-M處理器不會(huì)重排序數(shù)據(jù)傳輸
如果編程順序涉及許多不同的設(shè)備:
處理器架構(gòu):當(dāng)訪問不同的設(shè)備并且兩個(gè)設(shè)備之間的編程順序可能影響結(jié)果時(shí),需要內(nèi)存屏障。這是因?yàn)榭偩€結(jié)構(gòu)可能具有通往每個(gè)設(shè)備的不同總線分支,并且不同總線分支可能具有不同的延遲。系統(tǒng)實(shí)現(xiàn):Cortex-M處理器不會(huì)對數(shù)據(jù)傳輸進(jìn)行重新排序,因此當(dāng)訪問不同的設(shè)備時(shí)不需要內(nèi)存屏障
3 位帶訪問
Cortex-M3和Cortex-M4處理器上的位帶訪問是一個(gè)特殊的特性。它可以讓內(nèi)存映射的兩個(gè)部分成為位可尋址的:
處理器架構(gòu):位帶特性不是ARMv7或ARMv6體系結(jié)構(gòu)的一部分,因此對于使用內(nèi)存屏障進(jìn)行位帶訪問沒有體系結(jié)構(gòu)定義的要求系統(tǒng)實(shí)現(xiàn):Cortex-M3和Cortex-M4處理器處理位帶訪問、位帶區(qū)域以及位帶別名區(qū)域,以編程順序。沒有必要使用內(nèi)存屏障
ARM Cortex-M0和Cortex-M0+處理器沒有位帶特性??梢允褂胋us wrapper向Cortex-M0和Cortex-M0+處理器添加位帶特性。在這種情況下,bus wrapper必須保持正確的內(nèi)存順序。
4 SCS外設(shè)訪問
SCS外設(shè)訪問,例如NVIC和調(diào)試訪問,通常不需要使用內(nèi)存屏障指令:不需要在每個(gè)SCS訪問之間插入內(nèi)存屏障指令,也不需要在SCS訪問和設(shè)備內(nèi)存訪問之間插入內(nèi)存屏障指令。
處理器架構(gòu):SCS所在的內(nèi)存區(qū)域的MPU默認(rèn)配置為強(qiáng)有序,自帶DMB的作用(如下圖所示) 系統(tǒng)實(shí)現(xiàn):不需要在每個(gè)SCS訪問之間插入內(nèi)存屏障指令,也不需要在SCS訪問和設(shè)備內(nèi)存訪問之間插入內(nèi)存屏障指令
處理器架構(gòu)要求
如果需要立即看到SCS寄存器寫入的效果,則需要DSB不需要在相鄰的兩次訪問SCS之間添加內(nèi)存屏障指令如果下一條指令必須在前一條指令產(chǎn)生作用后執(zhí)行,此時(shí)需要調(diào)用DSB指令,例子如下:
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; /* Enable deepsleep */
__DSB(); /* Ensure effect of last store takes effect */
__WFI(); /* Enter sleep mode */
---------------------
void Device_IRQHandler(void) {
software_flag = 1; /* Update software variable used in thread */
SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; /* Disable sleeponexit */
__DSB(); /* Ensure effect of last store takes effect */
return;
}
注意,當(dāng)程序訪問的是Normal內(nèi)存時(shí),SCS訪問時(shí),系統(tǒng)架構(gòu)層面的DMB不能保證內(nèi)存排序。如果程序的操作依賴于對SCS的訪問與對普通內(nèi)存的訪問之間的順序,那么就需要使用內(nèi)存屏障指令,比如DMB或DSB。下面是一個(gè)例子:
STR R0, [R1] ; Access to a Normal Memory location
DMB ; Add DMB ensures ordering for ALL memory types
STR R3, [R2] ; Access to a SCS location
DMB ; Add DMB ensures ordering for ALL memory types
STR R0, [R1] ; Access to a Normal Memory location
如果[R1]指向的是設(shè)備內(nèi)存區(qū)域或強(qiáng)有序內(nèi)存區(qū)域,則不需要DMB
系統(tǒng)實(shí)現(xiàn)要求 在現(xiàn)有的Cortex-M處理器中,忽略DMB或DSB指令不會(huì)導(dǎo)致錯(cuò)誤,因?yàn)檫@些處理器中的SCS已經(jīng)包含DSB行為:
在Cortex-M0、M0+處理器中,這種行為在訪問完成后立即發(fā)生。在SCS訪問后,并不嚴(yán)格要求DSB。在Cortex-M3和M4處理器中,內(nèi)存屏障的作用在訪問SCS后立即生效。對于SCS內(nèi)存的訪問,除了特殊情況下的SLEEPONEXIT更新外,通常不嚴(yán)格要求使用DSB指令。
如果異常處理程序在異常返回之前禁用了SCS中的SLEEPONEXIT特性,則在SCR寫入之后,在異常返回之前,需要DSB指令。參考前面的Device_IRQHandler例子。
看一下在系統(tǒng)實(shí)現(xiàn)層面,對SCS訪問的表現(xiàn): 圖中說得很清楚,每次訪問SCS(包括NVIC)都具有對設(shè)備/強(qiáng)序訪問的自動(dòng)添加數(shù)據(jù)同步屏障DSB的連帶作用。所以對于前面處理器架構(gòu)要求中的例子,DSB可以去掉:
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; /* Enable deepsleep */
__WFI(); /* Enter sleep mode */
注意:
現(xiàn)有的Cortex-M處理器不會(huì)重新排序任何數(shù)據(jù)傳輸,因此不需要使用DMB指令對于Cortex-M3和Cortex-M4處理器,如果SCS加載/存儲(chǔ)后的指令是NOP指令,或者是條件失敗(condition failed)指令,則NOP指令或條件失敗指令可以與SCS加載/存儲(chǔ)指令并行執(zhí)行
5 通過NVIC使能中斷
通常,NVIC操作不需要使用內(nèi)存屏障指令,代碼如下所示:
device_config(); // Setup peripheral
NVIC_ClearingPending(device_IRQn); // clear pending status
NVIC_SetPriority(device_IRQn, priority); // set priority level
NVIC_EnableIRQ(device_IRQn); // Enable interrupt
當(dāng)一個(gè)中斷事件發(fā)生時(shí),它可以先進(jìn)入pending狀態(tài),而不管中斷是否使能
前面有提到,從架構(gòu)上看,每次訪問SCS(NVIC屬于SCS)時(shí),對于設(shè)備內(nèi)存或強(qiáng)有序內(nèi)存的訪問訪問,相鄰兩次的操作之前都會(huì)插入DMB。 而從Cortex-M處理器的系統(tǒng)實(shí)現(xiàn)來看,每次訪問SCS(NVIC屬于SCS)時(shí),對于設(shè)備內(nèi)存或強(qiáng)有序內(nèi)存的訪問訪問,相鄰兩次的操作之前都會(huì)插入DSB。 對于Cortex-M處理器來說,由于其流水線特性,如果中斷已經(jīng)處于掛起狀態(tài),處理器可以在執(zhí)行中斷服務(wù)程序之前在NVIC中啟用中斷后執(zhí)行最多兩個(gè)額外的指令。如下圖所示: 處理器架構(gòu)要求 不同的應(yīng)用有不同的要求:
在一般的NVIC操作中,無需使用內(nèi)存屏障NVIC和外設(shè)之間的操作間,無需使用內(nèi)存屏障如果一個(gè)已經(jīng)掛起的中斷需要在使能NVIC后馬上被響應(yīng),需要添加一個(gè)DSB,緊接著還要添加一個(gè)ISB
如果中斷后的指令依賴于掛起的中斷的結(jié)果,就應(yīng)該添加內(nèi)存屏障指令。處理中斷的例子如下所示:
LDR R0, =0xE000E100 ; NVIC_SETENA address
MOVS R1, #0x1
STR R1, [R0] ; Enable IRQ #0
DSB ; Ensure write is completed
; (architecturally required, but not strictly
; required for existing Cortex-M processors)
ISB ; Ensure IRQ #0 is executed
CMP R8, #1 ; Value of R8 dependent on the execution
; result of IRQ #0 handler
如果省略了上面的內(nèi)存屏障指令,CMP將在中斷發(fā)生之前執(zhí)行,如下圖所示: 系統(tǒng)實(shí)現(xiàn)要求 不同的應(yīng)用有不同的要求:
在一般的NVIC操作中,無需使用內(nèi)存屏障如果一個(gè)已經(jīng)掛起的中斷需要在使能NVIC后馬上被響應(yīng),需要添加一個(gè)ISB指令
注意:由于對NVIC(SCS)的訪問本身就具有DSB內(nèi)存屏障,因此省略DSB指令仍然可以立即識別已啟用和掛起的中斷。
6 通過NVIC關(guān)閉中斷
由于Cortex-M的流水線架構(gòu),可以在進(jìn)入中斷序列(中斷事件發(fā)生時(shí),處理器執(zhí)行的一系列操作和指令)的同時(shí)寫入NVIC來禁用中斷。因此,中斷處理程序有可能會(huì)在NVIC禁用中斷后立即執(zhí)行。 處理器架構(gòu)要求 根據(jù)不同的應(yīng)用需求,需要使用內(nèi)存屏障:
在禁用IRQ時(shí),一般的NVIC編程不需要使用內(nèi)存屏障在NVIC編程與外設(shè)編程之間,也不需要使用內(nèi)存屏障如果需要確保在NVIC禁用中斷后不會(huì)觸發(fā)中斷,可以添加DSB指令,然后再添加ISB指令
下面是一個(gè)切換中斷處理函數(shù)(修改向量表)的例子:
#define MEMORY_PTR(addr) (*((volatile unsigned long *)(addr)))
NVIC_DisableIRQ(device_IRQn);
__DSB();
__ISB();
// Change vector to a different one
MEMORY_PTR(SCB->VTOR+0x40+(device_IRQn<<2))=(void) device_Handler;
系統(tǒng)實(shí)現(xiàn)要求 根據(jù)不同的應(yīng)用需求,需要使用內(nèi)存屏障:
在正常的NVIC編程中禁用IRQ時(shí),不需要使用內(nèi)存屏障在NVIC編程和外設(shè)編程之間,也不需要使用內(nèi)存屏障如果需要確保在NVIC禁用中斷后不會(huì)觸發(fā)中斷,可以添加ISB指令
7 用CPS和MSR指令使能中斷
在正常的應(yīng)用程序中,在使用CPS指令啟用中斷后,不需要添加任何屏障指令:
_enable_irq(); /* 實(shí)際上是執(zhí)行CPSIE I來清除PRIMASK */
如果一個(gè)中斷已經(jīng)處于掛起狀態(tài),在調(diào)用CPSIE I后,處理器將處理該中斷。然而,在處理器進(jìn)入異常處理程序之前,可能會(huì)執(zhí)行額外的指令:
對于Cortex-M3或Cortex-M4,處理器在進(jìn)入中斷服務(wù)程序之前最多可以執(zhí)行兩條額外的指令對于Cortex-M0,處理器在進(jìn)入中斷服務(wù)程序之前最多可以執(zhí)行一條附加指令
如下圖所示: 處理器架構(gòu)要求
如果有必要確保在執(zhí)行后續(xù)操作之前識別到掛起的中斷,則應(yīng)該在CPSIE i之后使用ISB指令,如下圖所示: 在兩個(gè)臨界區(qū)任務(wù)之間,如果你希望允許一個(gè)掛起的中斷發(fā)生,可以使用ISB指令來實(shí)現(xiàn)。代碼如下所示:
__enable_irq(); // CPSIE I : Enable interrupt
__ISB(); // Allow pended interrupts to be recognized
__disable_irq(); // CPSID I : Disable interrupt
還有一個(gè)典型的例子是: 時(shí)序圖如下:
當(dāng)使用MSR指令啟用中斷時(shí),要求同上
系統(tǒng)實(shí)現(xiàn)要求 在Cortex-M處理器中:
如果有必要確保在執(zhí)行后續(xù)操作之前識別掛起的中斷,則應(yīng)該在CPSIE i之后使用ISB指令。這與處理器架構(gòu)要求相同有一個(gè)例外是CPSIE后面跟著CPSID,但在Cortex-M處理器中,可以不用在CPSIE和CPSID之間插入ISB。代碼如下:
時(shí)序圖如下:
在系統(tǒng)實(shí)現(xiàn)需求中,不需要在__enable_irq()和__disable_irq()之間添加內(nèi)存屏障指令。但是,在處理器架構(gòu)要求中,如果需要在CPSIE和CPSID指令之間識別中斷,則需要使用ISB指令。
當(dāng)使用MSR指令啟用中斷時(shí),要求同上
根據(jù)處理器架構(gòu)要求,在某些情況下,如果需要確保中斷能夠在正確地被識別,則需要添加ISB指令。這是因?yàn)樵谝恍┨囟ǖ奶幚砥骷軜?gòu)中,中斷的使能和禁用可能需要額外的同步來保證其正確性。因此,根據(jù)架構(gòu)要求,使用ISB指令是一種確保正確行為的方法。在系統(tǒng)實(shí)現(xiàn)要求中未添加內(nèi)存屏障的情況下,這個(gè)操作在特定架構(gòu)中已經(jīng)被合理地處理了,因此不需要額外的內(nèi)存屏障。在剛剛的代碼中,根據(jù)具體的系統(tǒng)實(shí)現(xiàn)要求,它并不需要在__enable_irq()和__disable_irq()之間添加內(nèi)存屏障指令。這意味著在特定的處理器實(shí)現(xiàn)中,中斷使能和禁用的操作已經(jīng)在硬件層面上得到了適當(dāng)?shù)耐剑瑹o需額外的內(nèi)存屏障指令。
8 用CPS和MSR指令關(guān)閉中斷
CPSID指令在指令流中自我同步,無需在CPSID之后插入內(nèi)存屏障指令。 處理器架構(gòu)要求 無需使用內(nèi)存屏障。
系統(tǒng)實(shí)現(xiàn)要求 無需使用內(nèi)存屏障。
當(dāng)使用MSR指令關(guān)閉中斷時(shí),要求同上
9 禁用外設(shè)中斷
當(dāng)在外設(shè)上禁用一個(gè)中斷時(shí),由于系統(tǒng)中存在多種可能的延遲源,可能需要額外的時(shí)間。下圖顯示了多種不同的延時(shí)源: 即使在禁用外設(shè)之后,也可能會(huì)在短時(shí)間內(nèi)收到來自禁用外設(shè)的中斷請求。
處理器架構(gòu)要求 無要求,一切由下面的系統(tǒng)實(shí)現(xiàn)要求決定。
系統(tǒng)實(shí)現(xiàn)要求 延遲取決于設(shè)備。對于大多數(shù)情況,如果IRQ同步器中的延遲很小,可以使用以下步驟來禁用中斷:
通過寫入其控制寄存器CONTROL來禁用外設(shè)中斷讀取外設(shè)的控制寄存器,以確保其已更新在NVIC中禁用IRQ清除NVIC中的IRQ掛起狀態(tài)讀取IRQ掛起狀態(tài)。如果IRQ掛起被設(shè)置了,清除外設(shè)中的IRQ狀態(tài),然后再次清除NVIC中的IRQ掛起狀態(tài)。必須重復(fù)此步驟,直到NVIC IRQ掛起狀態(tài)保持清除。
這個(gè)步驟序列適用于大多數(shù)簡單的微控制器設(shè)備,可以成功地禁用中斷。然而,由于系統(tǒng)內(nèi)可能發(fā)生的各種延遲因素,建議聯(lián)系芯片供應(yīng)商或制造商獲取支持。
10 更改中斷的優(yōu)先級
優(yōu)先級的設(shè)置由SCS中NVIC的Priority Level寄存器決定。對于Cortex-M3或Cortex-M4處理器,優(yōu)先級級別可以動(dòng)態(tài)地進(jìn)行更改。然而對于ARMv6-M處理器,例如Cortex-M0或Cortex-M0+,不支持對已啟用的中斷或異常的優(yōu)先級進(jìn)行動(dòng)態(tài)更改。在啟用中斷之前,就應(yīng)該設(shè)置優(yōu)先級。
處理器架構(gòu)要求 由于SCS是強(qiáng)有序內(nèi)存,所以NVIC配置不需要內(nèi)存屏障。但是,在更改中斷優(yōu)先級后,如果中斷已啟用并且需要中斷按照新的優(yōu)先級級別執(zhí)行,應(yīng)該在其后插入DSB和ISB指令。
注意:在ARMv6-M處理器上,只有在中斷被禁用時(shí)才應(yīng)該更改中斷的優(yōu)先級級別,否則結(jié)果是不可預(yù)測的
如果下一個(gè)指令是CPSIE或MSR,根據(jù)處理器架構(gòu)要求,應(yīng)該插入一個(gè)DSB指令,然后再插入一個(gè)ISB指令(如果想讓一個(gè)掛起的中斷馬上被識別到,就調(diào)用ISB,否則可以不調(diào)用)。這樣的操作順序可以確保中斷狀態(tài)的正確切換和指令的順序執(zhí)行,以防止中斷狀態(tài)的不一致或指令亂序執(zhí)行問題。
系統(tǒng)實(shí)現(xiàn)要求 在Cortex-M處理器中,訪問中斷優(yōu)先級寄存器本身就有DSB屏障了,因?yàn)镾CS是強(qiáng)有序內(nèi)存。在Cortex-M3或Cortex-M4處理器中:
如果需要立即識別優(yōu)先級的更改,需要使用ISB指令如果不需要在隨后的操作之前立即識別優(yōu)先級的更改,則不需要插入內(nèi)存屏障指令如果下一個(gè)操作是SVC異常,則不需要插入內(nèi)存屏障指令 對于Cortex-M3或Cortex-M4處理器,如果優(yōu)先級級別的更改可能導(dǎo)致新的中斷嵌套(比當(dāng)前正在執(zhí)行的中斷優(yōu)先級高),并且我們希望立即執(zhí)行此中斷,則需要插入ISB指令。否則,由于流水線的原因,最多可能會(huì)多執(zhí)行兩條指令。
11 向量表配置-VTOR
在Cortex-M3和Cortex-M4處理器中,向量表的位置由SCS中VTOR(Vector Table Offset Register)的設(shè)置決定。
處理器架構(gòu)要求 從架構(gòu)上講,在更改VTOR后,如果要立即產(chǎn)生異常并使用最新的向量表設(shè)置,則應(yīng)該使用DSB指令。 系統(tǒng)實(shí)現(xiàn)要求 在Cortex-M3、Cortex-M4和Cortex-M0+處理器中,對SCS的訪問本身就具有DSB屏障,因此不需要插入DSB指令。
Cortex-M0處理器沒有VTOR
12 向量表?xiàng)l目配置
這里指的是更新向量表中的各個(gè)條目(entry)。
處理器架構(gòu)要求 如果向量表位于RAM(如SRAM/SDRAM)中,無論是通過VTOR重新定位還是通過設(shè)備相關(guān)的內(nèi)存重映射機(jī)制進(jìn)行重新定位,從架構(gòu)上講,在更新向量表?xiàng)l目后,如果要立即使能異常,則需要使用內(nèi)存屏障指令。如下圖所示: 如果下一條指令是訪問RAM,則還需要一個(gè)DMB指令: 也就是說如果向量表保存在普通內(nèi)存而不是強(qiáng)有序內(nèi)存中,需要考慮內(nèi)存屏障操作。 系統(tǒng)實(shí)現(xiàn)要求 在Cortex-M處理器中,省略DSB或DMB指令在修改向量條目時(shí)不會(huì)引發(fā)任何問題,因?yàn)楫惓l目序列在最后一個(gè)內(nèi)存訪問完成之前不會(huì)啟動(dòng)。
13 內(nèi)存映射的改變
許多微控制器都包含了一種特定于設(shè)備的內(nèi)存重映射功能,允許在運(yùn)行時(shí)通過編程配置寄存器來更改內(nèi)存映射,這個(gè)寄存器應(yīng)放置在設(shè)備內(nèi)存(device memory)中。在更改內(nèi)存映射配置期間是否需要內(nèi)存屏障指令取決于以下因素:
受影響的內(nèi)存空間是否涵蓋程序代碼,即是否包括指令。處理器與內(nèi)存配置寄存器之間的特定于設(shè)備的數(shù)據(jù)路徑,例如寫緩沖區(qū)(CPU和寄存器之間需要經(jīng)過寫緩沖區(qū))。 處理器架構(gòu)要求 這里討論的要求適用以下條件:除了處理器內(nèi)部的任何內(nèi)部寫緩沖區(qū)外,沒有影響內(nèi)存重映射控制寄存器的設(shè)備特定寫緩沖區(qū)內(nèi)存映射切換中沒有額外的硬件延遲
從架構(gòu)上講,在進(jìn)行內(nèi)存映射更改的前后,應(yīng)該插入內(nèi)存屏障指令:
... ; application code before switching
DSB ; Ensure all memory accesses are completed
STR
DSB ; Ensure the write is completed
ISB ; Flush instruction buffer (optional, only required if
; the memory map change affects program memory)
... ; application code after switching
如果受影響的內(nèi)存沒有在任何程序代碼中使用,則在內(nèi)存映射更改后需要插入DSB指令,但可以省略ISB指令。 系統(tǒng)實(shí)現(xiàn)要求 這里討論的要求同樣適用以下條件:
除了處理器內(nèi)部的任何內(nèi)部寫緩沖區(qū)外,沒有影響內(nèi)存重映射控制寄存器的設(shè)備特定寫緩沖區(qū)內(nèi)存映射切換中沒有額外的硬件延遲
在Cortex-M處理器中:
在進(jìn)行內(nèi)存映射更改之前,不需要DSB或DMB指令,因?yàn)檫@些處理器不允許兩個(gè)寫操作序列重疊在重映射后,需要進(jìn)行DSB然后ISB的序列,以確保使用最新的內(nèi)存映射獲取程序代碼
在這個(gè)案例研究中,做出了兩個(gè)假設(shè)。如果這些假設(shè)無效,例如,如果處理器與內(nèi)存控制寄存器之間的數(shù)據(jù)路徑包含額外的系統(tǒng)級寫緩沖區(qū),那么內(nèi)存屏障指令不能保證傳輸完成。在這種情況下:
可以從先前訪問的區(qū)域執(zhí)行讀取操作,以確保寫緩沖區(qū)被清空。如果已向系統(tǒng)的各個(gè)部分發(fā)出了多個(gè)寫傳輸,可能需要多次讀取操作以確保所有寫緩沖區(qū)都被清空?;蛘?,微控制器或SoC可能具有狀態(tài)寄存器,指示是否存在任何正在進(jìn)行的傳輸,并在內(nèi)存重映射完成時(shí)進(jìn)行通知。如果需要,這允許程序代碼考慮內(nèi)存重映射邏輯上的額外硬件延遲。
具體的差異還是得詳細(xì)咨詢不同芯片制造商。
14 進(jìn)入睡眠模式
在Cortex-M處理器中,可以使用WFI和WFE指令進(jìn)入睡眠模式。
處理器架構(gòu)要求 從架構(gòu)上來說,應(yīng)該在執(zhí)行WFI或WFE指令之前使用DSB指令:
系統(tǒng)實(shí)現(xiàn)要求 對于不包含系統(tǒng)級寫緩沖區(qū)的簡單設(shè)計(jì),在進(jìn)入Cortex-M3(r2p0或更高版本)、Cortex-M4、Cortex-M0+和Cortex-M0處理器的睡眠模式之前,不需要使用內(nèi)存屏障指令。這由處理器自身處理。如果內(nèi)部總線包含一個(gè)位于處理器之外的系統(tǒng)級寫緩沖區(qū),則情況就更復(fù)雜了。在這種情況下,僅使用DSB指令可能是不夠的,因?yàn)橄到y(tǒng)控制邏輯可能會(huì)在緩沖寫完成之前關(guān)閉時(shí)鐘。 時(shí)鐘信號被關(guān)閉可能不會(huì)導(dǎo)致錯(cuò)誤,這取決于系統(tǒng)級設(shè)計(jì)、使用的休眠操作以及進(jìn)入休眠模式前正在訪問的外設(shè)。建議聯(lián)系芯片供應(yīng)商或制造商獲取設(shè)備詳細(xì)信息。通??梢酝ㄟ^向?qū)懢彌_器添加一個(gè)虛擬讀操作以確保寫緩沖器被清空來解決這個(gè)問題。下圖顯示了一個(gè)可能的解決方法:
15 自啟
Cortex-M處理器具有自啟(self-reset)功能??梢酝ㄟ^AIRCR寄存器中的SYSRESETREQ位觸發(fā)系統(tǒng)復(fù)位。在CMSIS庫中,可以使用C函數(shù)NVIC_SystemReset(void)來使用這個(gè)功能。
處理器架構(gòu)要求 在自啟之前,需要使用DSB指令來確保所有未完成的傳輸都已完成,同時(shí)可以使用CPSID I關(guān)閉中斷,這個(gè)是可選的,它可以防止在自啟過程中觸發(fā)一個(gè)已啟用的中斷請求。 系統(tǒng)實(shí)現(xiàn)要求 在Cortex-M處理器上,如果沒有使用CPSID指令,DSB指令是可選的。因?yàn)閷CS的訪問已經(jīng)具有DSB屏障,在寫操作完成之前,自啟無法開始。如下圖所示: 如果使用了CPSID指令,則應(yīng)插入DSB指令,以確保CPSID在前一個(gè)傳輸完成后才執(zhí)行。這樣,如果前面的傳輸有導(dǎo)致imprecise bus fault,它會(huì)在禁用中斷之前發(fā)生。
在ARMv6-M上沒有bus fault異常,因此在Cortex-M0處理器上不可用
如果系統(tǒng)在總線級別存在寫緩沖區(qū)時(shí),可以通過在寫緩沖區(qū)中進(jìn)行虛擬讀操作來確保在執(zhí)行CPSID指令和進(jìn)行自啟之前,系統(tǒng)級別的寫緩沖區(qū)已被清空。如下圖所示: 如果你使用的是CMSIS 2.0或更高版本,則NVIC_SystemReset(void)函數(shù)已經(jīng)包含了DSB指令。
16 CONTROL寄存器
CONTROL寄存器是Cortex-M處理器中實(shí)現(xiàn)的特殊寄存器之一,它可以通過MSR和MRS指令訪問。
處理器架構(gòu)要求 從架構(gòu)上來說,在修改CONTROL寄存器后,應(yīng)使用ISB指令。 下面是一個(gè)從特權(quán)執(zhí)行切換到非特權(quán)執(zhí)行的代碼。
Cortex-M0中不支持此操作
MOVS R0, #0x1
MSR CONTROL, R0 ; Switch to non-privileged state
ISB ; Instruction Synchronization Barrier
...
ISB確保以正確的特權(quán)級別取指,如下圖所示: 我們還可以使用CONTROL寄存器來選擇在線程模式下使用哪個(gè)堆棧指針。
系統(tǒng)實(shí)現(xiàn)要求 在Cortex-M處理器中,寫入CONTROL寄存器后不執(zhí)行ISB指令不會(huì)導(dǎo)致程序錯(cuò)誤,除非你更改特權(quán)級別,且之前的權(quán)限級別已經(jīng)預(yù)取接下來的指令。當(dāng)且僅當(dāng)你需要使用正確權(quán)限級別獲取后續(xù)指令時(shí),才需要ISB指令。
17 MPU編程
MPU是Cortex-M0+、Cortex-M3和Cortex-M4處理器的可選功能。
處理器架構(gòu)要求
MPU配置寄存器位于SCS中,因此在MPU編程的每個(gè)步驟之間不需要插入內(nèi)存屏障指令強(qiáng)有序內(nèi)存不會(huì)強(qiáng)制執(zhí)行與正常內(nèi)存訪問相關(guān)的順序。 在架構(gòu)設(shè)計(jì)中,MPU編程序列之前需要執(zhí)行DMB,以及在MPU編程完成后使用DSB來確保所有設(shè)置都被所有的總線可見如果MPU設(shè)置的更改影響程序內(nèi)存,還應(yīng)添加一個(gè)ISB指令,以確保使用更新的MPU設(shè)置重新獲取指令
如果在異常處理程序中執(zhí)行MPU編程步驟,則不需要ISB指令,因?yàn)楫惓_M(jìn)入和退出邊界已經(jīng)具有ISB。例如,在運(yùn)行RTOS的應(yīng)用程序中,可以在PendSV異常處理程序內(nèi)進(jìn)行上下文切換期間更新用戶線程的MPU區(qū)域設(shè)置。在PendSV和用戶線程之間切換異常退出序列,確保MPU設(shè)置生效。這適用于當(dāng)前Cortex-M處理器的架構(gòu)行為和系統(tǒng)實(shí)現(xiàn)。
系統(tǒng)實(shí)現(xiàn)要求
在Cortex-M0+、Cortex-M3和Cortex-M4處理器上,在進(jìn)入MPU編程代碼之前省略DMB指令不會(huì)引起問題;在完成MPU編程代碼之后省略DSB指令也不會(huì)引起問題。如果對MPU設(shè)置的更改只影響保存數(shù)據(jù)的內(nèi)存而不影響保存程序內(nèi)存,則在Cortex-M處理器上不需要ISB指令。如果需要使用新的MPU設(shè)置來取后續(xù)指令,則需要ISB指令。
18 多主系統(tǒng)
如果你希望你的代碼在多個(gè)系統(tǒng)中都能正常運(yùn)行,即考慮代碼在不同架構(gòu)下的可移植性,那么使用內(nèi)存屏障指令是很有必要的。
處理器架構(gòu)要求 當(dāng)處理共享數(shù)據(jù)并且需要確保它們在內(nèi)存中的順序不被改變或混亂時(shí),需要使用DMB或DSB指令。例如,則在啟動(dòng)DMA操作之前需要使用DMB指令。
也可以使用DSB代替DMB
如果沒有DMB,在架構(gòu)上兩個(gè)存儲(chǔ)區(qū)可能會(huì)被重新排序或重疊,比如DMA可能在數(shù)據(jù)更新完成之前開始。另一個(gè)多主機(jī)示例是兩個(gè)處理器之間共享內(nèi)存中的信息通信。當(dāng)向在不同處理器上運(yùn)行的另一個(gè)程序傳遞數(shù)據(jù)時(shí),通常會(huì)將數(shù)據(jù)寫入共享內(nèi)存,然后在共享內(nèi)存中設(shè)置一個(gè)軟件標(biāo)志。在這種情況下,應(yīng)使用DMB或DSB指令來確保兩個(gè)內(nèi)存訪問之間的內(nèi)存順序正確: 兩個(gè)處理器之間的交互不限于共享內(nèi)存。另一種可能的交互方式是事件通信(如消息隊(duì)列)。在這種情況下,可能需要使用DSB指令來確保內(nèi)存?zhèn)鬏敽褪录g的正確順序被保留。
系統(tǒng)實(shí)現(xiàn)要求 在前面處理器架構(gòu)要求的前兩張圖中去掉DMB或DSB指令時(shí),并不會(huì)產(chǎn)生錯(cuò)誤,因?yàn)镃ortex-M處理器不會(huì)重新排序內(nèi)存?zhèn)鬏斍也辉试S兩個(gè)寫傳輸重疊執(zhí)行。
在Cortex-M3和Cortex-M4處理器中,處理器架構(gòu)要求中的最后一張圖需要使用DSB指令。但在Cortex-M0處理器中,省略DMB或DSB指令不會(huì)導(dǎo)致這三個(gè)示例中的任何錯(cuò)誤,因?yàn)镃ortex-M0處理器中沒有寫緩沖區(qū)。
19 信號量和互斥鎖(單核和多核)
信號量和互斥量操作在許多操作系統(tǒng)中是必不可少的。它們可以在單處理器環(huán)境或多處理器環(huán)境中使用。
在多處理器環(huán)境中,信號量操作需要將軟件變量放置在多個(gè)處理器之間共享內(nèi)存中。為了確保正確的操作,應(yīng)該使用內(nèi)存屏障指令。如果在多處理器系統(tǒng)中存在緩存,則必須確保使用正確的緩存配置,以使共享內(nèi)存中的數(shù)據(jù)在所有處理器之間一致。
處理器架構(gòu)要求 在信號量和互斥量操作中應(yīng)使用DMB指令。下面的例子展示了獲取鎖的簡單代碼,獲取鎖后需要使用DMB指令:
/* Note: __LDREXW和__STREXW是CMSIS函數(shù) */
void get_lock(volatile int *Lock_Variable)
{
int status = 0;
do {
while (__LDREXW(&Lock_Variable) != 0); // Wait until Lock_Variable is free
status = __STREXW(1, &Lock_Variable); // Try to set Lock_Variable
} while (status!=0); //retry until lock successfully
__DMB();
return;
}
同樣地,釋放鎖的代碼在開始時(shí)應(yīng)該有一個(gè)內(nèi)存屏障:
void free_lock(volatile int *Lock_Variable)
{
__DMB(); // Ensure memory operations completed before
Lock_Variable = 0;// releasing lock
return;
}
這樣做是為了避免在釋放鎖之前,由于流水線的原因,其它線程就“提前”釋放了鎖,從而可以訪問共享資源。
系統(tǒng)實(shí)現(xiàn)要求
在使用Cortex-M3和Cortex-M4處理器的微控制器設(shè)備上,在信號量和互斥操作中省略DMB指令不會(huì)導(dǎo)致錯(cuò)誤。但在下面的情況下可能會(huì)出錯(cuò):
處理器具有緩存軟件在多核系統(tǒng)中使用。
ARM建議在操作系統(tǒng)設(shè)計(jì)中的信號量和互斥操作中使用DMB指令。
Cortex-M0和Cortex-M0+處理器沒有互斥訪問的指令
20 自修改代碼
通常我們的代碼是靜態(tài)的,不能被修改。但其實(shí)允許程序在運(yùn)行時(shí)修改自己的代碼,修改之后的代碼會(huì)被立即執(zhí)行,從而改變代碼的行為。這種情況一般用于:反作弊(提高程序的復(fù)雜性和安全性)、加密和解密(提高數(shù)據(jù)安全性)。
如果程序包含自修改代碼,如果修改后的程序代碼要在修改后不久執(zhí)行,就需要使用內(nèi)存屏障。由于程序代碼可以被預(yù)取,應(yīng)該執(zhí)行DSB指令,然后執(zhí)行ISB指令以確保流水線被刷新。
處理器架構(gòu)要求 架構(gòu)需求是在修改程序內(nèi)存后使用DSB指令后緊跟一個(gè)ISB指令。
STR
DSB ; Ensure store is completed before flushing pipeline
ISB ; Flush pipeline
B
下圖顯示了滿足自修改代碼的處理器架構(gòu)和實(shí)現(xiàn)要求所需的內(nèi)存屏障指令。 如果系統(tǒng)中存在緩存,則應(yīng)該緩存刷新操作來確保更新指令緩存。
系統(tǒng)實(shí)現(xiàn)要求 總的來說,在修改程序內(nèi)存后,需要先使用DSB然后使用ISB。如果處理器或系統(tǒng)中沒有寫緩沖區(qū)或緩存,例如基于Cortex-M0的微控制器,則可以省略DSB。
Cortex-M3和Cortex-M4處理器可以預(yù)取多達(dá)六條指令。如果應(yīng)用程序在修改程序內(nèi)存中的指令后不久執(zhí)行該指令,可能會(huì)使用之前的指令。如果指令在修改后一段時(shí)間內(nèi)未使用,程序可能可以正常工作,但不能完全保證。
某些Cortex-M3和Cortex-M4設(shè)計(jì)可能具有特定于實(shí)現(xiàn)的程序緩存以加速程序存儲(chǔ)器訪問。在修改程序代碼后可能需要額外的步驟來確保程序緩存被清除。
總結(jié)
在ARM體系架構(gòu)中,內(nèi)存屏障是一種用來確保程序在多核或多線程環(huán)境下按照預(yù)期順序執(zhí)行的機(jī)制。ARM定義了三種內(nèi)存屏障指令,分別是DMB(數(shù)據(jù)內(nèi)存屏障)、DSB(數(shù)據(jù)同步屏障)和ISB(指令同步屏障)。
DMB指令用于確保內(nèi)存訪問的順序性。在多核處理器中,不同核的緩存可能會(huì)引起數(shù)據(jù)一致性的問題,DMB指令在多核之間添加屏障,確保指令的執(zhí)行順序與內(nèi)存訪問的順序一致,避免數(shù)據(jù)的讀寫亂序。
DSB指令用于確保指令的完成和數(shù)據(jù)的同步。它保證在DSB指令之前的所有指令都已經(jīng)完成執(zhí)行,然后再執(zhí)行DSB指令之后的指令。這樣可以避免指令的亂序執(zhí)行和數(shù)據(jù)的讀寫亂序,確保執(zhí)行的順序性。
ISB指令用于確保指令的同步。它會(huì)刷新所有的指令緩存和流水線,使指令序列的執(zhí)行從ISB指令之后重新開始。這樣可以保證在ISB指令之前的所有指令都已經(jīng)執(zhí)行完畢,并且清除了所有執(zhí)行過程中的緩存,使得指令的執(zhí)行結(jié)果與預(yù)期一致。
綜上所述,ARM的內(nèi)存屏障機(jī)制通過DMB/DSB/ISB指令確保程序在多核或多線程環(huán)境下的正確順序執(zhí)行。這些指令提供了內(nèi)存和指令的同步和順序性保證,保證了程序的正確性和可靠性。
關(guān)注博主即可閱讀全文
優(yōu)惠劵
tilblackout
關(guān)注
關(guān)注
2
點(diǎn)贊
踩
22
收藏
覺得還不錯(cuò)?
一鍵收藏
打賞
知道了
0
評論
ARM進(jìn)階:內(nèi)存屏障(DMB/DSB/ISB)的20個(gè)使用例子詳解
在ARM體系架構(gòu)中,內(nèi)存屏障是一種用來確保程序在多核或多線程環(huán)境下按照預(yù)期順序執(zhí)行的機(jī)制。ARM定義了三種內(nèi)存屏障指令,分別是DMB(數(shù)據(jù)內(nèi)存屏障)、DSB(數(shù)據(jù)同步屏障)和ISB(指令同步屏障)。DMB指令用于確保內(nèi)存訪問的順序性。在多核處理器中,不同核的緩存可能會(huì)引起數(shù)據(jù)一致性的問題,DMB指令在多核之間添加屏障,確保指令的執(zhí)行順序與內(nèi)存訪問的順序一致,避免數(shù)據(jù)的讀寫亂序。DSB指令用于確保指令的完成和數(shù)據(jù)的同步。它保證在DSB指令之前的所有指令都已經(jīng)完成執(zhí)行,然后再執(zhí)行DSB指令之后的指令。
復(fù)制鏈接
掃一掃
專欄目錄
【ARM Cache 系列文章 5 – 內(nèi)存屏障ISB/DSB/DMB】
CodingCos的博客
11-06
2129
舉個(gè)例子,如果dmb前后的兩次訪存指令訪問的都是同一個(gè)終點(diǎn)(比如都是ddr,或者都是spi的fifo),它在能保證兩次訪問放射順序的同時(shí),其實(shí)就能保證實(shí)際的完成順序了。DMB不能保證它前面的指令在它后面的指令之前完成,只能保證后面的指令能觀察到前面的指令執(zhí)行了(即在LSU的執(zhí)行順序是能得到保證的),可能你會(huì)問這樣的屏障有什么實(shí)際的作用呢?DMB指令保證DMB指令前后的內(nèi)存訪問指令的執(zhí)行次序,內(nèi)存訪問包括load、store、data cache維護(hù)指令, 像add指令DMB是管不到的。
美信推用于DAB/T-DMB接收的三頻段調(diào)諧器
01-19
Maxim日前推出MAX2170/MAX2171RF調(diào)諧器,可用于三頻段、雙模移動(dòng)電視和數(shù)字廣播。該器件可接收VHF頻帶III、L頻段廣播以及FM。兩個(gè)器件均設(shè)計(jì)用于接收數(shù)字音頻廣播(DAB)以及地面數(shù)字多媒體廣播(T-DMB),具有少的外部元件。低噪聲L頻段前端(3dB噪聲系數(shù))無需外部低噪聲放大器電路,從而降低了成本并縮小了尺寸。當(dāng)調(diào)諧到VHF頻率時(shí),片上跟蹤濾波器將抑制帶外干擾;該跟蹤濾波器同時(shí)也作為FM頻段選擇濾波器使用。?
?
MAX2170/MAX2171工作在2.7V至3.3V電源電壓下,在L頻段低功耗模式下消耗150mW(典型值)的功率。除了晶振和某些應(yīng)用所需的L頻段
參與評論
您還未登錄,請先
登錄
后發(fā)表或查看評論
嵌入式系統(tǒng)/ARM技術(shù)中的關(guān)于視頻壓縮技術(shù)的系統(tǒng)考慮
10-21
1? 前言
隨著信息世界的變短發(fā)展,數(shù)字視頻產(chǎn)品需求近些年出現(xiàn)猛增。主流應(yīng)用包括視頻通信、安全監(jiān)控與工業(yè)自動(dòng)化,而最熱門的要算娛樂應(yīng)用,如 DVD、HDTV、衛(wèi)星電視、高清(HD)機(jī)頂盒、因特網(wǎng)視頻流、數(shù)碼相機(jī)與 HD 攝像機(jī)、視頻光盤庫(video jukebox)、高端顯示器(LCD、等離子顯示器、DLP)以及個(gè)人攝像機(jī)等。眾多精彩的新應(yīng)用目前也處于設(shè)計(jì)或前期部署中,例如針對家庭與手持設(shè)備及地面/衛(wèi)星標(biāo)準(zhǔn)(DVB-T、DVB-H、DMB)的高清 DVD(藍(lán)光/HD-DVD)和數(shù)字視頻廣播、高清視頻電話、數(shù)碼相機(jī)以及IP機(jī)頂盒。由于手持終端計(jì)算能力的提高以及電池技術(shù)與高速無線連接的發(fā)展,
嵌入式系統(tǒng)/ARM技術(shù)中的便攜式設(shè)備的移動(dòng)電視功能實(shí)現(xiàn)方案
10-23
移動(dòng)電視俗稱手機(jī)電視。它以數(shù)字技術(shù)為支撐,通過地面或衛(wèi)星電視信號廣播、地面設(shè)備接收的方式播放和接收電視節(jié)目,目前多通過手機(jī)、多媒體播放器、車載、USB接收器等終端設(shè)備實(shí)現(xiàn)電視信號接收。它最大的特點(diǎn)是在處于移動(dòng)狀態(tài)的交通工具上保持電視信號的穩(wěn)定和清晰。移動(dòng)電視可以采用無線數(shù)字廣播電視網(wǎng)(DMB),也可以采用蜂窩移動(dòng)通信網(wǎng),甚至Wi-Fi、WiMax等。在我國,多采用DMB和蜂窩移動(dòng)通信網(wǎng)(GPRS或CDMA)。現(xiàn)在移動(dòng)電視還增加了由我國自主研發(fā)的CMMB數(shù)字移動(dòng)電視技術(shù),在2008年奧運(yùn)會(huì)期間已經(jīng)提供了相關(guān)業(yè)務(wù),系統(tǒng)采用衛(wèi)星和地面網(wǎng)絡(luò)相結(jié)合的"天地一體、星網(wǎng)結(jié)合、統(tǒng)一標(biāo)準(zhǔn)、全國漫游"方式,實(shí)現(xiàn)全
__DSB()指令的作用
missiler的博客
08-04
9780
@[TOC](__DSB() 指令的作用)
在一些ARM程序代碼中,會(huì)用到__DSB() 指令,特別是在一些中斷處理函數(shù)中。例如:
//中斷定時(shí)器PIT中斷處理函數(shù)
void PIT_LED_HANDLER(void)
{
/* Clear interrupt flag.*/
PIT_ClearStatusFlags(PIT, kPIT_Chnl_0, kPIT_TimerFlag);
pitIsrFlag = true;
__DSB();
}
程序通過中斷信號進(jìn)入中
ARM基礎(chǔ)(6):內(nèi)存屏障指令之DMB、DSB和ISB詳解
主要分享硬件、嵌入式軟件部分知識
07-30
3407
本文詳細(xì)說明了DMB、DSB和ISB三個(gè)指令的含義和使用時(shí)機(jī)。但大多數(shù)簡單處理器不會(huì)對內(nèi)存?zhèn)鬏斶M(jìn)行重新排序,因此,體系結(jié)構(gòu)的需求和處理器的實(shí)現(xiàn)需求是不同的。例如,大多數(shù)應(yīng)用程序可以在現(xiàn)有的Cortex-M處理器上正確運(yùn)行,而無需使用任何內(nèi)存屏障指令。
DBG-DMB-DSB-ISB.zip_cannotmqq_dmb dsb dsb 區(qū)別_dsb() isb()_dsb指令使用
09-19
ARM處理器匯編指令描述,DBG、DMB、DSB 和 ISB指令
__DSB()?__ISB()命令
sdut_guol的專欄
12-23
5656
__DSB()__ISB()命令
等待指令和數(shù)據(jù)同步,例如*ocramAddr = 0xCCU;執(zhí)行完成后,實(shí)際單片機(jī)可能還未完成執(zhí)行,使用__DSB()__ISB()命令可以確保該行代碼執(zhí)行完成
static void OCRAM_Access(void)
{
uint32_t *ocramAddr = (uint32_t *)APP_FLEXRAM_OCRAM_START_ADDR;
/* enable FLEXRAM OCRAM access error interrupt..
指令隔離DMB,DSB,ISB
leekay123的博客
12-05
3178
像ARM7TDMI這樣經(jīng)典的ARM處理器會(huì)按照程序的順序來執(zhí)行指令或訪問數(shù)據(jù)。而最新的ARM處理器會(huì)對執(zhí)行指令和訪問數(shù)據(jù)的順序進(jìn)行優(yōu)化。舉個(gè)例子,ARM v6/v7的處理器會(huì)對以下指令順序進(jìn)行優(yōu)化。
?
LDR r0, [r1] ; 從普通/可Cache的內(nèi)存中讀取,并導(dǎo)致cache未命中STR r2, [r3] ; 寫入普通/不可Cache的內(nèi)存
?
假設(shè)第一條LDR...
DSB,ISB,DMB指令
IC_SOC_ARM
03-02
1602
DBG、DMB、DSB 和 ISB調(diào)試指令、數(shù)據(jù)內(nèi)存屏障指令、數(shù)據(jù)同步屏障指令和指令同步屏障指令。語法DBG{cond} {#option}DMB{cond} {option}DSB{cond} {option}ISB{cond} {option}其中:cond
是一個(gè)可選的條件代碼(請參閱條件執(zhí)行)。option
對提示操作的可選限制。用法這些是提示指令。 是否實(shí)現(xiàn)這些指令是可選的。 只要其中
卓勝微電子發(fā)布DAB/T-DMB解調(diào)芯片MXD0120
11-27
卓勝微電子日前推出一款基于DAB/T-DMB標(biāo)準(zhǔn)的移動(dòng)數(shù)字電視解調(diào)芯片MXD0120。功耗和面積是移動(dòng)設(shè)備最重視的關(guān)鍵指標(biāo),采用功耗低,面積小的芯片意味著移動(dòng)設(shè)備可以更小巧,可連續(xù)觀看更長時(shí)間的電視節(jié)目。該芯片能夠...
RAM匯編指令DMB、DSB、ISB、SEV等
u013073067的博客
04-15
1萬+
最近用keil調(diào)試STM32時(shí),在代碼中遇到了一些匯編指令,如DMB、DSB、ISB、SEV,現(xiàn)總結(jié)如下:
DMB、DSB、ISB、SEV等指令都屬于RAM匯編指令,在《ARM Cortex-M0權(quán)威指南》和《ARM Cortex-M3權(quán)威指南》中,都有這些指令。讀者可以參考這兩本書的附錄部分。其他RAM系列的權(quán)威指南應(yīng)該也有這些指令,我這里只有這兩本權(quán)威指南,用到其他系列時(shí),讀者可自行查證。
...
AM、FM、DSB、SSB、ISB信號及其頻譜
熱門推薦
流水燈
01-10
2萬+
代碼:https://github.com/LHesperus/signal-processing/tree/master/Modulated%20signal
AM信號及其頻譜
FM信號及其頻譜
DSB信號及其頻譜
SSB信號及其頻譜
ISB信號及其頻譜
...
【STM32】IAR配置Cortex-M0的APP程序中斷向量
u010440719的博客
10-27
1274
IAR配置Cortex-M0的APP程序中斷向量1. 定義APP起始地址2. 重映射中斷向量表3. 配置工程Linker信息4. 定義Bin文件信息地址5. 驗(yàn)證Bin文件信息正確性6. 結(jié)束語友情鏈接(第1篇文章,誠摯感謝?。?/p>
1. 定義APP起始地址
根據(jù)MCU的Flash空間大小,以及IAP、APP程序大小合理分配Flash空間,下面以STM32F091單片機(jī)為例:
IAP程序地址: 0x08000000 ~ 0x08004FFF (20k)
APP程序地址:0x08005000 ~ 0x080127
一、barrier指令DSB,DMB,ISB,fence——內(nèi)存屏障,指令屏障
iot_aaker的博客
12-23
7995
最近工作中遇到一個(gè)問題,大致描述一下:
我們SOC用的arm cortex m7內(nèi)核,在設(shè)計(jì)時(shí)設(shè)計(jì)人員圖方便,將SPI controller的寄存器(即原本應(yīng)該是APB空間)放在了0x60000000的某一塊空間(此空間arm的memory定義區(qū)間為external memory),然后同時(shí)把SPI flash的存儲(chǔ)空間也映射在了0x60000000的這一塊區(qū)間內(nèi)。后者將spi flash memory映射在此區(qū)間內(nèi)其實(shí)時(shí)合理的。但是將spi controller的寄存器也放在這塊空間,驗(yàn)...
ARM 匯編特殊操作指令
devilzcl的博客
04-23
675
一、操作 CP15 協(xié)處理器
【例】:MRC p15, 0, r0, c0, c0, 0 // 將 CP15 中 c0 寄存器的值讀取到 r0 寄存器
MRC:將 CP15 協(xié)處理器中的寄存器數(shù)據(jù)讀到 ARM 寄存器中
MCR:將 ARM 寄存器的數(shù)據(jù)寫入到 CP15 協(xié)處理器寄存器中
CP15 協(xié)處理器的訪問通過如下指令完成:
opc1 : 協(xié)處理器要執(zhí)行的操作碼
Rt : A...
DBG、DMB、DSB 和 ISB
鄧永堅(jiān)的blog
07-27
2531
調(diào)試指令、數(shù)據(jù)內(nèi)存屏障指令、數(shù)據(jù)同步屏障指令和指令同步屏障指令。
DBG
調(diào)試提示可向調(diào)試系統(tǒng)及其相關(guān)系統(tǒng)發(fā)送提示。 有關(guān)這些系統(tǒng)如何使用此指令的信息,請參這些系統(tǒng)的文檔。
DMB
數(shù)據(jù)內(nèi)存屏障可作為內(nèi)存屏障使用。 它可確保會(huì)先檢測到程序中位于?DMB?指令前的所有顯式內(nèi)存訪問指令,然后再檢測到程序中位于DMB?指令后的顯式內(nèi)存訪問指令。它不影響其他指令
ARM內(nèi)存屏障指令(DMB,DSB,ISB)
propor的專欄
06-14
913
ARM,內(nèi)存屏障指令
鴻蒙Harmony應(yīng)用開發(fā)—ArkTS聲明式開發(fā)(通用屬性:形狀裁剪)
最新發(fā)布
m0_64420071的博客
03-02
891
ArkTS聲明式開發(fā)(通用屬性:形狀裁剪)
DSB, DMB, ISB
11-04
DSB、DMB和ISB是ARM處理器中的三種同步指令。它們的作用分別是:
- DSB(Data Synchronization Barrier):強(qiáng)制CPU等待它之前的所有指令執(zhí)行完畢,確保所有內(nèi)存訪問都已完成。
- DMB(Data Memory Barrier):確保所有在DMB指令之前的內(nèi)存訪問都已完成,然后才能執(zhí)行DMB指令之后的內(nèi)存訪問。
- ISB(Instruction Synchronization Barrier):清空處理器流水線,確保ISB指令之后的所有指令都從緩存或內(nèi)存中重新獲取,以避免指令重排等問題。
這三種同步指令在ARM處理器中都有重要的作用,可以保證程序的正確性和穩(wěn)定性。
“相關(guān)推薦”對你有幫助么?
非常沒幫助
沒幫助
一般
有幫助
非常有幫助
提交
tilblackout
CSDN認(rèn)證博客專家
CSDN認(rèn)證企業(yè)博客
碼齡7年
嵌入式領(lǐng)域優(yōu)質(zhì)創(chuàng)作者
152
原創(chuàng)
1376
周排名
8935
總排名
33萬+
訪問
等級
2776
積分
7091
粉絲
781
獲贊
119
評論
2816
收藏
私信
關(guān)注
熱門文章
死區(qū)時(shí)間的分析與設(shè)置
17658
Git合并操作之merge、rebase、squash詳解
15376
LVGL學(xué)習(xí)(3):頁面切換原理和頁面管理實(shí)現(xiàn)
9370
BLE學(xué)習(xí)(2):廣播包報(bào)文格式詳解
8757
C語言正余弦函數(shù)定點(diǎn)查表算法原理及實(shí)現(xiàn)
8170
分類專欄
嵌入式硬件
1篇
嵌入式Linux
14篇
LVGL
6篇
嵌入式
23篇
ARM
20篇
RT1170
11篇
Linux
6篇
RTOS
4篇
網(wǎng)絡(luò)編程
13篇
git
3篇
C++
10篇
Peripheral
6篇
BLE
6篇
algorithm
6篇
FOC
7篇
LwIP
4篇
模擬電路
4篇
最新評論
ARM基礎(chǔ)(6):內(nèi)存屏障指令之DMB、DSB和ISB詳解
anglaberber:
寫的真不錯(cuò)
OpenCV NAO機(jī)器人輔助撿球丟球
A870994:
作者有g(shù)it倉庫嗎 能看一下代碼嗎
LVGL學(xué)習(xí)(3):頁面切換原理和頁面管理實(shí)現(xiàn)
tilblackout:
網(wǎng)上找了個(gè)可以運(yùn)行的codeblocks LVGL工程,把沒用的代碼刪了,然后按照GUI GUIDER的代碼結(jié)構(gòu)修改了一下,后面就只需要往工程里添加一下文件就行了。
LVGL學(xué)習(xí)(3):頁面切換原理和頁面管理實(shí)現(xiàn)
ceh0315:
大佬,我看你用的nxp的guider,這個(gè)是怎么移植到codeblocks上的啊?我之前畫了一個(gè)界面,始終移植不上去,現(xiàn)在只能用lvgl手搓
CORDIC算法 arctan反正切計(jì)算原理及C語言定點(diǎn)實(shí)現(xiàn)
tilblackout:
代碼肯定沒有錯(cuò),我已經(jīng)用于FOC算法跑過了。輸入的數(shù)據(jù)要是標(biāo)幺值,輸出的也是對應(yīng)的標(biāo)幺值。
您愿意向朋友推薦“博客詳情頁”嗎?
強(qiáng)烈不推薦
不推薦
一般般
推薦
強(qiáng)烈推薦
提交
最新文章
嵌入式硬件設(shè)計(jì)實(shí)例:基于STM32的流水燈原理圖和PCB設(shè)計(jì)
Linux內(nèi)核學(xué)習(xí)(1):目錄結(jié)構(gòu)、配置、編譯和常用Shell命令
U-Boot學(xué)習(xí)(7):內(nèi)核啟動(dòng)之bootz啟動(dòng)zImage源碼分析
2024年12篇
2023年75篇
2022年43篇
2021年19篇
2020年4篇
目錄
目錄
分類專欄
嵌入式硬件
1篇
嵌入式Linux
14篇
LVGL
6篇
嵌入式
23篇
ARM
20篇
RT1170
11篇
Linux
6篇
RTOS
4篇
網(wǎng)絡(luò)編程
13篇
git
3篇
C++
10篇
Peripheral
6篇
BLE
6篇
algorithm
6篇
FOC
7篇
LwIP
4篇
模擬電路
4篇
目錄
評論
被折疊的??條評論
為什么被折疊?
到【灌水樂園】發(fā)言
查看更多評論
添加紅包
祝福語
請?zhí)顚懠t包祝福語或標(biāo)題
紅包數(shù)量
個(gè)
紅包個(gè)數(shù)最小為10個(gè)
紅包總金額
元
紅包金額最低5元
余額支付
當(dāng)前余額3.43元
前往充值 >
需支付:10.00元
取消
確定
下一步
知道了
成就一億技術(shù)人!
領(lǐng)取后你會(huì)自動(dòng)成為博主和紅包主的粉絲
規(guī)則
hope_wisdom 發(fā)出的紅包
打賞作者
tilblackout
你的鼓勵(lì)將是我創(chuàng)作的最大動(dòng)力
¥1
¥2
¥4
¥6
¥10
¥20
掃碼支付:¥1
獲取中
掃碼支付
您的余額不足,請更換掃碼支付或充值
打賞作者
實(shí)付元
使用余額支付
點(diǎn)擊重新獲取
掃碼支付
錢包余額
0
抵扣說明:
1.余額是錢包充值的虛擬貨幣,按照1:1的比例進(jìn)行支付金額的抵扣。 2.余額無法直接購買下載,可以購買VIP、付費(fèi)專欄及課程。
余額充值
DMB(數(shù)字多媒體廣播)_百度百科
Beta
進(jìn)入詞條
清除歷史記錄關(guān)閉
DMB是一個(gè)多義詞,請?jiān)谙铝辛x項(xiàng)上選擇瀏覽(共2個(gè)義項(xiàng))
?化工產(chǎn)品
?數(shù)字多媒體廣播
反饋
分享
複製鏈接
請複製以下鏈接發(fā)送給好友
https://baike.baidu.hk/item/DMB/922874
複製
複製成功
DMB
(數(shù)字多媒體廣播)
鎖定
DMB全稱為數(shù)字多媒體廣播(Digital Multimedia Broadcasting),是在數(shù)字音頻廣播DAB(Digital Audio Broadcasting)基礎(chǔ)上發(fā)展起來的面向未來的新一代廣播系統(tǒng)。在第三代廣播-DAB廣播已將傳統(tǒng)AM、FM摸擬廣播聲音質(zhì)量提高至CD級別的基礎(chǔ)上,DMB又將單一的聲音廣播業(yè)務(wù)推向了多媒體領(lǐng)域:即在發(fā)送高質(zhì)量聲音節(jié)目的同時(shí),還提供了影視娛樂節(jié)目、智能交通導(dǎo)航、電子報(bào)紙雜誌、金融股市信息、互連網(wǎng)信息、城市綜合信息等可視數(shù)據(jù)業(yè)務(wù),廣泛應(yīng)用在公交車、出租車、輕軌、地鐵、火車、輪渡、機(jī)場及各種流動(dòng)人羣等移動(dòng)載體上或家庭、辦公室裏。
中文名
數(shù)字多媒體廣播
外文名
Digital Multimedia Broadcasting
英文簡稱
DMB
類????別
廣播系統(tǒng)
目錄
1
簡介
2
程序特點(diǎn)
3
主要優(yōu)點(diǎn)
4
編碼方式
5
傳輸途徑
6
潛在市場
DMB簡介
目前世界上DAB系統(tǒng)的發(fā)展大致可分為,歐規(guī)Eureka-147、美國IBOC(In-Band On-Channel)及法國DRM(Digital Radio Mondiale),還有部份國家自行發(fā)展的DAB系統(tǒng),而我國採用的為歐規(guī)Eureka-147系統(tǒng)(Eureka 147譯為尤里卡147)。注:尤里卡是歐洲國家共同組成的一個(gè)技術(shù)研究合作團(tuán)體的組織名稱,該技術(shù)團(tuán)體多年來一直從事多種技術(shù)項(xiàng)目的開發(fā)工作。在“尤里卡”組織的龐大技術(shù)開發(fā)項(xiàng)目中,DAB項(xiàng)目的初始化開發(fā),被列名為第147項(xiàng)。因此,DAB項(xiàng)目又被人們習(xí)慣稱為“尤里卡147”計(jì)劃。從事該項(xiàng)計(jì)劃的人員來自不同國家的廣播業(yè)、網(wǎng)絡(luò)運(yùn)營商,家用電器電子生產(chǎn)商和研究院校等。經(jīng)過各方面的共同努力,“尤里卡147”計(jì)劃發(fā)展至今,已經(jīng)形成和頒佈了一系列完整的DAB技術(shù)標(biāo)準(zhǔn),它正在不斷地更新和被世界範(fàn)圍內(nèi)採納和推廣應(yīng)用。
[1]?
DMB程序特點(diǎn)
DMB廣播最突出的優(yōu)點(diǎn)在於它是一種數(shù)字廣播,可以實(shí)現(xiàn)高質(zhì)量的數(shù)據(jù)傳輸(DVD質(zhì)量的視頻、CD質(zhì)量的音頻)。這是因?yàn)樗鼘⒏鞣N信號在數(shù)字狀態(tài)下進(jìn)行各種編碼、調(diào)製、傳遞等處理,不僅可以方便地進(jìn)行各種數(shù)值運(yùn)算及各種邏輯編碼運(yùn)算,而且由於數(shù)字信號在進(jìn)行各種處理過程中,只有“1”和“0”兩種狀態(tài),所以傳遞媒介自身的特徵,包括噪聲、非線形失真等,均不能改變數(shù)字信號的品質(zhì);另外,作為一種數(shù)字廣播,它還有著很高的功率效率(發(fā)射功率降低很多,節(jié)約能源、降低DMB建臺(tái)費(fèi)用)、頻譜效率(比如一個(gè)電視頻道8MHz帶寬裏,可安排24套節(jié)目)等優(yōu)點(diǎn)。DMB廣播另一個(gè)突出的優(yōu)點(diǎn)是可在高速移動(dòng)環(huán)境下穩(wěn)定地提供數(shù)據(jù)、文字、圖形與視頻等多元化服務(wù)。早在十年前DAB開始制定時(shí),就以200公里小時(shí)的需求為主要目標(biāo),在COFDM技術(shù)的基礎(chǔ)上,採用了時(shí)間交織和分等級防錯(cuò)保護(hù)等技術(shù),使得DAB具有抗多徑干擾/快速衰落以及移動(dòng)接收能力強(qiáng),數(shù)據(jù)傳送能力高的特點(diǎn)。換句話説,DAB首先就是為手持移動(dòng)而生,它的移動(dòng)特性幾乎達(dá)到了完美的境地。
[1]?
DMB主要優(yōu)點(diǎn)
相對於傳統(tǒng)的模擬廣播DAB系統(tǒng),其主要優(yōu)點(diǎn)是:1.不論固定、便攜或移動(dòng)接收,DAB都能提供CD的接收質(zhì)量。在行駛的汽車經(jīng)常遇到的信號衰落已不復(fù)存在。對於固定接收而言,不必使用定向的室外天線;移動(dòng)和便攜接收使用拉桿就足夠了。2.接收機(jī)操作方便、簡單,拋棄了現(xiàn)今採用的繁瑣的頻率尋找,而只是在接收機(jī)輸入一個(gè)“節(jié)目號數(shù)”。3.節(jié)目的附加信息,例如音樂/語言發(fā)射的識別以及節(jié)目類型等信息的傳送都是可能的。4.DAB可實(shí)現(xiàn)可變的動(dòng)態(tài)控制,可以與實(shí)現(xiàn)的監(jiān)聽條件相適應(yīng)——無論在汽車、居室還是在室外,接收機(jī)可自動(dòng)調(diào)整最佳聆聽的信號動(dòng)態(tài),使之與周圍環(huán)境相適應(yīng)。5.傳送聲音廣播節(jié)目的同時(shí),DAB的數(shù)據(jù)信道有能力提供來傳送其它的附加信息,例如交通廣播信息、交通誘導(dǎo)系統(tǒng)或?qū)灱s的用戶羣的數(shù)據(jù)傳輸。6.對於廣播機(jī)構(gòu)來説,DAB的優(yōu)點(diǎn)在於,在同步網(wǎng)運(yùn)行時(shí),可以非常經(jīng)濟(jì)地利用頻譜。用數(shù)字同步網(wǎng),可以傳輸?shù)墓?jié)目套數(shù)為FM系統(tǒng)的大約3倍是可能的。數(shù)字多媒體廣播(DMB)是從數(shù)字音頻廣播的基礎(chǔ)上發(fā)展而來的,是一種無線高速信息傳輸技術(shù),它充分地利用了DAB(digital audio broadcasting:數(shù)字音頻廣播)技術(shù)優(yōu)勢(能在高速移動(dòng)環(huán)境下可靠接收信號),在功能上將傳輸單一的音頻信息擴(kuò)展為數(shù)據(jù)、文字、圖形與視頻等多種載體,它代表著廣播電視的發(fā)展方向,為廣播電視大眾傳播、小眾傳播、個(gè)人傳播的多元化服務(wù)創(chuàng)造了一個(gè)優(yōu)良的平臺(tái)。隨著技術(shù)的成熟,特別是接收機(jī)功能的完善,價(jià)格的下降,有力地促進(jìn)了DMB的發(fā)展,廣東已經(jīng)完成了從DAB向DMB的技術(shù)過渡,並在珠江三角洲成功進(jìn)行了DMB試播。DMB嶄新的技術(shù)優(yōu)勢,已受到社會(huì)各界特別是廣大消費(fèi)者的關(guān)注,逐步展現(xiàn)出廣闊的市場應(yīng)用前景。將DMB形成產(chǎn)業(yè),推向市場,服務(wù)於民眾,是我們的當(dāng)務(wù)之急。DMB是一項(xiàng)系統(tǒng)工程,它的推廣應(yīng)用決不是單靠廣播電視部門與設(shè)備製造部門所能勝任的,必須得到各級政府的支持,聯(lián)合社會(huì)相關(guān)部門的力量,建立新型高效的營運(yùn)機(jī)制,才能儘快地把DMB推向市場,形成新的經(jīng)濟(jì)增長點(diǎn)。同廣電其它行業(yè)一樣,DMB產(chǎn)業(yè)可分兩大部份,即信息網(wǎng)絡(luò)覆蓋與接收機(jī)產(chǎn)業(yè),兩者緊密相連,缺一不可。接收機(jī)產(chǎn)業(yè)在我國尚處於空白,是因?yàn)橛脩糍I了接收機(jī),接收不到信號而等於買了一堆“廢鐵”。因此信息網(wǎng)絡(luò)覆蓋業(yè)要先走一步來帶動(dòng)接收機(jī)的消費(fèi),培育接收機(jī)產(chǎn)業(yè)市場。
[2]?
DMB編碼方式
DMB廣播系統(tǒng)對信息源的音頻部分一般採用AAC、WMA.9格式的編碼,通常使用80kbps-128kbps的帶寬即可滿足DAB立體聲節(jié)目的收聽要求;視頻部分採用MPEG-4(或者H.264)格式的編碼,通常使用用650kbps的位速率即可滿足公交車上安裝15寸-20寸屏幕收看的要求,用300kbps的位速率即可滿足小車安裝9寸以下屏幕或PDA等設(shè)備收看的要求;數(shù)據(jù)類編碼為授權(quán)接收,CA加在源編碼內(nèi)。
[1]?
DMB傳輸途徑
DMB技術(shù)按照傳輸途徑可分為四類:有線傳輸、地面微波傳輸送(DMB-Terrestrial)、衞星傳輸(DMB-Satellite)和衞星地面混合傳輸。這四種數(shù)字傳輸途徑的信源編碼方式相同,都是MPEG的複用數(shù)據(jù)包,但是其信道編碼採用了不同的調(diào)製方式。其中有線傳輸技術(shù)適合固定場所的接收,如家庭等,不具備移動(dòng)媒體特徵,不能應(yīng)用於MP4/PMP、手機(jī)及其他便攜設(shè)備。地面波DMB和衞星DMB支持MP4/PMP、手機(jī)及其他便攜設(shè)備的移動(dòng)傳輸。地面波DMB是由中心控制枱將信號送到發(fā)射臺(tái),再由發(fā)射臺(tái)將信號放大發(fā)射,用戶直接接收。經(jīng)國家廣電總局批準(zhǔn),廣東與上海、北京在對移動(dòng)多媒體技術(shù)進(jìn)行試驗(yàn)的基礎(chǔ)上,將率先開通DMB電視試商用業(yè)務(wù)。目前廣東省已有廣州、佛山、中山五桂山三個(gè)發(fā)射臺(tái),整個(gè)網(wǎng)絡(luò)將覆蓋廣東全省,按照計(jì)劃在今年5月就推出商業(yè)性DMB服務(wù);北京也計(jì)劃在5月推出商業(yè)性服務(wù),將覆蓋大約1,500萬用戶。衞星DMB在韓國日本發(fā)展比較快,目前已經(jīng)開始商業(yè)運(yùn)營。節(jié)目內(nèi)容提供商為DMB中心提供節(jié)目,後者向?yàn)橐苿?dòng)廣播專門定製的DMB專用衞星傳輸內(nèi)容信息,各種移動(dòng)終端接收衞星廣播中心發(fā)送的信號;在城市樓羣密集的屏蔽地帶,通過中繼器(Gap-filler),使各種設(shè)備能正常接收發(fā)送信號。與地面波DMB和有線傳輸技術(shù)相比,它可以適應(yīng)更大範(fàn)圍的覆蓋要求,不受地面網(wǎng)絡(luò)的限制,具有傳輸節(jié)目量大、節(jié)目畫質(zhì)、音質(zhì)更佳的特點(diǎn),是一種高效﹑廉價(jià)的傳輸方式。現(xiàn)在公交車,地鐵安裝顯示器收的是dmb,有許多臺(tái)可開展的服務(wù)內(nèi)容。
[1]?
音頻廣播業(yè)務(wù)DMB的多媒體特性將會(huì)打破當(dāng)前傳統(tǒng)廣播節(jié)目單一聲音業(yè)務(wù)的模式。廣播節(jié)目在播出聲音的同時(shí),還能夠傳送與節(jié)目相關(guān)的圖文信息,如主持人的資料、圖片、歌曲的背景資料和節(jié)目預(yù)告等等,從而為聽眾提供了聲音以外的視覺效果。DMB技術(shù)優(yōu)異的音頻效果及其附屬功能的應(yīng)用,將會(huì)成為今後廣播節(jié)目形式的主流,一旦接收機(jī)的價(jià)格接近大眾的經(jīng)濟(jì)承受能力,DMB將逐漸取代傳統(tǒng)的AM、FM廣播,佔(zhàn)領(lǐng)巨大的音頻服務(wù)市場,廣播業(yè)者也將因此獲得巨大的利益。但是現(xiàn)在成本過高,價(jià)格遠(yuǎn)遠(yuǎn)高於傳統(tǒng)AM-FM收音機(jī)。他的市場推廣還需要一段時(shí)間。
[2]?
視頻業(yè)務(wù)2001年的5月,廣州已經(jīng)成功地進(jìn)行了採用DMB技術(shù)在1.5MHz的帶寬內(nèi)傳輸電視節(jié)目,經(jīng)高速移動(dòng)接收測試,聲音和圖象質(zhì)量接近SDTV(標(biāo)準(zhǔn)清晰度電視)的水平。DMB的移動(dòng)接收電視功能,可以為在城市或郊外處於移動(dòng)或靜止?fàn)顟B(tài)中的人羣提供與現(xiàn)有模擬電視圖象質(zhì)量相當(dāng)?shù)膶?shí)時(shí)新聞、大型活動(dòng)直播、各類信息和MTV等的影視娛樂節(jié)目服務(wù),從而突破電視只能固定接收的層面,並且頻帶佔(zhàn)用率只是模擬電視的四分之一。這種新的電視廣播方式,將開拓出高速移動(dòng)接收標(biāo)準(zhǔn)清晰度電視節(jié)目的市場,為地面電視廣播開闢新的選徑。
[2]?
交通導(dǎo)航DMB提供的城鄉(xiāng)電子地圖、實(shí)時(shí)路面交通情況和圖文車輛調(diào)度信息等,可以為駕駛?cè)耸刻峁┙煌▽?dǎo)航服務(wù),開發(fā)交通信息服務(wù)市場。廣東省珠江三角洲地區(qū)有上百萬輛汽車,其中約有十萬臺(tái)出租車,另外,還有移動(dòng)的船隻、列車和每天進(jìn)出港澳地區(qū)的流動(dòng)車輛,這些都是DMB的服務(wù)對象。
[2]?
金融股市DMB傳送的實(shí)時(shí)股票行情信息、金融信息和經(jīng)濟(jì)信息,以其聲音和圖文並茂、高傳送速率和大信息量的優(yōu)勢壓倒傳統(tǒng)的經(jīng)濟(jì)信息手呼機(jī)和移動(dòng)電話市場,為戶外的移動(dòng)用戶提供經(jīng)濟(jì)信息服務(wù)。
[2]?
Internet下載採用DMB卡式電路板,移動(dòng)計(jì)算機(jī)可以在固定或移動(dòng)環(huán)境下接收到DMB的信號。由於DMB還可以提供互聯(lián)網(wǎng)下載式的單向傳輸服務(wù),所以用戶可以在移動(dòng)的狀態(tài)下接收互聯(lián)網(wǎng)的網(wǎng)絡(luò)信息。
[2]?
DMB潛在市場
1.可能的應(yīng)用羣體(1)移動(dòng)接收羣體DMB的優(yōu)勢在於可以在地面高速移動(dòng)的狀態(tài)下高質(zhì)量地接收音、視[頻節(jié)目和數(shù)據(jù)信息。因此,眾多交通工具的使用者、戶外活動(dòng)者將是DMB的移動(dòng)用戶羣體。(2)固定接收羣體DMB信息不但可以移動(dòng)接收,而且可以在室內(nèi)外的固定場合採用移動(dòng)式或固定式接收機(jī)、PC機(jī)等高質(zhì)量接收。因此,廣大廣播電視和各種數(shù)據(jù)信息的傳統(tǒng)固定用戶也是DMB的用戶羣體。
[2]?
參考資料
1.
??
觀察:誘人的大蛋糕 DMB數(shù)字多媒體廣播 ?
.太平洋電腦網(wǎng).2006-08-18[引用日期2012-09-18]
2.
??
數(shù)字多媒體廣播(DMB)簡介?
.中國廣州網(wǎng).2005-08-06[引用日期2012-09-18]
圖集
DMB的概述圖(1張)
詞條統(tǒng)計(jì)
瀏覽次數(shù):次
編輯次數(shù):30次歷史版本
最近更新:
楊家將1206
(2022-03-09)
1
簡介
2
程序特點(diǎn)
3
主要優(yōu)點(diǎn)
4
編碼方式
5
傳輸途徑
6
潛在市場
百科協(xié)議????隱私協(xié)議????意見反饋
Beta
進(jìn)入詞條
清除歷史記錄關(guān)閉
反饋
登錄
二苯甲酰基甲烷(DMB)_化工百科
化工百科
首頁
產(chǎn)品供應(yīng)商后臺(tái)
了解會(huì)員服務(wù)
登陸
免費(fèi)注冊
搜供應(yīng)商
搜百科
二苯甲?;淄?DMB) 購買咨詢
二苯甲酰甲烷(Dibenzoylmethane)
CAS: 120-46-7
化學(xué)式: C15H12O2
主頁 產(chǎn)品其他催化劑與配體 二苯甲酰基甲烷(DMB)
二苯甲酰甲烷,化學(xué)式為C17H14O,是一種有機(jī)化合物。以下是關(guān)于二苯甲酰甲烷的性質(zhì)、用途、制法和安全信息的介紹:
性質(zhì):
- 外觀:白色結(jié)晶粉末或結(jié)晶體。
- 溶解性:不溶于水,可溶于有機(jī)溶劑如乙醇、苯等。
- 熔點(diǎn):約105-106℃。
- 穩(wěn)定性:穩(wěn)定,但遇強(qiáng)氧化劑會(huì)發(fā)生反應(yīng)。
用途:
- 二苯甲酰甲烷是一種常用的熒光染料,在化學(xué)分析、生物醫(yī)學(xué)研究和熒光顯微鏡觀察等領(lǐng)域得到廣泛應(yīng)用。
- 它也用作染料和指示劑,可用于染色紡織品、染色砂石等。
制法:
- 二苯甲酰甲烷可通過二苯甲酮和苯甲醛反應(yīng)制得。反應(yīng)過程中,將二苯甲酮和苯甲醛在酸性條件下加熱,反應(yīng)生成二苯甲酰甲烷。
安全信息:
- 二苯甲酰甲烷對眼睛和皮膚有刺激作用,接觸后應(yīng)立即用大量水沖洗。使用時(shí)應(yīng)佩戴適當(dāng)?shù)姆雷o(hù)手套和眼鏡。
- 在儲(chǔ)存和使用時(shí)要避免與強(qiáng)氧化劑接觸,以免引起危險(xiǎn)反應(yīng)。
- 建議儲(chǔ)存在陰涼、干燥的地方,遠(yuǎn)離火源和易燃物質(zhì)。
最后更新:2023-12-21 00:21:33
中文名 二苯甲酰甲烷英文名 Dibenzoylmethane別名 二苯甲酰甲烷二苯甲醯甲烷二苯甲?;淄棣?苯甲?;揭彝?,3-二苯基丙二酮二苯甲酰基甲烷(DBM)二苯甲?;淄?DMB)1,3-二苯基丙二酮 DBM1,3-二苯基-1,3-丙二酮英文別名 DBMDppd-Hrhodiastab83Dibenzoylmethanephenylphenacylketone1,3-DiphenylpropanedionePhenyl-hydroxystyrylketone1,3-diphenyl-3-propanedione1,3-Diphenyl-1,3-propanedione,3-Diphenyl-propane-1,3-dione1,3-Diphenylpropane-1,3-dione1,3-Diphenyl-1,3-propanediamine(2Z)-3-hydroxy-1,3-diphenylprop-2-en-1-oneCAS 120-46-7EINECS 204-398-9化學(xué)式 C15H12O2分子量 224.25InChI InChI=1/C15H12O2/c16-14(12-7-3-1-4-8-12)11-15(17)13-9-5-2-6-10-13/h1-11,16H/b14-11-InChIKey NZZIMKJIVMHWJC-UHFFFAOYSA-N密度 0.800 g/cm3熔點(diǎn) 77-79°C(lit.)沸點(diǎn) 219-221°C18mm Hg(lit.)閃點(diǎn) 219-221°C/18mm水溶性 It is Soluble in ether, chloroform, and aqueous sodium hydroxide. Insoluble in water.蒸汽壓 0.01Pa at 20℃溶解度 氯仿 (微溶) 、甲醇 (微溶,超聲處理) 折射率 1.6600 (estimate)酸度系數(shù) 8.95±0.10(Predicted)存儲(chǔ)條件 Store below +30°C.穩(wěn)定性 穩(wěn)定。與強(qiáng)氧化劑不相容。外觀 晶體顏色 Light yellow to yellowMerck 14,3009BRN 514910物化性質(zhì) 無色斜方形片狀結(jié)晶。熔點(diǎn)81℃,沸點(diǎn)219℃(2.4kPa)。易溶于氯醇、氯仿,能溶于氫氧化鈉溶液,不溶于碳酸鈉溶液,極微溶于水。MDL號 MFCD00003085體外研究 Dibenzoylmethane (10, 20, 30, 40, 50 μM; 6 hours) treatment concentration-dependently increases the mRNA level of HO-1 but has no effect on the mRNA level of Nrf2 in HepG2 cells. Dibenzoylmethane induces HO-1 and Nrf2 protein expression, and the induction diminishes after 12 h. Dibenzoylmethane (10, 20, 30, 40, 50 μM; 2 hours) concentration-dependently increases the phosphorylated protein levels of Erk1/2, p38MAPK, JNK, AMPK, and Akt in HepG2 cells. Dibenzoylmethane does not show significant cytotoxicity. 體內(nèi)研究 Dibenzoylmethane (200, 500 mg/kg/day; ip; for three consecutive days) pretreatment significantly reduces both the area and the severity of necrosis, as well as the leukocyte infiltration, at a dose of 200 mg/kg in wild-type and Nrf2 knockout mice. Dibenzoylmethane protectes against CCl4-induced (1:49,v/v, 10 ml/kg) liver damage in wild-type mice. 危險(xiǎn)品標(biāo)志 Xi - 刺激性物品
風(fēng)險(xiǎn)術(shù)語 36/37/38 - 刺激眼睛、呼吸系統(tǒng)和皮膚。
安全術(shù)語 S22 - 切勿吸入粉塵。
S24/25 - 避免與皮膚和眼睛接觸。
WGK Germany 3RTECS TZ1930000TSCA Yes海關(guān)編號 29143900Hazard Note Irritant下游產(chǎn)品 3,5-二苯基吡唑 1,2-雙(對甲苯基磺?;?肼
二苯甲?;淄?DMB) - 介紹易溶于氯醇、氯仿,能溶于氫氧化鈉溶液,不溶于碳酸鈉溶液,極微溶于水。最后更新:2022-10-16 17:12:33
查看二苯甲?;淄?DMB)結(jié)構(gòu)式
供應(yīng)商列表
山東西亞化學(xué)有限公司現(xiàn)貨供應(yīng)產(chǎn)品名: 二苯甲酰甲烷
購買
詢盤CAS: 120-46-7產(chǎn)地: 山東包裝: 100g,25g,500g規(guī)格: ≥99.0% AR|≥98.0% (GC)|≥98.0% (GC)價(jià)格: 145.00,53.00,286.00庫存: 現(xiàn)貨電話: 400-990-3999手機(jī): 13395399280電子郵件: [email protected]: 1903368307 微信: 13355009207 前衍化學(xué)科技(武漢)有限公司產(chǎn)品名: 二苯甲?;淄?
詢盤CAS: 120-46-7產(chǎn)地: 湖北電話: 13247110337手機(jī): 13247110337電子郵件: [email protected]: 2205437118 微信: 13247110337產(chǎn)品描述: 前衍化學(xué)是化學(xué)品的一站式供采平臺(tái),致力于通過數(shù)字化+專業(yè)服務(wù)讓化學(xué)品交易更高效。前衍核心團(tuán)隊(duì)已有10年以上行業(yè)服務(wù)經(jīng)驗(yàn),平臺(tái)2019年正式成立以來,已為5萬+單 更多 廣州遠(yuǎn)達(dá)新材料有限公司產(chǎn)品名: 二苯甲?;淄?
詢盤CAS: 120-46-7產(chǎn)地: 廣東包裝: 1kg/25kg/200kg, purity>=99%價(jià)格: 電聯(lián)或QQ微信咨詢電話: 19849939632手機(jī): 19849939632(微信同號)電子郵件: [email protected]: 2470479589 微信: +86 19849939632產(chǎn)品描述: 長期現(xiàn)貨可分裝可零售 湖北隆信化工實(shí)業(yè)有限公司現(xiàn)貨供應(yīng)產(chǎn)品名: 二苯甲?;淄?
詢盤CAS: 120-46-7產(chǎn)地: 國產(chǎn)包裝: 100g 500g 1kg 20kg價(jià)格: 電聯(lián)庫存: 是電話: 15335994747手機(jī): 15335994747電子郵件: [email protected]: 3521670276 產(chǎn)品描述: 吡啶溴化氫鹽是我司主打產(chǎn)品之一,且隨貨可提供檢驗(yàn)分析單,少量樣品可以免費(fèi)提供,公司優(yōu)勢是廠家直發(fā)二苯甲?;淄?合肥天健化工有限公司產(chǎn)品名: 二苯甲酰甲烷
詢盤CAS: 120-46-7產(chǎn)地: 安徽電話: 0086-551-65418679手機(jī): 15856988503電子郵件: [email protected] [email protected]: 2881500842 微信: 0086 189 4982 3763產(chǎn)品目錄: 點(diǎn)此進(jìn)入 上海麥克林生化科技股份有限公司提供多種規(guī)格現(xiàn)貨供應(yīng)產(chǎn)品名: 二苯甲酰甲烷
購買
詢盤CAS: 120-46-7產(chǎn)地: 上海包裝: 500g價(jià)格: 298庫存: 3-4周電話: 13918391375/17821173903手機(jī): 13918391375/17821173903電子郵件: [email protected]: 2853951919 微信: 13918391375/17821173903 浙江杭宇醫(yī)藥科技有限公司產(chǎn)品名: 二苯甲酰甲烷
詢盤CAS: 120-46-7產(chǎn)地: 浙江電話: 18134193529手機(jī): +86 18134193529電子郵件: [email protected] 樂研試劑產(chǎn)品名: 二苯甲酰甲烷
購買
詢盤CAS: 120-46-7產(chǎn)地: 上海價(jià)格: 電聯(lián),郵件電話: 021-20772923*1172 (24小時(shí))手機(jī): 400-821-0725電子郵件: [email protected]: 1823703538 產(chǎn)品描述: 樂研試劑:7萬+現(xiàn)貨 500+研發(fā)人員 當(dāng)天發(fā)貨免運(yùn)費(fèi),涵蓋分子砌塊/醫(yī)藥中間體/催化劑與配體等,一站式定制合成服務(wù) www.leyan.com 上海源葉生物科技有限公司現(xiàn)貨供應(yīng)產(chǎn)品名: 二苯甲酰甲烷
購買
詢盤CAS: 120-46-7產(chǎn)地: 上海規(guī)格: ≥98%價(jià)格: 25g 30,100g 80,500g 260庫存: 現(xiàn)貨電話: 18301782025手機(jī): 18301782025電子郵件: [email protected]: 3008007403 微信: 18301782025產(chǎn)品描述: 二苯甲酰甲烷 ≥98% 源葉 貨號:S41427 安徽佳先功能助劑股份有限公司產(chǎn)品名: 二苯甲酰甲烷
詢盤CAS: 120-46-7產(chǎn)地: 安徽電話: 0552-4950475;4089522電子郵件: [email protected]產(chǎn)品描述: 作為鈣/鋅羥酸鹽穩(wěn)定體系的共穩(wěn)定劑,用來制造PVC礦泉水瓶
山東西亞化學(xué)有限公司現(xiàn)貨供應(yīng)產(chǎn)品名: 二苯甲酰甲烷
購買
詢盤CAS: 120-46-7產(chǎn)地: 山東包裝: 100g,25g,500g規(guī)格: ≥99.0% AR|≥98.0% (GC)|≥98.0% (GC)價(jià)格: 145.00,53.00,286.00庫存: 現(xiàn)貨電話: 400-990-3999手機(jī): 13395399280電子郵件: [email protected]: 1903368307 微信: 13355009207 前衍化學(xué)科技(武漢)有限公司產(chǎn)品名: 二苯甲?;淄?
詢盤CAS: 120-46-7產(chǎn)地: 湖北電話: 13247110337手機(jī): 13247110337電子郵件: [email protected]: 2205437118 微信: 13247110337產(chǎn)品描述: 前衍化學(xué)是化學(xué)品的一站式供采平臺(tái),致力于通過數(shù)字化+專業(yè)服務(wù)讓化學(xué)品交易更高效。前衍核心團(tuán)隊(duì)已有10年以上行業(yè)服務(wù)經(jīng)驗(yàn),平臺(tái)2019年正式成立以來,已為5萬+單 更多 廣州遠(yuǎn)達(dá)新材料有限公司產(chǎn)品名: 二苯甲?;淄?
詢盤CAS: 120-46-7產(chǎn)地: 廣東包裝: 1kg/25kg/200kg, purity>=99%價(jià)格: 電聯(lián)或QQ微信咨詢電話: 19849939632手機(jī): 19849939632(微信同號)電子郵件: [email protected]: 2470479589 微信: +86 19849939632產(chǎn)品描述: 長期現(xiàn)貨可分裝可零售 湖北隆信化工實(shí)業(yè)有限公司現(xiàn)貨供應(yīng)產(chǎn)品名: 二苯甲酰基甲烷
詢盤CAS: 120-46-7產(chǎn)地: 國產(chǎn)包裝: 100g 500g 1kg 20kg價(jià)格: 電聯(lián)庫存: 是電話: 15335994747手機(jī): 15335994747電子郵件: [email protected]: 3521670276 產(chǎn)品描述: 吡啶溴化氫鹽是我司主打產(chǎn)品之一,且隨貨可提供檢驗(yàn)分析單,少量樣品可以免費(fèi)提供,公司優(yōu)勢是廠家直發(fā)二苯甲?;淄?合肥天健化工有限公司產(chǎn)品名: 二苯甲酰甲烷
詢盤CAS: 120-46-7產(chǎn)地: 安徽電話: 0086-551-65418679手機(jī): 15856988503電子郵件: [email protected] [email protected]: 2881500842 微信: 0086 189 4982 3763產(chǎn)品目錄: 點(diǎn)此進(jìn)入 上海麥克林生化科技股份有限公司提供多種規(guī)格現(xiàn)貨供應(yīng)產(chǎn)品名: 二苯甲酰甲烷
購買
詢盤CAS: 120-46-7產(chǎn)地: 上海包裝: 500g價(jià)格: 298庫存: 3-4周電話: 13918391375/17821173903手機(jī): 13918391375/17821173903電子郵件: [email protected]: 2853951919 微信: 13918391375/17821173903 浙江杭宇醫(yī)藥科技有限公司產(chǎn)品名: 二苯甲酰甲烷
詢盤CAS: 120-46-7產(chǎn)地: 浙江電話: 18134193529手機(jī): +86 18134193529電子郵件: [email protected] 樂研試劑產(chǎn)品名: 二苯甲酰甲烷
購買
詢盤CAS: 120-46-7產(chǎn)地: 上海價(jià)格: 電聯(lián),郵件電話: 021-20772923*1172 (24小時(shí))手機(jī): 400-821-0725電子郵件: [email protected]: 1823703538 產(chǎn)品描述: 樂研試劑:7萬+現(xiàn)貨 500+研發(fā)人員 當(dāng)天發(fā)貨免運(yùn)費(fèi),涵蓋分子砌塊/醫(yī)藥中間體/催化劑與配體等,一站式定制合成服務(wù) www.leyan.com 上海源葉生物科技有限公司現(xiàn)貨供應(yīng)產(chǎn)品名: 二苯甲酰甲烷
購買
詢盤CAS: 120-46-7產(chǎn)地: 上海規(guī)格: ≥98%價(jià)格: 25g 30,100g 80,500g 260庫存: 現(xiàn)貨電話: 18301782025手機(jī): 18301782025電子郵件: [email protected]: 3008007403 微信: 18301782025產(chǎn)品描述: 二苯甲酰甲烷 ≥98% 源葉 貨號:S41427 安徽佳先功能助劑股份有限公司產(chǎn)品名: 二苯甲酰甲烷
詢盤CAS: 120-46-7產(chǎn)地: 安徽電話: 0552-4950475;4089522電子郵件: [email protected]產(chǎn)品描述: 作為鈣/鋅羥酸鹽穩(wěn)定體系的共穩(wěn)定劑,用來制造PVC礦泉水瓶
二苯甲?;淄?DMB)的下游產(chǎn)品
3,5-二苯基吡唑 1,2-雙(對甲苯基磺酰基)肼
您剛剛瀏覽過
二苯甲?;淄?DMB)
你知道嗎?
點(diǎn)擊右上角的地圖標(biāo)志可以切換至英文頁面
使用化工百科前必讀
首頁
注冊
登錄
會(huì)員介紹
聯(lián)系方式
化工百科英文站
關(guān)注專欄/原理和實(shí)戰(zhàn)解析Linux中如何正確地使用內(nèi)存屏障(上)原理和實(shí)戰(zhàn)解析Linux中如何正確地使用內(nèi)存屏障(上)
2022年10月28日 09:40--瀏覽 ·
--喜歡 ·
--評論
補(bǔ)給站Linux內(nèi)核粉絲:5114文章:723
關(guān)注圈里流傳著一句話“珍愛生命,遠(yuǎn)離屏障”,這足以說明內(nèi)存屏障是一個(gè)相當(dāng)晦澀和難以準(zhǔn)確把握的東西。使用過弱的屏障,會(huì)導(dǎo)致軟件不穩(wěn)定。使用過強(qiáng)的屏障,會(huì)引起性能問題。所以工程上,追求恰到好處、不偏不倚的屏障。本文力求用最淺顯的語言,講清楚內(nèi)存屏障最晦澀的道理,本文也會(huì)給出五個(gè)工程案例,這些案例皆見于開源的代碼,不涉及任何組織和個(gè)人未公開的技術(shù)。一、引子我國古代著名程序猿韓愈曾經(jīng)寫下一個(gè)名為《春雪》的函數(shù):新年都未有芳華,二月初驚見草芽。白雪卻嫌春色晚,故穿庭樹作飛花。這段代碼講述了一個(gè)關(guān)于memory reorder的故事,在計(jì)算機(jī)世界里面,冬天和春天并沒有明確的界限,明明已經(jīng)是春天了,但是還飄著冬天的雪。下面我們看另外一段程序:我們能確保c = 4嗎?實(shí)際上,任何一個(gè)角度都確定不了。比如CPU0上面a = 3是“下雪”,flag = 1是“春天”,a=3看似在flag=1之前,實(shí)際可能由于memory reorder的原因發(fā)生在flag = 1之后,所以flag即便已經(jīng)等于1,a也不一定等于3。我們再退一萬步講,哪怕CPU0上面確實(shí)確保了春天不下雪,flag=1的時(shí)候a 100%就等于了3,那CPU1那邊就萬無一失了嗎?答案也是否定的,因?yàn)?,在CPU1上面,即便我們的代碼是if(flag==1),接下來才做c=a+1,我們也不能確保a的load一定發(fā)生在flag==1之后。別忘了,CPU1會(huì)投機(jī)執(zhí)行,比如碰到if(flag==1)這種條件,CPU可能直接忽略,不管三七二十一,還是可能先執(zhí)行 load a, a+1的動(dòng)作,然后反過來發(fā)現(xiàn)flag等于1,然后我認(rèn)為我的投機(jī)是成功的;即便投機(jī)失敗,CPU只需要保證load a, a+1的這些指令不retired就好。所以CPU1的load a, a+1完全可能發(fā)生在flag確切地等于1之前,因此即便CPU0保序了,CPU1仍然不能確保c=4。我們看看CPU1在投機(jī)成功時(shí)候的行為邏輯和思想情感:flag==1嗎?不知道??!我現(xiàn)在還沒讀出flag呢!管它呢,先假裝flag==1吧,投機(jī)一把,執(zhí)行l(wèi)oad a, 把a(bǔ)+1看看4.flag==1嗎?哇,它真地等于1,太爽了,load a和a+1已經(jīng)做完了。如果投機(jī)失敗了呢?flag==1嗎?不知道??!我現(xiàn)在還沒讀出flag呢!管它呢,先假裝flag==1吧,投機(jī)一把,執(zhí)行l(wèi)oad a, 把a(bǔ)+1看看flag==1嗎?Oh,shit,它不等于1,load a, a+1白做了.....這就是弱序系統(tǒng)的典型特點(diǎn)。請問CPU為什么要這么“混亂”?這正是現(xiàn)代CPU為了保證高效執(zhí)行厲害的地方,但是也引入軟件使用上的復(fù)雜度。這種復(fù)雜度,類似于宋代著名程序媛李清照的函數(shù)《聲聲慢·尋尋覓覓》:“尋尋覓覓,冷冷清清,凄凄慘慘戚戚。乍暖還寒時(shí)候,最難將息。三杯兩盞淡酒,怎敵他、晚來風(fēng)急?雁過也,正傷心,卻是舊時(shí)相識。滿地黃花堆積,憔悴損,如今有誰堪摘?守著窗兒,獨(dú)自怎生得黑。梧桐更兼細(xì)雨,到黃昏、點(diǎn)點(diǎn)滴滴。這次第,怎一個(gè)愁字了得!”請問李清照童鞋說的究竟是春天還是秋天還是春天呢?據(jù)說至今也沒有人能夠解密。僅憑“乍暖還寒”一定會(huì)覺得是初春,但是你再繼續(xù)看到“雁過也”、“滿地黃花堆積”,這顯然又不是春天的景象。罷了罷了,這一切都不重要了,重要的是,四季并不分明,四季沒有明確的界限。這是我們要牢記的第一個(gè)point!二、屏障正是因?yàn)樗募緵]有明確的界限,所以當(dāng)我們希望看到明確的順序的時(shí)候,我們希望引入一道屏障。讓冬天跑不到春天,讓春天跑不過去冬天。典型的ARM64有這么幾種屏障:a. DMB:Data Memory Barrierb. DSB:Data Synchronization Barrierc. ISB:Instruction Synchronization Barrierd. LDAR(Load-Acquire)/STLR(Store-Release)我們隨便打開ARM的手冊,看一個(gè)DMB的定義:The Data Memory Barrier (DMB) prevents the reordering of specified explicit data accesses across the barrier instruction. All explicit data load or store instructions, which are executed by the PE in program order before the DMB, are observed by all Observers within a specified Shareability domain before the data accesses after the DMB in program order.碼農(nóng)的內(nèi)心是崩潰的,人生已經(jīng)這么悲催了,你為什么還要拿這樣的繞口令來折磨我?什么叫“are observed by all Observers”?下面我們給大家講述2只狗狗出家門的故事:上圖的2只狗,首先在一個(gè)inner shareable domain里面,比如是自己的家門里面;然后是在一個(gè)outer shareable domain里面,比如是小區(qū)的出口;最后在太陽系里面。這2只小狗,出每一道門,都有observer可以看見它,有的observer是inner的(observer1),有的observer是outer的(observer2),有的observer屬于full system,比如天上的嫦娥(observer3)?,F(xiàn)在我們提出如下需求:a. 黃狗狗出門后白狗狗出門。b. 黃狗狗和白狗狗出門后,放煙霧消殺。當(dāng)我們提出這樣的需求的時(shí)候,我們看3樣?xùn)|西:1. 我們首先要看需要保證順序的2個(gè)事物的特征在需求1里面,是2只特征一樣的東西,都是狗狗;在需求2里面,兩個(gè)事物之間一個(gè)是狗狗,一個(gè)是消殺的煙霧,顯然不是同類。狗狗在硬件和Linux軟件層面上,可以理解為針對內(nèi)存的memory load/store指令;放煙霧,這種不屬于memory的load/store,比如你執(zhí)行的是tlbi、add加法或者寫的是ARM64系統(tǒng)寄存器(MSR指令),則顯然不屬于memory load/store。這里就涉及到DMB和DSB的一個(gè)本質(zhì)區(qū)別,DMB針對的是memory的load/store之間;DSB強(qiáng)調(diào)的是同類或不同類事物的先后完成。所以對于這個(gè)場景,我們正確的屏障是:load黃狗狗dmb ??load白狗狗dsb ??MSR 消毒煙霧第一個(gè)是dmb,第2個(gè)是dsb。上面dmb和dsb后面都加了兩個(gè)“?”,證明這里有情況,什么情況?接著看。2. 其次我們要看保序的observer在哪里比如是家門口的小姑娘observer1(ISH,inner shareable)、還是小區(qū)門口的小姑娘observer2(OSH,outer shareable),還是天上的嫦娥呢(SY, Full System)?如果只是observer1看到黃狗狗先出門,白狗狗再出門,延遲顯然更小。在越大的訪問范圍保序,硬件的延遲越大。假設(shè)我們現(xiàn)在的保序需求是:a. 小區(qū)門口(outer shareable)的observer2先看到黃狗狗出來,再看到白狗狗出來;b. 家門口(inner shareable)的observer1先看到兩只狗狗出來,再看到放煙霧。對于這個(gè)場景,我們正確的屏障是:load黃狗狗dmb OSH?load白狗狗dsb ISH?MSR 消毒煙霧在DMB后面我們跟的是OSH,在DSB后面我們跟的是ISH,是因?yàn)閛bserver的位置不一樣。注意,能用小observer的不用大observer。小區(qū)門口的observer,沒有透視眼+望遠(yuǎn)鏡,是看不到你家門口的狗狗的。在一個(gè)典型的ARM64系統(tǒng)里面,運(yùn)行Linux的各個(gè)CPU在一個(gè)inner;而GPU,DMA和CPU則同位于一個(gè)outer;當(dāng)然還有可能孤懸海外的一個(gè)Cortex-M3的MCU,盡管可以和CPU以某種方式通信,但是不太參與inner以及outer里面的總線interconnect。3. 最后我們保序的方向是什么前面我們只關(guān)心狗狗的出門(load),假設(shè)兩只狗狗都是進(jìn)門(store)呢?或者我們現(xiàn)在要求黃狗狗先進(jìn)門,白狗狗再出門呢?這個(gè)時(shí)候,我們要約束屏障的方向。比如下面的代碼,約束了observer1(inner)先看到黃狗狗出門,再看到白狗狗出門:load黃狗狗dmb ISHLDload白狗狗比如下面的代碼,約束了observer2(outer)先看到黃狗狗進(jìn)門,再看到白狗狗進(jìn)門:store黃狗狗dmb OSHSTstore白狗狗這里我們看到一個(gè)用的是LD,一個(gè)用的是ST。我們再來看幾個(gè)栗子,它們都是干什么的:a. A(load); dmb ISHLD; B; C(load/store)保證Inner內(nèi),A和C的順序,只要A是load,無論C是load還是store;如果B既不是load也不是store,而是別的性質(zhì)的事情,則dmb完全管不到B;b. A(load); dsb ISHLD; B; C(load/store)保證Inner內(nèi),A和C的順序,只要A是load,無論C是load還是store;無論B是什么事情,inner都先到干完了A,再干B(注意這里是dsb啊,親)。c. A(store); dmb ISHLD; B; C(store)A,B,C三個(gè)東西完全亂序,因?yàn)閐mb約束不了性質(zhì)不同的B,“LD”約束不了A和C的store順序。d. A(store); dmb ISHST; B; C(store)ST約束了A和C 2個(gè)東西在inner這里看起來是順序的,因?yàn)閐mb約束不了B,所以B和A、C之間亂序。注意上述4個(gè)屏障,由于都是ISH,故都不能保證observer2和observer3的順序,在observer2和3眼里,上述所有屏障,A、B、C都是亂序的。另外,如果無論什么方向,我們都要保序,我們可以去掉LD和ST,這樣的保序方向是any-any。到這里我們要牢記3個(gè)point:誰和誰保序;在哪里保序;朝哪個(gè)方向保序。由此,我們可以清楚地看到DMB和DSB的區(qū)別,一個(gè)是保序內(nèi)存load,store;一個(gè)是保序內(nèi)存load,store + 其他指令。ISB的性質(zhì)會(huì)有很大的不同,ISB主要用于刷新處理器中的pipeline,因此可確保在 ISB 指令完成后,才從內(nèi)存系統(tǒng)中fetch位于該指令后的其他指令。比如你更新了代碼段的PTE,需要重新取指。而LDAR(Load-Acquire)/STLR(Store-Release)則是比較新的one-way barrier。如下圖,LDAR之前的LDR、STR可以跑到LDAR之后,但是不能跑到STLR之后;STLR之后的LDR,STR可以跑到STLR之前,但是不能跑到LDAR之前。所以STLR堵住了前面的往后面跑,LDAR堵住了后面的往前面跑。下面夾在LDAR和STLR之間的LDR,STR由于兩邊都是單向車道,而且都與它的行進(jìn)方向相反,所以它夾在死胡同里,哪里也去不了。注意,LDAR和STLR與前面的dmb, dsb有本質(zhì)的不同,它本身是要跟地址的。比如現(xiàn)在家里有3只狗狗:假設(shè)我們現(xiàn)在的要求是黃狗狗一定要在紅尾哈巴狗之后出門,而白狗狗什么時(shí)候出我們都不在乎,則代碼邏輯為:ldr 白狗狗ldar 紅尾哈巴狗ldr 黃狗狗黃狗狗被紅尾哈巴狗的ldar擋住了,而白狗狗沒有被任何東西擋住,它可以:第一個(gè)出門紅尾哈巴狗出門后,黃狗狗出門前出門最后一個(gè)出門。三、API在Linux內(nèi)核,有4組經(jīng)典API:SMP屏障此屏障主要用于運(yùn)行Linux的多個(gè)核之間對內(nèi)存訪問的保序,所以它主要是dmb,它是ish,通過ld、st來區(qū)分保序的方向。DMA屏障此屏障主要用于運(yùn)行Linux的多個(gè)核與DMA引擎之間的保序,所以它主要是dmb,它是osh,通過ld、st來區(qū)分保序的方向。屏障非常嚴(yán)格的完成屏障,mb()保證了前面的指令的完成,前面的指令不必是load,store,比如可以是TLBI。dsb(ld)、dsb(st)則要弱一點(diǎn),分別保證前面的load,store執(zhí)行完了才執(zhí)行后面的指令。load_acquire/store_release邏輯通常是一種成對的__smp_load_acquire()、__smp_store_release()邏輯,特別適合2個(gè)或者多個(gè)CPU之間的鏈?zhǔn)奖P颉T贏RM64里面用的是stlr,ldar實(shí)現(xiàn)如下:比如,下面的代碼邏輯,保證了CPU0、CPU1、CPU2這3個(gè)CPU在鏈條上保序訪問:中間循環(huán)了一個(gè)鏈條邏輯,從而保證了這三個(gè)CPU中間內(nèi)存訪問的一些保序:下面我們進(jìn)入五個(gè)工程實(shí)戰(zhàn),“熟讀唐詩三百首,不會(huì)吟詩也會(huì)吟”,最后我們會(huì)形成針對內(nèi)存屏障正確用法的語感,而全然忘記語法。篇幅有限,下文繼續(xù)講解原文作者:內(nèi)核工匠本文禁止轉(zhuǎn)載或摘編
分享到:
投訴或建議評論----
DMB_化工百科
化工百科
首頁
產(chǎn)品供應(yīng)商后臺(tái)
了解會(huì)員服務(wù)
登陸
免費(fèi)注冊
搜供應(yīng)商
搜百科
DMB
4,4'-二氨基-3,3'-二甲基聯(lián)苯(3,3'-Dimethylbiphenyl-4,4'-diamine)
CAS: 119-93-7
化學(xué)式: C14H14N2O2S
主頁 產(chǎn)品中間體醫(yī)藥中間體 DMB
管制品類:危險(xiǎn)化學(xué)品目錄
中文名 4,4'-二氨基-3,3'-二甲基聯(lián)苯英文名 3,3'-Dimethylbiphenyl-4,4'-diamine別名 聯(lián)甲苯胺鄰聯(lián)甲苯胺托力丁倍司聯(lián)鄰甲苯胺鄰二氨基二甲基聯(lián)苯3,3-二甲基聯(lián)苯胺3,3'-二甲基聯(lián)苯胺3,3'-二甲基-4,4'-二氨基聯(lián)苯4,4'-二氨基-3,3'-二甲基聯(lián)苯英文別名 DMBOTBASEO.T. BASEo-Tolidine2-TolidineC.I. 372302-Tolidina[2-TolidinOrthotolidineFast Dark Blue Base R3,3'-DimethylbenzidineAzoic diazo component 113C.I. Azoic Diazo Component 1133,3'-dimethyl-4,4'-biphenyldiamineo-Tolidine(3,3'-Dimethylbenzidine)3,3'-dimethyl-4,4'-diaminobiphenyl3,3'-Dimethylbiphenyl-4,4'-diamine1'-biphenyl)-4,4'-diamine,3,3'-dimethyl-(1'-biphenyl]-4,4'-diamine,3,3'-dimethyl-(1'-Biphenyl)-4,4'-diamine-3,3'-dimethyl-3,3'-dimethyl-[1,1'-biphenyl]-4,4'-diamine3,3'-dimethyl-[1,1'-biphenyl]-4,4'- diamine(1,1'-biphenyl)-4,4'-diamine-3,3'-dimethyl-CAS 119-93-7EINECS 204-358-0化學(xué)式 C14H14N2O2S分子量 274.34InChI InChI=1/C14H16N2/c1-9-7-11(3-5-13(9)15)12-4-6-14(16)10(2)8-12/h3-8H,15-16H2,1-2H3密度 1.106g/cm3熔點(diǎn) 125-132℃沸點(diǎn) 361°C at 760 mmHg閃點(diǎn) 205.1°C水溶性 Slightly soluble in water.蒸汽壓 2.14E-05mmHg at 25°C折射率 1.638存儲(chǔ)條件 Room Temprature物化性質(zhì) 性狀 白色至微紅色晶體或結(jié)晶粉末。 熔點(diǎn) 125-132°C 沸點(diǎn) 300.5°C 閃點(diǎn) 244°C 溶解性 微溶于水,溶于乙醇、乙醚和稀酸。 危險(xiǎn)品標(biāo)志 T - 有毒物品
N - 危害環(huán)境的物品
風(fēng)險(xiǎn)術(shù)語 R22 - 吞食有害。
R45 - 可能致癌。
R51/53 - 對水生生物有毒,可能對水體環(huán)境產(chǎn)生長期不良影響。
R68 - 可能有不可逆后果的危險(xiǎn)。
安全術(shù)語 S45 - 若發(fā)生事故或感不適,立即就醫(yī)(可能的話,出示其標(biāo)簽)。
S53 - 避免接觸,使用前須獲得特別指示說明。
S61 - 避免釋放至環(huán)境中。參考特別說明/安全數(shù)據(jù)說明書。
危險(xiǎn)品運(yùn)輸編號 UN 3082 9/PG 3上游原料 鄰硝基甲苯 2-氨基-8-萘酚-6-磺酸 鄰聯(lián)甲苯胺 下游產(chǎn)品 雙乙酰乙酰-3,3'-二甲基聯(lián)苯胺 指示藍(lán)4R 參考資料 展開查看 1. 孫蓮, 新疆醫(yī)科大學(xué)藥學(xué)院化學(xué)教研室, 孫蓮,等. 新疆藥桑葉中1-脫氧野尻霉素定性及定量分析[J]. 中國現(xiàn)代中藥, 2016, 18(10):1291-1295.
DMB - 性質(zhì)可信數(shù)據(jù)白色至微紅色晶體或結(jié)晶粉末。熔點(diǎn)129~131℃。340℃分解。微溶于水,溶于乙醇、乙醚和稀酸??扇肌?/p>
最后更新:2024-01-02 23:10:35DMB - 制發(fā)可信數(shù)據(jù)用鋅粉(或硅鐵粉)在苛性鈉介質(zhì)中將鄰硝基甲苯還原為2,2'--甲基對稱二苯肼,然后在22.5%的硫酸及焦亞硫酸鈉(或鹽酸)存在下,重排生成3,3'-=甲基聯(lián)苯胺硫酸鹽(或鹽酸鹽),再加30%液堿,脫酸而得成品。稱二苯肼,然后在22.5%的硫酸及焦亞硫酸鈉(或鹽酸)存在下,重排生成3,3'-=甲基聯(lián)苯胺硫酸鹽(或鹽酸鹽),再加30%液堿,脫酸而得成品。
最后更新:2022-01-01 10:52:55DMB - 性質(zhì)4,4'-二氨基-3,3'-二甲基聯(lián)苯是一種有機(jī)化合物,化學(xué)式為C16H18N2。它是一種無色結(jié)晶固體,常見的形式是棱柱狀晶體或粉末狀。它的分子量為238.33 g/mol。
該化合物具有較強(qiáng)的疏水性,不溶于水,但溶于一些有機(jī)溶劑,如乙醇、二甲酮和乙醚等。它具有較低的融點(diǎn)和沸點(diǎn)。
4,4'-二氨基-3,3'-二甲基聯(lián)苯是一種二官能團(tuán)化合物,它含有兩個(gè)氨基基團(tuán)和兩個(gè)甲基基團(tuán)。這使得它具有一定的反應(yīng)性。例如,它可以和一些酸或堿反應(yīng)形成鹽類,也可以和一些電子不飽和化合物發(fā)生親電取代反應(yīng)。
此外,4,4'-二氨基-3,3'-二甲基聯(lián)苯還具有一定的熒光性質(zhì)。它在紫外光激發(fā)下可以發(fā)射出綠色熒光,因此廣泛應(yīng)用于熒光探針、熒光染料等領(lǐng)域。
最后更新:2024-01-02 23:10:35DMB - 用途與合成方法4,4'-二氨基-3,3'-二甲基聯(lián)苯,也被稱為 "MBI",是一種重要的有機(jī)化合物。它具有廣泛的應(yīng)用和合成方法。
在應(yīng)用方面,MBI 是一種重要的有機(jī)發(fā)光材料。它可用于制備有機(jī)發(fā)光二極管(OLED)和有機(jī)電致冷材料。MBI 具有高度的發(fā)光效率和較長的壽命,因此在光電子學(xué)和光學(xué)器件中有著重要的應(yīng)用。
此外,MBI 也可以作為一種磁性材料。它具有較強(qiáng)的自旋耦合效應(yīng),可以用于制備磁性聚合物、電子器件和儲(chǔ)能材料等。
關(guān)于合成方法,MBI 的合成主要有兩種常用的方法。
一種方法是通過芐胺的硝酸銀鹽與 2,2,6,6-四甲基芐醛反應(yīng)得到MBI。具體步驟為:首先將芐胺硝酸銀鹽與堿反應(yīng)生成相應(yīng)的亞胺鹽,然后與二甲基芐醛在適當(dāng)?shù)娜軇┲蟹磻?yīng),最后經(jīng)過脫水和結(jié)晶得到純品。
另一種方法是通過氨甲基苯并環(huán)(a-氨基-磺酸溴化物)和乙酸乙酯經(jīng)由溴化反應(yīng)合成MBI。具體步驟為:首先將氨甲基苯并環(huán)與三氯化磷反應(yīng)生成氯化物,然后通過銅催化的氮化反應(yīng)與溴乙酸乙酯反應(yīng),最后經(jīng)過水雜化反應(yīng)和結(jié)晶得到純品。
這些方法在合成MBI時(shí)都能夠得到較好的產(chǎn)率和純度,提供了可行的途徑來合成該化合物。最后更新:2024-01-02 23:10:35DMB - 安全信息4,4'-二氨基-3,3'-二甲基聯(lián)苯是一種化學(xué)物質(zhì),也稱為DMAB. 它是一種有機(jī)化合物,化學(xué)式為C16H18N2,相對分子質(zhì)量為238.33克/摩爾。以下是關(guān)于4,4'-二氨基-3,3'-二甲基聯(lián)苯的一些安全信息:
1. 吸入:避免吸入其氣體、煙霧或粉塵。若不慎吸入,應(yīng)立即將患者轉(zhuǎn)移到空氣清新處,并在醫(yī)生的指導(dǎo)下進(jìn)行治療。
2. 食入:避免食入。如果不慎食入,請立即向醫(yī)生求助,并出示產(chǎn)品的包裝或標(biāo)簽。
3. 接觸皮膚:應(yīng)避免接觸皮膚。如果接觸到化合物,應(yīng)立即用大量清水沖洗至少15分鐘,并尋求醫(yī)療幫助。
4. 接觸眼睛:避免接觸眼睛。如果發(fā)生接觸,應(yīng)立即用大量清水沖洗眼睛至少15分鐘,同時(shí)佩戴防護(hù)眼鏡,并尋求醫(yī)療幫助。
5. 環(huán)境安全:避免該物質(zhì)進(jìn)入水源或土壤。對于泄漏物或廢棄物的處置,應(yīng)遵循當(dāng)?shù)胤ㄒ?guī)。
6. 儲(chǔ)存:應(yīng)將4,4'-二氨基-3,3'-二甲基聯(lián)苯儲(chǔ)存在干燥、通風(fēng)良好的地方,遠(yuǎn)離熱源和火源。
最后更新:2024-01-02 23:10:35DMB - 安全性可信數(shù)據(jù)
本品為聯(lián)苯胺的衍生物。有毒。能刺激皮膚和黏膜??芍旅舨⒖梢鸢螂装?yīng)避免其與皮膚直接接觸。生產(chǎn)設(shè)備要密閉,防止粉塵污染空氣。操作人員應(yīng)穿戴防護(hù)用具。
用鐵桶內(nèi)襯暗色塑料袋包裝。貯存于陰涼、通風(fēng)、干燥處。按有毒易燃化學(xué)品規(guī)定貯運(yùn)。
最后更新:2022-01-01 10:52:55
查看DMB結(jié)構(gòu)式
化工百科提示:
該產(chǎn)品屬于管制類產(chǎn)品-危險(xiǎn)化學(xué)品,個(gè)人不得非法銷售或購買。公司或單位需取得相關(guān)部門發(fā)放的許可證并按法律規(guī)定進(jìn)行登記備案。物流、倉儲(chǔ)均需具有相應(yīng)資質(zhì)的物流公司和倉儲(chǔ)公司,嚴(yán)禁使用快遞運(yùn)輸。
廠家聯(lián)系方式僅供具備采購資質(zhì)的公司或團(tuán)體在線下聯(lián)絡(luò)時(shí)參考使用,產(chǎn)品不在網(wǎng)上銷售。
供應(yīng)商列表
長沙長唐進(jìn)出口有限公司的聯(lián)系方式產(chǎn)品名: 聯(lián)苯甲胺電話: 15717493165手機(jī): 15717493165電子郵件: [email protected]山東西亞化學(xué)有限公司的聯(lián)系方式產(chǎn)品名: 3,3'-二甲基聯(lián)苯胺電話: 400-990-3999手機(jī): 13395399280電子郵件: [email protected]前衍化學(xué)科技(武漢)有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯電話: 13247110337手機(jī): 13247110337電子郵件: [email protected]廣東翁江化學(xué)試劑有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯手機(jī): 13927877242電子郵件: [email protected]前衍化學(xué)科技(武漢)有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯手機(jī): 13247110337電子郵件: [email protected]河北貞田食品添加劑有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯電話: 0319-5925599手機(jī): 13373390591電子郵件: [email protected]上海麥克林生化科技股份有限公司的聯(lián)系方式產(chǎn)品名: 聯(lián)鄰甲苯胺電話: 13918391375/17821173903手機(jī): 13918391375/17821173903電子郵件: [email protected]浙江杭宇醫(yī)藥科技有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯電話: 18134193529手機(jī): +86 18134193529電子郵件: [email protected]
長沙長唐進(jìn)出口有限公司的聯(lián)系方式產(chǎn)品名: 聯(lián)苯甲胺電話: 15717493165手機(jī): 15717493165電子郵件: [email protected]山東西亞化學(xué)有限公司的聯(lián)系方式產(chǎn)品名: 3,3'-二甲基聯(lián)苯胺電話: 400-990-3999手機(jī): 13395399280電子郵件: [email protected]前衍化學(xué)科技(武漢)有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯電話: 13247110337手機(jī): 13247110337電子郵件: [email protected]廣東翁江化學(xué)試劑有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯手機(jī): 13927877242電子郵件: [email protected]前衍化學(xué)科技(武漢)有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯手機(jī): 13247110337電子郵件: [email protected]河北貞田食品添加劑有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯電話: 0319-5925599手機(jī): 13373390591電子郵件: [email protected]上海麥克林生化科技股份有限公司的聯(lián)系方式產(chǎn)品名: 聯(lián)鄰甲苯胺電話: 13918391375/17821173903手機(jī): 13918391375/17821173903電子郵件: [email protected]浙江杭宇醫(yī)藥科技有限公司的聯(lián)系方式產(chǎn)品名: 4,4'-二氨基-3,3'-二甲基聯(lián)苯電話: 18134193529手機(jī): +86 18134193529電子郵件: [email protected]
DMB的上游原料
鄰硝基甲苯 2-氨基-8-萘酚-6-磺酸 鄰聯(lián)甲苯胺
DMB的下游產(chǎn)品
直接湖藍(lán)5B C.I.酸性紅114 伊文思藍(lán)
您剛剛瀏覽過
DMB
你知道嗎?
點(diǎn)擊右上角的地圖標(biāo)志可以切換至英文頁面
使用化工百科前必讀
首頁
注冊
登錄
會(huì)員介紹
聯(lián)系方式
化工百科英文站