電子發(fā)燒友網(wǎng)訊:自上次在本站獨(dú)家報(bào)道的《單片機(jī)“低能”,請(qǐng)不要詆毀操作系統(tǒng)!》,得到大家的積極認(rèn)可與熱烈反響。部分電子發(fā)燒友網(wǎng)讀者紛紛來(lái)郵件表示意猶未盡,要求再次深入淺出地對(duì)單片機(jī)與OS進(jìn)行探討。在此,電子發(fā)燒友網(wǎng)編輯部再次邀請(qǐng)音視頻技術(shù)專家及芯片設(shè)計(jì)專家潘昶,以最擅長(zhǎng)的音頻領(lǐng)域?yàn)槔ū疚闹饕婕?a target="_blank">嵌入式播放系統(tǒng)),為各位讀者分享技術(shù)心得,以饗讀者。
單片機(jī)”低能”后續(xù)
本文相對(duì)有一定的專業(yè)性,如果非理工科的讀者看起來(lái)會(huì)很費(fèi)工夫,筆者盡量深入淺出的進(jìn)行分析,希望讓大部分讀者能看明白。
目前針對(duì)部分廠家混淆概念的說(shuō)法,這里從理論上分析一下單片機(jī)(或者說(shuō)裸奔)和操作系統(tǒng)的區(qū)別。從網(wǎng)絡(luò)的宣傳上看,無(wú)非單片機(jī)族的理論根據(jù)是單片機(jī)可以“單線程”進(jìn)行播放和解碼。從而杜絕jitter(時(shí)基抖動(dòng))的問(wèn)題。以筆者從事單片機(jī)/嵌入式系統(tǒng)設(shè)計(jì)超過(guò)15年的經(jīng)驗(yàn),從理論上分析一下,這個(gè)Jitter是如何產(chǎn)生的,是否多線程會(huì)產(chǎn)生Jitter呢?
何謂線程?
因?yàn)橐粋€(gè)CPU只有一個(gè)ALU(算術(shù)邏輯單元),因此要同時(shí)響應(yīng)不同的事件,就要引進(jìn)“線程”的概念,所謂線程就是CPU針對(duì)多個(gè)任務(wù),實(shí)行分時(shí)分段執(zhí)行多個(gè)任務(wù)的一個(gè)機(jī)制。舉個(gè)很簡(jiǎn)單的例子,假如有10個(gè)任務(wù),完成每個(gè)任務(wù)的執(zhí)行時(shí)間都是10個(gè)時(shí)間單位,理論上總執(zhí)行時(shí)間就是10x10=100個(gè)時(shí)間單位,如果單線程執(zhí)行,就是順序執(zhí)行這些任務(wù),第一個(gè)任務(wù)在10的時(shí)間單位完成,第二個(gè)在20的時(shí)間單位完成,如此類推,最后一個(gè)在時(shí)間點(diǎn)100的時(shí)間單位完成,而分時(shí)執(zhí)行,就是每個(gè)任務(wù)都執(zhí)行1個(gè)時(shí)間單位,然后切換到另外一個(gè)任務(wù)執(zhí)行,那么在最后的時(shí)候,第一個(gè)任務(wù)在91的時(shí)間點(diǎn)完成,第二個(gè)任務(wù)在92的時(shí)間點(diǎn)完成,最后一個(gè)任務(wù)在100的時(shí)間點(diǎn)完成。我們舉的例子比較特殊,運(yùn)行時(shí)間都一樣,但實(shí)際上,絕大部分的程序運(yùn)行時(shí)間都不一樣,因此,如果最短運(yùn)行時(shí)間的程序最后一個(gè)執(zhí)行,等待的時(shí)間就會(huì)很漫長(zhǎng),線程的概念因此而來(lái),如果有一個(gè)運(yùn)行時(shí)間為2 的線程替換剛剛的執(zhí)行隊(duì)列中的一個(gè)任務(wù),那么就會(huì)在20-30之間完成那個(gè)最短的程序,節(jié)省了用戶等待的時(shí)間,線程因此得到迅速的發(fā)展。
何謂Jitter?
數(shù)字電路為了防止“競(jìng)爭(zhēng)冒險(xiǎn)”,引進(jìn)了邊緣觸發(fā)的概念,通過(guò)時(shí)鐘沿進(jìn)行信號(hào)的讀取以及輸出。而信號(hào)沿和信號(hào)沿之間的時(shí)間如果固定的話,就不會(huì)有Jitter的存在,所謂jitter就是時(shí)鐘沿之間產(chǎn)生的稍微的不同,一般在納秒(1x10-9秒)甚至皮秒(1x10-12秒)這個(gè)數(shù)量級(jí)。而音頻信號(hào)需要嚴(yán)格根據(jù)時(shí)鐘沿恢復(fù)采樣的信號(hào),因此,Jitter在數(shù)字音頻里面的影響是至關(guān)重要的。
單線程播放是否可能?
我們可以說(shuō),單線程播放,對(duì)播放器來(lái)說(shuō),理論上是完全不可能的。從文件到i2s輸出,中間的環(huán)節(jié)我們列舉一下:
1. 讀文件(4)
2. 顯示(2)
3. 解碼(10)
4. 連續(xù)的數(shù)字信號(hào)輸出(2)
5. 等待客戶操作(1)
以上的任務(wù)后面括號(hào)里面的數(shù)字表示需要的時(shí)間,紅色的字代表要求實(shí)時(shí)性最高的一個(gè)環(huán)節(jié),而在這個(gè)環(huán)節(jié)里面產(chǎn)生的Jitter都會(huì)嚴(yán)重影響輸出的質(zhì)量,那么我們?nèi)绾芜M(jìn)行單線程播放呢?
讀文件-》顯示-》解碼-》輸出-》判斷用戶操作-》讀文件。
這就是我們需要做的。注意,我們的輸出是需要連續(xù)輸出的,也意味著,44.1KHz的采樣率下面,每個(gè)位輸出是 44.1KHzx2(2聲道)x24(24位采樣數(shù)據(jù))= 2.116800MHz的速率,而時(shí)間就是其倒數(shù),一般目前的芯片在輸出端有FIFO(先進(jìn)先出緩沖器),如果FIFO的深度是64的話,供給I2S的數(shù)據(jù)間隔就必須小于2.1168M/64=33.075KHz。因?yàn)橹袛囗憫?yīng)是有時(shí)間要求的,實(shí)際上和44KHz差不多的數(shù)據(jù)頻率是可以讓FIFO保持不拉空。
咱就說(shuō)說(shuō)這些數(shù)據(jù)是通過(guò)什么方式進(jìn)FIFO的吧,F(xiàn)IFO是硬件做的,耗用資源以及芯片面積較大,因此一般都不會(huì)很大,而APE/FLAC解碼是根據(jù)一個(gè)個(gè)的“包”來(lái)的,也就是你不能想要多少就要多少,必須得解碼好的數(shù)據(jù)放在內(nèi)存里面等待 FIFO,以保證FIFO不被拉空,這樣才能保持播放的連續(xù)性,因?yàn)镕IFO響應(yīng)是通過(guò)中斷方式的,響應(yīng)速度是微秒級(jí)別(CPU要進(jìn)行壓棧等處理才能切換過(guò)來(lái)),因此可以說(shuō)數(shù)據(jù)送FIFO和其他幾個(gè)任務(wù)肯定就是并發(fā)多線程的,那何來(lái)單線程?在44.1KHz的間隔,是不可能完成讀文件-》解碼的過(guò)程的,這是事實(shí)。
所以如果誰(shuí)說(shuō)單線程能進(jìn)行解碼,請(qǐng)給出一個(gè)完整的理論模型,否則都是空談。
再者,一個(gè)Linux操作系統(tǒng),參與開(kāi)發(fā)的都是頂尖的高手的大團(tuán)隊(duì)過(guò)10年的維護(hù),國(guó)內(nèi)一個(gè)山寨廠幾個(gè)技術(shù)人員短短兩三年的時(shí)間就能比別人的操作系統(tǒng)更好,反正我是不相信這樣的神話。
操作系統(tǒng)是否可以實(shí)時(shí)?
實(shí)時(shí)操作系統(tǒng)基本上滿足實(shí)時(shí)的需求,這里所謂的實(shí)時(shí),并不是0響應(yīng)時(shí)間,而是在一定的響應(yīng)時(shí)間內(nèi)做出反應(yīng)就算實(shí)時(shí)。實(shí)時(shí)的定義筆者沒(méi)有看到過(guò)有很嚴(yán)格的要求。操作系統(tǒng)需要處理的事情很多,比如任務(wù)調(diào)度,MMU管理等等。這里我們需要重點(diǎn)說(shuō)說(shuō)MMU(內(nèi)存管理單元)在現(xiàn)代嵌入式芯片的舉足輕重的作用,MMU是協(xié)助嵌入式CPU的一個(gè)重要的輔助管理系統(tǒng),有了MMU才能夠讓CPU不介入而讓內(nèi)存的數(shù)據(jù)自由存儲(chǔ)。而單片機(jī)族所瞄準(zhǔn)的Jitter主要就針對(duì)內(nèi)存的延時(shí)。的確,Microsoft的不開(kāi)放的操作系統(tǒng),內(nèi)部的管理我們不得而知,但是Linux開(kāi)源的系統(tǒng)來(lái)說(shuō),要怎么優(yōu)化就可以怎么優(yōu)化,只要把音頻播放的通道提高到最高優(yōu)先級(jí),那么就不會(huì)對(duì)Jitter有太大的影響。針對(duì)解碼的動(dòng)作,操作系統(tǒng)會(huì)預(yù)先把文件讀取了,然后解碼后放在內(nèi)存某一個(gè)地方,MMU會(huì)在不影響任何應(yīng)用程序的情況下自動(dòng)往FIFO派送數(shù)據(jù),這個(gè)動(dòng)作因?yàn)镸MU的存在,而完全實(shí)現(xiàn)了“并行”執(zhí)行,從而可以做到“實(shí)時(shí)”。所以現(xiàn)代的CPU有多強(qiáng),并不是看其運(yùn)算速度有多高,而是其協(xié)處理單元有多少,能解決什么問(wèn)題。說(shuō)個(gè)題外話:全志的A10芯片,雖然才1G的運(yùn)算速度,但是以其低功耗,也能完成Intel X7800 CPU對(duì)1080p電影的解碼,就是因?yàn)橛薪獯a的硬件協(xié)處理器協(xié)助完成的。
PC HIFI的特點(diǎn)
·不開(kāi)放的系統(tǒng)(多是Windows的系統(tǒng)),內(nèi)部操作不的而知
·輸出通道過(guò)長(zhǎng)(CPU+MEMORY+北橋+聲卡)
·風(fēng)扇噪音大
·CPU速度很高
·內(nèi)存很大
以上特點(diǎn),黑色部分是PC HIFI的絆腳石,而紅色部分是PC HIFI的優(yōu)勢(shì)。因此PC HIFI只要能夠通過(guò)外置的解碼器,適當(dāng)?shù)倪M(jìn)行FIFO的擴(kuò)大就可以解決PC系統(tǒng)的弊端,還是可以做好的,當(dāng)然了,在環(huán)保和易用性的方面,還是沒(méi)有專用播放器方便罷了。
嵌入式播放系統(tǒng)和普通CD對(duì)比的不足以及優(yōu)勢(shì)
從上表可以看到,CD的優(yōu)勢(shì)就是牌子響,客戶群體高,新的播放器容易被老的消費(fèi)群體所排斥,使用方便性也不如CD機(jī)。同時(shí)因?yàn)椴シ牌鞯脑O(shè)計(jì)復(fù)雜,還在發(fā)展的階段,所以不容易做好。
如何才能做好一個(gè)播放器?
但是不容易做好,并非不能做好,市面上不乏比CD做得好的播放器。這個(gè)要從理論模型、理論基礎(chǔ)、軟件、硬件、PCB布線、器件選型、調(diào)音等各個(gè)環(huán)節(jié)進(jìn)行精心調(diào)整才能做好。而并非選擇什么單線程就能做到極限,隨便可以和某個(gè)價(jià)位的CD機(jī)叫板。
影響嵌入式播放器性能的瓶頸,的確如單片機(jī)族描述的:Jitter,但是降低Jitter并非通過(guò)單線程就能徹底解決,而是要從所選擇的芯片,軟硬件的架構(gòu),優(yōu)化的方式,對(duì)系統(tǒng)的了解程度綜合考慮的。
其次,必須要有足夠的設(shè)備作為參數(shù)的測(cè)試基準(zhǔn),雖然說(shuō)參數(shù)好聽(tīng)感不一定好,但是參數(shù)不好聽(tīng)感一定不好。要有參考對(duì)比的器材,否則做出來(lái)的產(chǎn)品,什么定位都說(shuō)不清楚,如何可以大言不慚可以和中高端CD機(jī)抗衡?如果真的標(biāo)榜能夠和中高檔的器材比較,請(qǐng)給出一個(gè)機(jī)器的測(cè)試參數(shù)以及測(cè)試圖,測(cè)試的對(duì)比環(huán)境,A/B對(duì)比盲聽(tīng)的結(jié)果,同時(shí)要有行家認(rèn)可,這樣才是真正過(guò)關(guān)的產(chǎn)品,而不是踩低別人抬高自己。
深耕技術(shù)是一個(gè)很漫長(zhǎng)很痛苦的過(guò)程,只有熬過(guò)這段時(shí)間才能收獲真正的成果。
——電子發(fā)燒友網(wǎng)版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處!
?
評(píng)論
查看更多