David Katz, Tomasz Lukasiak, 和 Rick Gentile
隨著“開源”C/C++算法在嵌入式處理應(yīng)用中越來越流行地替代基于版稅的代碼,它們帶來了新的技術(shù)挑戰(zhàn)。其中最重要的是如何優(yōu)化獲取的代碼以在所選處理器上正常工作。這個問題至關(guān)重要,因?yàn)闉榻o定處理器系列編寫的編譯器將利用該處理器的優(yōu)勢,但代價可能是其他領(lǐng)域的低效率。當(dāng)同一算法直接在不同的平臺上開箱即用時運(yùn)行時,性能可能會降低。本文將探討如何將此類開源算法移植到ADI公司黑鰭金槍魚處理器?,在此過程中概述了導(dǎo)致代碼優(yōu)化的“攻擊計劃”。
什么是開源?
“開源”的普遍理解定義是指任何帶有源代碼的項(xiàng)目,可供其他程序員使用。開源軟件通常是在軟件程序員社區(qū)內(nèi)協(xié)作開發(fā)的,并自由分發(fā)。例如,Linux操作系統(tǒng)就是以這種方式開發(fā)的。如果一切順利,由此產(chǎn)生的工作將提供一個不斷發(fā)展的、經(jīng)過充分測試的健壯應(yīng)用程序,因?yàn)樵S多不同的應(yīng)用程序都利用了代碼。鼓勵程序員使用代碼,因?yàn)樗麄儾槐馗顿M(fèi)或自己開發(fā)代碼,從而加快了他們的項(xiàng)目進(jìn)度。他們成功使用代碼提供了進(jìn)一步的測試信息。
“開源”的認(rèn)證印章歸開源促進(jìn)會(OSI)所有。如果分發(fā)條款符合 OSI 的開源定義,則為自由共享和改進(jìn)而開發(fā)的代碼可以使用開源商標(biāo)。這要求根據(jù)某些準(zhǔn)則將軟件重新分發(fā)給其他人。例如,在通用公共許可證(GPL)下,必須提供源代碼,以便其他開發(fā)人員能夠改進(jìn)或發(fā)展它。
什么是奧格?
有一個完整的開發(fā)人員社區(qū),他們致力于為數(shù)字媒體創(chuàng)建開放標(biāo)準(zhǔn)和應(yīng)用程序的事業(yè)。其中一個團(tuán)體是 Xiph.Org 基金會,這是一家非營利性公司,其目的是支持和開發(fā)免費(fèi)、開放的協(xié)議和軟件,為公眾、開發(fā)者和商業(yè)市場服務(wù)。這個傘式組織負(fù)責(zé)監(jiān)督視頻(Theora)、音樂(有損Vorbis和無損Flac)和語音(Speex)編解碼器等技術(shù)的管理。
術(shù)語 Ogg 表示保存多媒體數(shù)據(jù)的容器格式。它通常用作生成數(shù)據(jù)的特定編解碼器的前綴。Vorbis,我們將在這里討論的一種音頻編解碼器,它使用Ogg將其比特流存儲為文件,因此通常稱為“Ogg Vorbis”。事實(shí)上,一些便攜式媒體播放器被宣傳為支持 OGG 文件,其中“Vorbis”部分是隱含的。Speex是下面討論的語音編解碼器,它也使用Ogg格式將其比特流作為文件存儲在計算機(jī)上。但是,互聯(lián)網(wǎng)協(xié)議語音(VoIP)和其他實(shí)時通信系統(tǒng)不需要文件存儲功能,并且使用實(shí)時傳輸協(xié)議(RTP)等網(wǎng)絡(luò)層來封裝這些流。因此,即使是 Vorbis 在通過多播分發(fā)服務(wù)器通過網(wǎng)絡(luò)傳輸時也會丟失其 Ogg shell。
什么是沃比斯?
Vorbis 是一種完全開放、無專利、免版稅的音頻壓縮格式。在許多方面,它在功能上與無處不在的MPEG-1 / 2第3層(MP3)格式和較新的MPEG-4(AAC)格式非常相似。該編解碼器專為中到高質(zhì)量(8 kHz 至 48 kHz 帶寬,>16 位,復(fù)音)音頻而設(shè)計,比特率為 16 至 128 kbps/通道,因此它是音樂的理想格式。
最初的 Vorbis 實(shí)現(xiàn)是使用浮點(diǎn)算法開發(fā)的,主要是因?yàn)?a target="_blank">編程簡單,導(dǎo)致發(fā)布速度更快。由于大多數(shù)電池供電的嵌入式系統(tǒng)(如便攜式MP3播放器)使用更便宜,電池效率更高的定點(diǎn)處理器,因此開源開發(fā)人員社區(qū)創(chuàng)建了Vorbis解碼器的定點(diǎn)實(shí)現(xiàn)。這個定點(diǎn)Vorbis解碼器的源代碼被稱為Tremor,是在允許將其合并到開源和商業(yè)系統(tǒng)中的許可證下發(fā)布的。
在選擇用于移植 Vorbis 解碼器的特定定點(diǎn)架構(gòu)之前,分析從壓縮比特流恢復(fù)音頻所涉及的處理類型非常重要。Vorbis 解碼過程(和其他類似算法)的通用處理器流程如圖 2 所示。像許多其他解碼算法一樣,有兩個主要階段:前端和后端。
圖2.Vorbis 解碼過程的通用處理器流。
在前端階段,主要活動是標(biāo)頭和數(shù)據(jù)包解包、表查找和霍夫曼解碼。這類操作涉及大量的條件代碼和相對較大的程序空間,因此嵌入式開發(fā)人員通常使用微控制器作為前端。
后端處理由篩選函數(shù)、逆變換和常規(guī)向量運(yùn)算定義。與前端階段相比,后端階段涉及更多的循環(huán)構(gòu)造和內(nèi)存訪問,通常使用較少的代碼。由于這些原因,嵌入式系統(tǒng)中的后端處理歷來由成熟的DSP主導(dǎo)。
Blackfin處理器架構(gòu)統(tǒng)一了微控制器(MCU)和DSP功能,因此不再需要兩個獨(dú)立的設(shè)備。它可以有效地用于在單個芯片上實(shí)現(xiàn)前端和后端處理。
什么是斯皮克斯?
Speex 是一種開源、無專利的音頻壓縮格式,專為語音而設(shè)計。雖然Vorbis用于壓縮所有類型的音樂和音頻,但Speex僅針對語音。出于這個原因,Speex在相同質(zhì)量水平的語音上可以比Vorbis取得更好的結(jié)果。
正如Vorbis與MP3和AAC等基于版稅的算法競爭一樣,Speex與GSM-EFR和G.72x算法(如G.729和G.722)共享語音編解碼器市場的空間。Speex還具有大多數(shù)其他編解碼器中不存在的許多功能。其中包括可變比特率 (VBR)、在同一比特流(8 kHz、16 kHz 和 32 kHz)中集成多個采樣率以及立體聲編碼支持。此外,Speex最初的設(shè)計目標(biāo)是促進(jìn)與互聯(lián)網(wǎng)應(yīng)用程序的整合,因此它是VoIP電話系統(tǒng)中非常強(qiáng)大的組件。
除了其獨(dú)特的技術(shù)特性外,Speex還具有“無成本”的主要優(yōu)勢,并且可以分發(fā)和修改以符合特定的應(yīng)用。源代碼在類似于Vorbis的許可證下分發(fā)。由于項(xiàng)目的維護(hù)者意識到將 Speex 嵌入到小型定點(diǎn)處理器中的重要性,因此在主代碼分支中合并了定點(diǎn)實(shí)現(xiàn)。
優(yōu)化黑鰭金槍魚處理器上的 Vorbis 和 Speex
當(dāng)現(xiàn)有應(yīng)用程序(如 Vorbis 或 Speex)移植到新處理器時,即時的“開箱即用”代碼性能是最重要的考慮因素。但是,軟件工程師可以通過熟悉可用于優(yōu)化整體性能的許多技術(shù)來獲得豐厚的回報。有些只需要最少的額外努力。
將任何軟件移植到像Blackfin這樣的嵌入式處理器的第一步是定制低級I / O例程以滿足系統(tǒng)需求。例如,Vorbis 和 Speex 的參考代碼都假設(shè)數(shù)據(jù)源自文件,并且處理后的輸出存儲到文件中(主要是因?yàn)檫@兩種實(shí)現(xiàn)最初都是為在 Unix/Linux 系統(tǒng)上運(yùn)行的,其中文件I/O 例程可用)。然而,在嵌入式媒體系統(tǒng)中,輸入和/或輸出通常連接到在數(shù)字和現(xiàn)實(shí)世界模擬域之間進(jìn)行轉(zhuǎn)換的A/D和D/A數(shù)據(jù)轉(zhuǎn)換器。圖 3 顯示了可能的基于 Vorbis 的媒體播放器實(shí)現(xiàn)的概念概述。輸入比特流從閃存?zhèn)鬏敚獯a器輸出驅(qū)動音頻DAC。此外,雖然某些媒體應(yīng)用程序(例如便攜式音樂播放器)仍然使用文件來存儲數(shù)據(jù),但許多系統(tǒng)用網(wǎng)絡(luò)連接取代了存儲。
圖3.示例:Vorbis 媒體播放器實(shí)現(xiàn)。
在優(yōu)化像 Vorbis 解碼器這樣的系統(tǒng)以高效運(yùn)行時,最好有一個有組織的攻擊計劃。一種可能性是首先從 C 中優(yōu)化算法,然后簡化系統(tǒng)數(shù)據(jù)流,最后在匯編級別調(diào)整各個代碼片段。圖 4 說明了通過連續(xù)優(yōu)化步驟減少處理器負(fù)載的代表性,并顯示了此方法的效率。
圖4.在Blackfin上優(yōu)化Vorbis源代碼的步驟,導(dǎo)致處理器利用率顯著降低。
編譯器優(yōu)化
代碼優(yōu)化最有用的工具可能是好的探查器。使用 Blackfin 的 VisualDSP++ 中的統(tǒng)計分析器,程序員可以快速關(guān)注處理器執(zhí)行代碼時變得明顯的熱點(diǎn)。在許多實(shí)現(xiàn)中,20% 的代碼占用了 80% 的處理時間。專注于這些關(guān)鍵部分會產(chǎn)生最高的邊際回報。事實(shí)證明,循環(huán)是像 Vorbis 這樣的媒體算法中優(yōu)化的主要候選者,因?yàn)槊芗臄?shù)字處理通常發(fā)生在它們內(nèi)部。
還有全局代碼優(yōu)化方法。首先,編譯器可以針對內(nèi)存節(jié)省或速度進(jìn)行優(yōu)化。此外,還可以考慮將匯編指令自動內(nèi)聯(lián)到 C 代碼中的函數(shù)。(編譯器的 inline 關(guān)鍵字用于指示函數(shù)應(yīng)在調(diào)用點(diǎn)內(nèi)聯(lián)生成代碼。這樣做可以避免各種成本,例如程序流延遲、函數(shù)進(jìn)入和退出指令以及參數(shù)傳遞開銷。這也在空間和速度之間產(chǎn)生了權(quán)衡。最后,像Blackfin這樣的編譯器可以使用兩階段過程來派生單個項(xiàng)目中各種源文件之間的關(guān)系,以進(jìn)一步加快代碼執(zhí)行(過程間分析)。
如上所述,大多數(shù)媒體算法參考軟件都使用浮點(diǎn)運(yùn)算。但是,使用分?jǐn)?shù)定點(diǎn)機(jī)編寫的軟件仍然錯過了一個關(guān)鍵部分。大多數(shù)編解碼器算法選擇的語言是 C,但 C 語言并不“原生”支持使用分?jǐn)?shù)定點(diǎn)數(shù)據(jù)。因此,許多分?jǐn)?shù)定點(diǎn)算法都使用整數(shù)數(shù)學(xué)進(jìn)行仿真。這可能會使代碼具有高度的可移植性,但它無法達(dá)到通過使用特定于機(jī)器的編譯器構(gòu)造重寫某些數(shù)學(xué)函數(shù)以實(shí)現(xiàn)最高計算效率來實(shí)現(xiàn)的性能。
圖 5 顯示了說明這一點(diǎn)的具體示例。左列顯示了適用于所有整數(shù)機(jī)器的模擬小數(shù)算術(shù)的 C 代碼和 Blackfin 編譯器輸出。一次調(diào)用來執(zhí)行 32 位小數(shù)乘法需要 80 個周期。右列顯示了利用 (mult_fr1x32x32) 獲得的性能改進(jìn),( 是 Blackfin 編譯器的固有功能,它利用了底層小數(shù)硬件。通過這種相當(dāng)簡單的修改,實(shí)現(xiàn)了 86% 的加速。
圖5.編譯器內(nèi)部函數(shù)是一個重要的優(yōu)化工具。
系統(tǒng)優(yōu)化
系統(tǒng)優(yōu)化始于適當(dāng)?shù)膬?nèi)存布局。在最好的情況下,所有代碼和數(shù)據(jù)都可以放入處理器的L1內(nèi)存中。遺憾的是,這并不總是可行的,尤其是在網(wǎng)絡(luò)應(yīng)用程序中實(shí)現(xiàn)基于 C 的大型應(yīng)用程序時。
真正的困境是處理器經(jīng)過優(yōu)化,可以通過直接內(nèi)存訪問(DMA)獨(dú)立于內(nèi)核移動數(shù)據(jù),但MCU程序員通常使用緩存模型運(yùn)行。雖然核心提取是不可避免的現(xiàn)實(shí),但必須使用 DMA 或緩存進(jìn)行大型傳輸以保持性能。
為了介紹討論,讓我們考慮Blackfin總線架構(gòu)固有支持的幾個屬性。首先是無需核心干預(yù)即可仲裁請求的能力。由于內(nèi)部存儲器通常構(gòu)建在子庫中,因此通過將數(shù)據(jù)放置在單獨(dú)的組中,可以在單個周期內(nèi)完成DMA控制器和內(nèi)核的同時訪問。例如,內(nèi)核可以對一個子銀行中的數(shù)據(jù)進(jìn)行操作,而DMA正在填充第二個子銀行中的新緩沖區(qū)。在某些情況下,也可以同時訪問同一子銀行。
通常只有一條物理總線可用于訪問外部存儲器。因此,仲裁功能變得更加重要。這里有一個例子來闡明這一挑戰(zhàn):在任何給定的周期中,可以訪問外部存儲器位置以填充指令緩存,同時它充當(dāng)傳入和傳出數(shù)據(jù)的源和目的地。
指令執(zhí)行
Blackfin處理器使用分層內(nèi)存架構(gòu),努力平衡具有不同大小和性能水平的多個內(nèi)存級別。片上 L1 存儲器最接近核心處理器,以全時鐘速率運(yùn)行。此存儲器可以配置為SRAM和/或緩存。需要最高確定性的應(yīng)用可以在單個內(nèi)核時鐘周期內(nèi)訪問片內(nèi)SRAM。對于需要更大代碼大小的系統(tǒng),可以使用額外的片上和片外存儲器,但延遲會增加。
SDRAM比L1 SRAM慢,但它是存儲大型程序和數(shù)據(jù)緩沖區(qū)所必需的。但是,程序員有幾種方法可以利用快速 L1 內(nèi)存。如果目標(biāo)應(yīng)用程序直接適合 L1 內(nèi)存,則除了程序員將應(yīng)用程序代碼直接映射到此內(nèi)存空間之外,不需要執(zhí)行任何特殊操作,如上述 Vorbis 示例所示。
如果應(yīng)用程序代碼對于內(nèi)部存儲器來說太大,例如在將網(wǎng)絡(luò)組件添加到 Vorbis 編解碼器時,可以使用緩存機(jī)制來允許程序員訪問更大、更便宜的外部存儲器。緩存可根據(jù)需要自動將代碼導(dǎo)入 L1 內(nèi)存。一旦進(jìn)入L1,代碼就可以在單個內(nèi)核周期內(nèi)執(zhí)行,就像它最初存儲在片上一樣。此過程的主要優(yōu)點(diǎn)是程序員不必管理代碼進(jìn)出緩存的移動。
當(dāng)正在執(zhí)行的代碼本質(zhì)上是線性的時,最好使用緩存。指令緩存實(shí)際上執(zhí)行兩個角色。首先,它有助于以更有效的方式從外部存儲器預(yù)取指令。此外,由于緩存通常使用某種類型的“最近最少使用”算法運(yùn)行,因此運(yùn)行次數(shù)最多的指令通常保留在緩存中。因此,如果代碼已提取一次并且尚未被替換,則下次通過循環(huán)執(zhí)行它將準(zhǔn)備好執(zhí)行。
謹(jǐn)慎的實(shí)時程序員不信任緩存來獲得最佳系統(tǒng)性能,因?yàn)槿绻谛枰獔?zhí)行時緩存中沒有指令塊,系統(tǒng)性能就會下降。通過利用緩存鎖定機(jī)制可以避免此問題。當(dāng)關(guān)鍵指令加載到緩存中時,可以鎖定緩存行以防止指令被替換。這允許程序員將他們需要的東西保存在緩存中,并允許緩存機(jī)制本身管理不太關(guān)鍵的指令。此功能使Blackfin處理器與其他信號處理器區(qū)分開來。
數(shù)據(jù)管理
在討論了如何最好地管理代碼以提高此應(yīng)用程序的性能之后,現(xiàn)在讓我們考慮數(shù)據(jù)移動的選項(xiàng)。作為緩存的替代方法,可以使用獨(dú)立于內(nèi)核的 DMA 控制器將數(shù)據(jù)移入和移出 L1 內(nèi)存。當(dāng)內(nèi)核在內(nèi)存的一部分上運(yùn)行時,DMA 將引入下一個要處理的數(shù)據(jù)緩沖區(qū)。
Blackfin數(shù)據(jù)存儲器架構(gòu)對整體系統(tǒng)性能的重要性不亞于指令時鐘速度。由于多媒體應(yīng)用中通常同時發(fā)生多個數(shù)據(jù)傳輸,因此總線結(jié)構(gòu)必須支持對內(nèi)部和外部存儲器所有區(qū)域的內(nèi)核和DMA訪問。自動處理 DMA 控制器和內(nèi)核的仲裁至關(guān)重要,否則性能將大大降低。內(nèi)核到 DMA 交互只需在設(shè)置 DMA 控制器時進(jìn)行,稍后在準(zhǔn)備好處理數(shù)據(jù)時響應(yīng)中斷。此外,數(shù)據(jù)緩存還可以提高整體性能。
在默認(rèn)模式下,Blackfin將數(shù)據(jù)獲取作為基本的核心功能執(zhí)行。雖然這通常是傳輸數(shù)據(jù)的效率最低的機(jī)制,但它導(dǎo)致了最簡單的編程模型??焖贂捍嫫鞔鎯ζ魍ǔW鳛?L1 存儲器的一部分提供;但對于較大的片外緩沖區(qū),如果內(nèi)核必須獲取所有內(nèi)容,則訪問時間將受到影響。不僅需要多個周期來獲取數(shù)據(jù),而且核心也將忙于獲取。
因此,只要有可能,DMA 應(yīng)始終用于移動數(shù)據(jù)。Blackfin處理器具有DMA功能,可在外設(shè)和內(nèi)存之間以及不同內(nèi)存段之間傳輸數(shù)據(jù)。例如,我們的 Vorbis 實(shí)現(xiàn)使用 DMA 將音頻緩沖區(qū)傳輸?shù)揭纛l D/A 轉(zhuǎn)換器。
對于此音頻應(yīng)用,使用“旋轉(zhuǎn)門”雙緩沖方案來容納 DMA 引擎。當(dāng)循環(huán)雙緩沖器的一半被串行端口DMA清空時,另一半被解碼的音頻數(shù)據(jù)填充。為了限制壓縮數(shù)據(jù)的解碼速率,DMA 中斷服務(wù)例程 (ISR) 修改解碼器可以讀取的信號量,以確保寫入雙緩沖區(qū)的特定一半是安全的。在缺少操作系統(tǒng) (OS) 的設(shè)計中,輪詢信號量意味著浪費(fèi) CPU 周期;但是,在操作系統(tǒng)下,調(diào)度程序可以切換到另一個任務(wù)(如用戶界面),以使處理器忙于實(shí)際工作。
如果不考慮數(shù)據(jù)一致性,使用 DMA 可能會導(dǎo)致不正確的結(jié)果。因此,與音頻 DAC 關(guān)聯(lián)的音頻緩沖區(qū)放置在不可緩存的內(nèi)存空間中,因?yàn)榫彺婵赡鼙4娴臄?shù)據(jù)版本比 DMA 要傳輸?shù)木彌_區(qū)更新。
裝配優(yōu)化
優(yōu)化的最后階段與用匯編語言重寫開源 C 代碼的隔離段有關(guān)。通過程序集重寫提高性能的最佳候選者通常是中斷服務(wù)例程 (ISR) 和可重用的信號處理模塊。
在匯編中編寫中斷處理程序的動力是,低效的 ISR 會減慢其他中斷處理程序的響應(yīng)速度。例如,某些音頻設(shè)計必須使用音頻 ISR 來格式化綁定到音頻 DAC 的 AC97 數(shù)據(jù)。由于這種情況會定期發(fā)生,因此較長的音頻 ISR 可能會減慢其他事件的響應(yīng)速度。減少中斷處理程序的周期計數(shù)的最佳方法是在匯編中重寫它。
可重用信號處理模塊的一個很好的例子是后端Vorbis處理中使用的改進(jìn)的離散余弦變換(MDCT),用于將時域信號轉(zhuǎn)換為頻域表示。編譯器永遠(yuǎn)無法像熟練的匯編程序員那樣生成“緊湊”的代碼,因此 MDCT 的 C 版本效率低下。同一函數(shù)的匯編版本可以利用Blackfin架構(gòu)的硬件功能,例如單周期蝶形加減法和硬件位反轉(zhuǎn)。
今天,Vorbis和Speex的Blackfin端口都存在,并可根據(jù)要求提供。這些端口在ADSP-BF533 EZ-KIT Lite上運(yùn)行。μClinux的開源端口也可在 blackfin.uclinux.org 獲得??傊鼈冎С指鞣N應(yīng)用程序,這些應(yīng)用程序?qū)で蠹擅獍娑惖恼Z音或音樂功能,同時為其他特性和功能保留充足的處理空間。例如,新型ADSP-BF536和ADSP-BF537集成以太網(wǎng)MAC,為低成本網(wǎng)絡(luò)音頻和語音應(yīng)用打開了大門。顯然,開源代碼預(yù)示著嵌入式處理世界的一場革命,Blackfin處理器準(zhǔn)備充分利用這種情況。
審核編輯:郭婷
-
處理器
+關(guān)注
關(guān)注
68文章
19440瀏覽量
231324 -
嵌入式
+關(guān)注
關(guān)注
5096文章
19189瀏覽量
308036
發(fā)布評論請先 登錄
相關(guān)推薦
如何計算處理器在應(yīng)用程序中執(zhí)行多行所花費(fèi)的時間?
香山是什么?“香山” 高性能開源 RISC-V 處理器項(xiàng)目介紹
在Cortex-M55處理器上進(jìn)行IP選擇和軟件開發(fā)示例分享
遠(yuǎn)程網(wǎng)絡(luò)處理器應(yīng)用程序的詳細(xì)資料免費(fèi)下載
![遠(yuǎn)程網(wǎng)絡(luò)<b class='flag-5'>處理器</b><b class='flag-5'>應(yīng)用程序</b>的詳細(xì)資料免費(fèi)下載](https://file.elecfans.com/web1/M00/58/DC/o4YBAFtgJNuAQrojAABf-U1oleA648.png)
遠(yuǎn)程網(wǎng)絡(luò)處理器應(yīng)用程序和與自定義應(yīng)用程序的詳細(xì)資料免費(fèi)下載
![遠(yuǎn)程網(wǎng)絡(luò)<b class='flag-5'>處理器</b><b class='flag-5'>應(yīng)用程序</b>和與自定義<b class='flag-5'>應(yīng)用程序</b>的詳細(xì)資料免費(fèi)下載](https://file.elecfans.com/web1/M00/59/0A/pIYBAFthfxCAFqa0AABL120_p7E277.png)
如何提高開源嵌入式處理應(yīng)用程序的性能
![如何提高<b class='flag-5'>開源</b>嵌入式<b class='flag-5'>處理應(yīng)用程序</b>的<b class='flag-5'>性能</b>](https://file.elecfans.com/web1/M00/8D/85/pIYBAFyiQpGAX0b2AAAWfyj3sMQ237.gif)
設(shè)計技術(shù)增強(qiáng)開關(guān)組件中的隔離
![設(shè)計技術(shù)<b class='flag-5'>增強(qiáng)開</b>關(guān)組件<b class='flag-5'>中</b>的隔離](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1 for SPI
![用于移動<b class='flag-5'>應(yīng)用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1 for SPI](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1for UART 接口
![用于移動<b class='flag-5'>應(yīng)用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1for UART 接口](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1for Image Composer
![用于移動<b class='flag-5'>應(yīng)用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1for Image Composer](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1 for Timer
![用于移動<b class='flag-5'>應(yīng)用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1 for Timer](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1for MICROWIRE
![用于移動<b class='flag-5'>應(yīng)用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1for MICROWIRE](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1for Camera Interface
![用于移動<b class='flag-5'>應(yīng)用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1for Camera Interface](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1 for PDMA
![用于移動<b class='flag-5'>應(yīng)用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1 for PDMA](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論