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