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