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