CPU運(yùn)行時(shí)間是寶貴的資源,我們要把有限的CPU時(shí)間投入到更有意義的事情中去。
在我們進(jìn)行嵌入式開(kāi)發(fā)的過(guò)程中,你一定干過(guò)這幾件事:用GPIO模擬某種通信接口,比如SPI等;用空循環(huán)來(lái)實(shí)現(xiàn)延時(shí)delay;空等寄存器的關(guān)鍵狀態(tài)位。也許是出于無(wú)奈,比如所使用的芯片沒(méi)有硬件SPI或通道不夠,亦或者此時(shí)CPU除了空轉(zhuǎn)并沒(méi)有其它事情要作,但是我們一定要有這樣的意識(shí):這是在浪費(fèi)CPU資源。
CPU是嵌入式系統(tǒng)的核心,但是它不必深入?yún)⑴c到每一個(gè)細(xì)節(jié)中去。記住:CPU是片上所有硬件資源的統(tǒng)領(lǐng)者,而非事必躬親的苦力。我們要學(xué)會(huì)盡最大可能充分利用片上硬件資源,甚至在芯片外部擴(kuò)展一些專(zhuān)門(mén)的硬件電路來(lái)完成功能設(shè)計(jì)。
本章振南將通過(guò)幾個(gè)實(shí)例來(lái)向大家說(shuō)明如何減輕CPU負(fù)擔(dān),而用片內(nèi)片外的硬件來(lái)實(shí)現(xiàn)我們想要的功能。
1. 石油測(cè)井儀器
0x01
背景知識(shí)
在我的職業(yè)生涯中,有5年多的時(shí)間在作石油儀器。這是一個(gè)很傳統(tǒng)的行業(yè),但也是非常綜合性和吃技術(shù)的行業(yè)。
有人說(shuō):“你這一章似乎要講的是CPU的利用率問(wèn)題,怎么又講起石油儀器來(lái)了?”別急,振南自有用意。
上圖所示為石油測(cè)井系統(tǒng)的簡(jiǎn)易拓?fù)涫疽鈭D。工作時(shí)測(cè)井車(chē)通過(guò)輪盤(pán)拉動(dòng)鋼纜上提,與此同時(shí)儀器向外發(fā)射信號(hào)(電或超聲),并接收返回信號(hào)經(jīng)過(guò)計(jì)算將結(jié)果通過(guò)同軸以太網(wǎng)上傳到地面系統(tǒng),由上位機(jī)繪制出曲線(xiàn)。最終曲線(xiàn)將交給解釋工程師,來(lái)判斷油氣儲(chǔ)層的位置。
上提的速度是一定的,我們當(dāng)然希望在某一個(gè)深度上多采集一些數(shù)據(jù),即盡量提高采樣率。這樣最終的測(cè)井曲線(xiàn)上就能體現(xiàn)出更多的細(xì)節(jié)。
OK,這就是最基本的原理和背景。
0x02
測(cè)井?dāng)?shù)據(jù)采傳的實(shí)現(xiàn)
電路上比較清晰,下圖為測(cè)井儀器數(shù)據(jù)采傳原理框圖:
最直接的初級(jí)方案
最直接的方案是所有人都能想到的方案,就是采集、計(jì)算、發(fā)送按部就班的進(jìn)行,如下圖所示。
每一個(gè)周期要作的事情就是:ADC采集一段波形,然后進(jìn)行計(jì)算,主要是一些數(shù)字濾波、FFT、DPSD之類(lèi)的數(shù)字信號(hào)處理,最終將結(jié)果數(shù)據(jù)按協(xié)議格式打包通過(guò)McBSP(TI DSP專(zhuān)有的通信接口)發(fā)送給同軸以太網(wǎng)通信模塊。我們當(dāng)然希望這個(gè)周期越短越好,這需要將一些步驟優(yōu)化壓縮。
加入DMA的優(yōu)化方案
上面的方案,仔細(xì)看一下就會(huì)發(fā)現(xiàn),它的所有操作都是需要CPU參與的,大量的時(shí)間都在等待外設(shè)。如何降低CPU的參與度,把其寶貴的時(shí)間不要浪費(fèi)在空等上,而放在核心算法的計(jì)算上,如下圖所示:
我們首先由CPU參與完成一次波形采集,然后開(kāi)始針對(duì)采集數(shù)據(jù)進(jìn)行計(jì)算,因?yàn)樯婕按罅扛↑c(diǎn)數(shù)據(jù)的數(shù)字信號(hào)處理,所以計(jì)算過(guò)程會(huì)比較花時(shí)間,一次計(jì)算大約需要花費(fèi)10ms。與此同時(shí),我們適時(shí)的不斷啟動(dòng)ADC轉(zhuǎn)換,在其轉(zhuǎn)換的時(shí)間間隙里進(jìn)行計(jì)算,然后直接啟動(dòng)SPI-DMA傳輸來(lái)讀取ADC的轉(zhuǎn)換數(shù)據(jù),而CPU不用去等DMA傳輸完成,可以利用DMA傳輸?shù)臅r(shí)間進(jìn)行計(jì)算,最后回過(guò)頭來(lái)立即進(jìn)行下一次計(jì)算,因?yàn)榇藭r(shí)新的波形已經(jīng)準(zhǔn)備好了。這樣,一個(gè)周期的時(shí)間可以壓縮到10ms,采樣率比原來(lái)提高了一倍。
振南是想通過(guò)這個(gè)實(shí)例來(lái)告訴大家:CPU的運(yùn)行時(shí)間是寶貴的,將片上的硬件資源充分的利用起來(lái)將可以釋放出更多的CPU時(shí)間來(lái)作更有意義的事情。一些技巧和DMA的合理運(yùn)用是行之有效的辦法。
其實(shí)很多時(shí)候能被用來(lái)發(fā)揮的硬件資源并不只限于片內(nèi),我們自己設(shè)計(jì)一些簡(jiǎn)單的片外電路加以輔助,有時(shí)候可以達(dá)到意想不到的效果,請(qǐng)往下看。
2. 巧驅(qū)攝像頭
0x01
攝像頭時(shí)序分析
我知道很多人都對(duì)攝像頭模塊感興趣,想用單片機(jī)驅(qū)動(dòng)一下試試效果,但是作成功的并不多,下圖為比較盛行的OV7670攝像頭模塊和模組:
究其原因有幾點(diǎn):1、攝像頭CMOS芯片的時(shí)序較為復(fù)雜;2、SCCB通信及相關(guān)寄存器的配置;3、時(shí)序過(guò)快,而且是按其固有頻率主動(dòng)輸出,難于捕捉和采集數(shù)據(jù)。
它的時(shí)序有多快,我們來(lái)看下圖所示的OV7670的時(shí)序圖:
OV7670在VGA模式下可達(dá)到的最高幀率30fps,即每秒鐘產(chǎn)生30幀640X480尺寸的圖像。從官方資料上得知VGA模式下實(shí)際輸出的行數(shù)為510,每行輸出的像素?cái)?shù)為784(多出來(lái)的行數(shù)與像素?cái)?shù)是多余的,其數(shù)據(jù)是無(wú)效的,我們只關(guān)注HREF為高電平期間的像素?cái)?shù)據(jù))。這樣,PCLK的時(shí)鐘周期為1/(30510784*2)=41.7ns。想要用一般單片機(jī)的GPIO來(lái)直接采集像素?cái)?shù)據(jù),幾乎是不可能的,因?yàn)镮O與CPU的速度都不夠快。
0x02
使用DCMI+DMA
要讀取攝像頭如此高速的數(shù)據(jù),必須要有專(zhuān)門(mén)的硬件。我們可以選用ST的STM32F4系列單片機(jī),它內(nèi)置了DCMI(數(shù)字?jǐn)z像頭模塊接口),使用它將可以很輕松的完成圖像獲取的功能。它要配合DMA來(lái)工作,如下圖示:
DCMI獲取攝像頭數(shù)據(jù),可以通過(guò)DMA直接將數(shù)據(jù)保存到內(nèi)部RAM或外部的SDRAM,甚至直接寫(xiě)入到TFT中,實(shí)現(xiàn)圖像的實(shí)時(shí)動(dòng)態(tài)顯示。而在整個(gè)過(guò)程中,CPU只不過(guò)在作一些配置性的工作,并沒(méi)有參與圖像數(shù)據(jù)采集和傳輸。所以,用高端芯片會(huì)使我們的開(kāi)發(fā)工作如虎添翼,事半功倍。就是因?yàn)樗懈鼜?qiáng)大的硬件外設(shè)來(lái)為我們完成特定的功能實(shí)現(xiàn)。當(dāng)然,更強(qiáng)大的硬件也意味著更多的學(xué)習(xí)成本,我們需要仔細(xì)學(xué)習(xí)如何正確的使用它來(lái)達(dá)到想要的效果。
有些時(shí)候,硬件外設(shè)電路甚至比CPU內(nèi)核更復(fù)雜,比如有些多媒體編解碼SOC,CPU內(nèi)核只是51或M0,片上更大的面積是諸如H.264之類(lèi)的編解碼電路。所以,作嵌入式開(kāi)發(fā)的工程師,首先要充分了解自己手上有哪些硬件資源,而不要所有功能都純依靠CPU來(lái)實(shí)現(xiàn)。
0x03
自搭外部電路
本節(jié)的名字是“巧驅(qū)攝像頭”,上面所介紹的方案都不算不上一個(gè)“巧”字。上述方案中必須要求單片機(jī)有DCMI之類(lèi)的專(zhuān)用硬件,那不用DCMI可不可以?比如拿普通的51或低端的M0單片機(jī),可不可以實(shí)現(xiàn)對(duì)攝像頭的驅(qū)動(dòng)。答案是肯定的,不過(guò)這需要我們?cè)谕獠侩娐飞献餍┦帜_,如下圖所示為通過(guò)片外并行FIFO+時(shí)序調(diào)理實(shí)現(xiàn)圖像采集:
配合下面的流程圖,大家就知道其巧妙之處了,如下圖所示為通過(guò)片外并行FIFO實(shí)現(xiàn)一幀數(shù)據(jù)的獲取:
程序按上圖描述的邏輯運(yùn)行之后,一幀圖像就存到FIFO中了。此時(shí)單片機(jī)可以慢慢從讀取端(并行FIFO分為寫(xiě)入端與讀取端,分別對(duì)應(yīng)的有寫(xiě)指針與讀指針)讀到圖像數(shù)據(jù)了。這樣CPU和IO的速度就再也不是瓶頸。通過(guò)這樣的機(jī)制,任何單片機(jī)都可以輕松實(shí)現(xiàn)圖像采集了。
在此過(guò)程中,CPU都干了什么?似乎只有等待幀同步信號(hào)VSYNC和操作幾個(gè)IO。這種方式比DCMI+DMA更省CPU(DMA實(shí)際上會(huì)占用一半的片內(nèi)數(shù)據(jù)總線(xiàn)帶寬,使CPU的運(yùn)行效率降低),而且更靈活,對(duì)單片機(jī)硬件的依賴(lài)更小。
3. 單片機(jī)巧驅(qū)7寸大液晶屏
通過(guò)上面幾個(gè)實(shí)例,大家應(yīng)該知道振南所謂“巧驅(qū)”的路數(shù)了吧,對(duì),就是多讓硬件說(shuō)話(huà),我們要作“軟硬兼施”的工程師。
OK,如果我問(wèn)大家:“我能用51或M0單片機(jī),驅(qū)動(dòng)7寸大屏液晶(800*480),如圖6.10,并且流暢播放視頻,你信不信?”你一定會(huì)說(shuō):“不太可能吧,刷屏速率不夠。”但我既然這么問(wèn),那振南一定是已經(jīng)實(shí)現(xiàn)了,這里我就把實(shí)現(xiàn)過(guò)程給大家講一下。
先來(lái)看原理圖,下圖為巧驅(qū)7寸液晶屏原理圖之MCU部分:
下圖為巧驅(qū)7寸液晶屏原理圖之74HC595串轉(zhuǎn)并部分:
下圖為巧驅(qū)7寸液晶屏原理圖之八8進(jìn)制計(jì)數(shù)與時(shí)序調(diào)理部分:
下圖為巧驅(qū)7寸液晶屏原理圖之spiFlash與7寸TFT接口部分:
基本的實(shí)現(xiàn)邏輯如圖6.15所示。
仔細(xì)觀察上面的原理圖與邏輯框圖,估計(jì)很多人已經(jīng)明白了振南的意思,振南再給出配套的流程圖,邏輯就更清晰了,如下圖所示:
兩片74HC595用于將16位串行數(shù)據(jù)轉(zhuǎn)換為并行,與TFT液晶的16位數(shù)據(jù)接口相連。74HC595的串行數(shù)據(jù)輸入同時(shí)與MCU的兩個(gè)GPIO以及spiFlash的兩個(gè)串行數(shù)據(jù)端口相連。當(dāng)spiFlash失能時(shí)(即CS置高),其數(shù)據(jù)端口呈現(xiàn)高阻,此時(shí)74HC595可由MCU操作;而當(dāng)MCU的GPIO設(shè)置為高阻時(shí),兩片74HC595可分別接收來(lái)自spiFlash的雙位串行數(shù)據(jù)。這樣的復(fù)用設(shè)計(jì),可以使MCU對(duì)TFT液晶進(jìn)行預(yù)先的初始化,使其工作在純像素?cái)?shù)據(jù)寫(xiě)入的模式;而在高速數(shù)據(jù)寫(xiě)入的階段,MCU退出而讓TFT接收來(lái)自spiFlash的數(shù)據(jù)。
兩片74HC595實(shí)現(xiàn)串轉(zhuǎn)并的要點(diǎn)在于LC鎖存信號(hào)的產(chǎn)生,每產(chǎn)生8個(gè)SCK脈沖,則自動(dòng)產(chǎn)生一個(gè)LC上上升沿,這是時(shí)序生成與理調(diào)邏輯的一部分。實(shí)現(xiàn)的根本在于74HC161與74HC27的組合運(yùn)用,如圖6.13。首先對(duì)74HC161復(fù)位清零,此時(shí)[Q2:Q0]=000,74HC27是三輸入或非門(mén),其輸出1Y,即595-LC為1;時(shí)鐘的輸入后[Q2:Q0]隨之自增001、010 …… 在000之前595-LC均為0,而8個(gè)時(shí)鐘之后,595-LC將變?yōu)?,即產(chǎn)生了上升沿。這里振南給595-LC增加了兩級(jí)74HC1G32作為緩沖,為的是增加一些延時(shí),以使74HC595的存鎖數(shù)據(jù)輸出更穩(wěn)定。
然后是液晶的WR信號(hào)的產(chǎn)生:從圖6.12中可以看到,WR信號(hào)是一個(gè)GPIO與八位計(jì)數(shù)器輸出最高位Q2的或非非(沒(méi)錯(cuò),是或非非)。當(dāng)Q2為0時(shí),WR受控于GPIO,此時(shí)可用于MCU對(duì)TFT預(yù)先進(jìn)行初始化操作。當(dāng)GPIO為0時(shí),WR受控于Q2,每8個(gè)時(shí)鐘會(huì)產(chǎn)生一個(gè)下降沿(前面那個(gè)或非非是為了推遲一下這個(gè)下降沿,以使16位并行數(shù)據(jù)寫(xiě)入液晶更穩(wěn)定),并維持4個(gè)時(shí)鐘周期。
基本的要點(diǎn)已經(jīng)描述清楚了。至于時(shí)鐘的產(chǎn)生,唯一的要求是要產(chǎn)生特定數(shù)量的時(shí)鐘,而不能是連續(xù)不斷的。比如一幀圖像的數(shù)據(jù)量為800*480半字,我們要輸出3072000個(gè)時(shí)鐘才能讓一幀圖像顯示到液晶上。所以我們不能用MCO或者是PWM,而要用SPI,如果是8位SPI,要寫(xiě)384000次,如果是16位SPI,則要寫(xiě)192000次。當(dāng)然,為了節(jié)省更多的CPU資源,我們可以使用DMA。當(dāng)時(shí)鐘不斷的產(chǎn)生,一幀幀的圖像顯示到液晶上時(shí),視頻就流暢的播放出來(lái)了。
我曾經(jīng)把我這個(gè)“巧驅(qū)大屏”的實(shí)驗(yàn)講給了我的同事聽(tīng),他們?cè)谫潎@的同時(shí),還說(shuō):“你不作FPGA真是浪費(fèi)了!”其實(shí)我是作過(guò)一段時(shí)間的FPGA的,那還是在2007年在Intel中國(guó)研究院實(shí)習(xí)工作的時(shí)候。
好了,本章用3個(gè)實(shí)例闡述了本章最開(kāi)頭的那句話(huà):CPU時(shí)間是寶貴的,我們要把有限的CPU時(shí)間投入到更有意義的事情中去。
實(shí)際開(kāi)發(fā)中,充分地利用硬件資源,自行靈活擴(kuò)展一些硬件電路,通常可以達(dá)到意想不到的效果,甚至可以化不可能為可能。
永遠(yuǎn)記住:我們很多時(shí)候作的是嵌入式軟件的工作,但歸根結(jié)底我們搞的還是硬件。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5150文章
19665瀏覽量
317454 -
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124443 -
cpu
+關(guān)注
關(guān)注
68文章
11077瀏覽量
217030 -
接口
+關(guān)注
關(guān)注
33文章
9000瀏覽量
153714 -
SPI
+關(guān)注
關(guān)注
17文章
1804瀏覽量
95922
原文標(biāo)題:CPU,你省省心吧!
文章出處:【微信號(hào):嵌入式攻城獅,微信公眾號(hào):嵌入式攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
介紹幾個(gè)是常用的DMA傳輸路徑
人工智能設(shè)備減輕影像科醫(yī)生的工作負(fù)擔(dān)
釋放改革紅利,減輕用戶(hù)電費(fèi)負(fù)擔(dān)
可穿戴式機(jī)器人助力救災(zāi)活動(dòng),減輕了人體腰部40%的負(fù)擔(dān)
PMU如何通過(guò)執(zhí)行任務(wù)減輕主CPU的負(fù)荷
如何進(jìn)行CPU內(nèi)部Flash讀寫(xiě)的實(shí)例資料說(shuō)明

減輕家務(wù)負(fù)擔(dān),手持吸塵器哪個(gè)牌子好
巴士駕駛員輔助系統(tǒng)減輕工作負(fù)擔(dān)
集成電路設(shè)計(jì)助于減輕電源設(shè)計(jì)人員的負(fù)擔(dān)

利用無(wú)線(xiàn)電源減輕戰(zhàn)場(chǎng)電池負(fù)擔(dān)
通過(guò)幾個(gè)實(shí)例分析如何解電磁兼容ESD問(wèn)題?

請(qǐng)問(wèn)DMA控制器可以減輕CPU負(fù)擔(dān)嗎?

評(píng)論