关于DMA,TCM(ITCM和DTCM)和Cache的理解
? ? ? ? ? ?關(guān)于DMA,TCM(ITCM和DTCM)和Cache
DMA
DMA=Direct Memory Access。這是一種通過硬件實(shí)現(xiàn)的數(shù)據(jù)傳輸機(jī)制。簡(jiǎn)單的說,就是不在CPU的參與下完成數(shù)據(jù)的傳輸。
DMA是一種硬件設(shè)備。這種設(shè)備的工作原理是這樣的:
——首先CPU告訴DMA設(shè)備,要有一堆數(shù)據(jù)需要傳輸,為了效率而請(qǐng)它出馬。(DMA請(qǐng)求)
——DMA收到CPU的消息,開始準(zhǔn)備。此時(shí)CPU把數(shù)據(jù)源地址、數(shù)據(jù)目標(biāo)地址、傳輸數(shù)據(jù)量、傳輸模式等等參數(shù)告訴它。(DMA初始化)
——DMA初始化完,向CPU發(fā)送消息“借你的總線用一用,我要開始傳輸數(shù)據(jù)了!”(總線出借,DMA啟動(dòng))
——CPU收到消息后,暫時(shí)切斷自己與總線的聯(lián)系。DMA開始傳輸數(shù)據(jù)。(DMA數(shù)據(jù))
——DMA傳輸完數(shù)據(jù)之后,向CPU發(fā)送消息“搞定了!總線還給你。”(總線歸還)
——CPU說:“干得好!老將出馬一個(gè)頂倆!辛苦了,你先歇著吧。”DMA設(shè)備停止。CPU該干啥干啥。
由于是硬件實(shí)現(xiàn)的,所以DMA的速度非常快。快到什么程度呢?在DS上,尤其是數(shù)據(jù)量非常大的時(shí)候,相比于CPU當(dāng)中介,效率能夠提高一百萬倍以上。
由于DMA的速度是如此之快,所以大量的數(shù)據(jù)傳輸,一般都要求使用DMA。
TCM
TCM=Tightly Coupled Memory,是一種高速緩存,據(jù)說是被直接集成在CPU芯片中。DS有兩種TCM,分別是ITCM(Instruction TCM)和DTCM(Data TCM)。
注意:
1.內(nèi)存支持列表中,內(nèi)存詳細(xì)參數(shù)里,SS指的是單面內(nèi)存,DS指的是雙面內(nèi)存。內(nèi)存一共有兩面,根據(jù)內(nèi)存總?cè)萘亢蛢?nèi)存芯片的存儲(chǔ)容量,內(nèi)存廠家會(huì)生產(chǎn)雙面內(nèi)存和單面內(nèi)存,也就是內(nèi)存的兩面都有存儲(chǔ)芯片,或者只有一面有存儲(chǔ)芯片。單雙面內(nèi)存在兼容性上有一定區(qū)別,所以會(huì)單獨(dú)列出來。
2。ITCM是cortex內(nèi)核中指令傳輸總線,DTCM是cortex內(nèi)核中數(shù)據(jù)傳輸總線
是cpu內(nèi)核同flash及sram之間傳輸指令和數(shù)據(jù)的通道,指令的取指和執(zhí)行及數(shù)據(jù)的讀寫在性能及管理上存在差異性,因而需要予以區(qū)分。
由于是高速緩存,所以這兩塊內(nèi)存區(qū)域被當(dāng)做特殊的用途。比如某些對(duì)時(shí)間要求非常嚴(yán)格的代碼,就可以被放到ITCM中執(zhí)行。這可以有效地提高運(yùn)行速度。某些需要頻繁存取的數(shù)據(jù),也可以放到DTCM中以節(jié)省存取時(shí)間。
怎么樣把代碼放到ITCM中?有兩種方法。一種是使用gcc特有的“屬性標(biāo)簽”,將指定代碼賦予“ITCM”屬性,此時(shí)該代碼會(huì)被載入ITCM中執(zhí)行。還有一種方法是直接將.c源文件改成.itcm.c,此時(shí)源文件會(huì)被直接編譯成在ITCM中運(yùn)行的目標(biāo)文件。
而DTCM就方便得多了。雖然兩個(gè)TCM都是可映射的,也就是說,它們的地址并非固定,但是一般會(huì)將其分別映射到固定地址。既然已經(jīng)有了固定地址,那么就可以很輕松地訪問了。不過,正如剛才所說的,這兩塊內(nèi)存空間都是有特殊用途的,所以不建議直接訪問。相比于ITCM來說,DTCM更加重要。因?yàn)樵谶@塊內(nèi)存中,存在著一個(gè)非常重要的對(duì)象——棧。局部變量和函數(shù)調(diào)用的參數(shù),就是靠棧進(jìn)行傳遞的。由于DMA無法訪問TCM,所以也就無法訪問棧。又由于局部變量是被開辟到棧中,所以DMA也無法對(duì)局部變量進(jìn)行傳遞。
Cache
眾所周知CPU的速度非常快。當(dāng)CPU訪問外設(shè)的時(shí)候,有些外設(shè)速度比較慢,響應(yīng)CPU比較遲鈍。此時(shí)CPU要么等外設(shè)響應(yīng),要么繼續(xù)干它的活等外設(shè)的中斷信號(hào)。但是有些外設(shè)是沒有中斷的。此時(shí)CPU就必須等了。最典型的例子就是內(nèi)存。當(dāng)CPU訪問內(nèi)存的時(shí)候,并非像你想象的那樣,CPU立刻就能訪問到它想訪問的內(nèi)存空間,而是有一個(gè)“WaitState”的過程。想想看吧,每訪問一次內(nèi)存都要等上幾個(gè)機(jī)器周期,這可不是個(gè)好事~~~尤其是,這個(gè)“幾”可不是簡(jiǎn)單的一位數(shù),有些時(shí)候甚至能達(dá)到3位數(shù)。
那么這個(gè)問題又該怎么解決呢?那就是Cache了。
Cache是集成在CPU內(nèi)部的極高速的緩存。注意關(guān)鍵詞“極高速”。一般來說,它的訪問速度幾乎可以媲美CPU。這就意味著,CPU在訪問Cache的時(shí)候幾乎不會(huì)浪費(fèi)多少時(shí)間。不過,速度的提升是用容量作為代價(jià)的。Cache的容量很小。
那么,我們把常用的數(shù)據(jù)放到Cache中,CPU在訪問的時(shí)候直接訪問Cache就行了,不用耗費(fèi)時(shí)間去訪問內(nèi)存了。
事實(shí)上CPU就是這么做的。在讀內(nèi)存的時(shí)候,CPU首先讀Cache,看看有沒有它想要的數(shù)據(jù)的“副本”,有的話那就太好了,直接拿過去用。沒有的話就只好費(fèi)點(diǎn)功夫去讀內(nèi)存了。而在寫內(nèi)存的時(shí)候,CPU直接寫到Cache中,而非直接寫到內(nèi)存中。Cache寫滿了之后,此時(shí)才將Cache中的數(shù)據(jù)更新到內(nèi)存,同時(shí)清空Cache。就像寄信一樣,所有的信件會(huì)首先攢到郵局,到達(dá)一定數(shù)量之后才會(huì)送出去。
不過這又出現(xiàn)一個(gè)問題:假如Cache中有某個(gè)內(nèi)存數(shù)據(jù)的“副本”,那么CPU在讀該內(nèi)存的時(shí)候就會(huì)直接使用該副本而不用去讀內(nèi)存。那萬一內(nèi)存中的數(shù)據(jù)被改寫,此時(shí)CPU再讀該內(nèi)存,讀出來的豈不是那個(gè)舊的副本而不是最新的內(nèi)存數(shù)據(jù)?同樣,假如我想DMA一些數(shù)據(jù),誰(shuí)能保證此時(shí)內(nèi)存中的數(shù)據(jù)就是最新的數(shù)據(jù)?很可惜,Cache是完全的黑箱。你不知道它的地址。你也無法直接訪問它,但一般系統(tǒng)會(huì)提供函數(shù)進(jìn)行cache回寫和clear操作,比如
//將整個(gè)Data Cache更新到內(nèi)存
void DC_FlushAll()
// 清空整個(gè)Data Cache
void DC_InvalidateAll()
那么,什么時(shí)候使用這些函數(shù)呢?
在DMA之前,我需要保證數(shù)據(jù)源內(nèi)存中的數(shù)據(jù)是最新的。所以此時(shí)需要Flush,從而使DC中的副本能夠更新到內(nèi)存中。
在DMA之后,我需要保證DC中的副本和內(nèi)存中的數(shù)據(jù)是相同的。但是NDSLIB沒有更新DC的函數(shù),所以沒辦法,我們只能把DC中的副本殺掉。此時(shí)如果CPU訪問內(nèi)存,由于DC中沒有副本,所以就只能直接從內(nèi)存訪問并將訪問到的值作為DC中副本了。所以此時(shí)需要Invalidate
?
總結(jié)
以上是生活随笔為你收集整理的关于DMA,TCM(ITCM和DTCM)和Cache的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台湾积体电路制造公司(简称为台积电(TS
- 下一篇: AP(无线访问接入点(WirelessA