經(jīng)驗(yàn)豐富的嵌入式系統(tǒng)程序員已經(jīng)知道將代碼優(yōu)化到目標(biāo)平臺(tái)的大部分技巧,但是我們中的許多人相對(duì)較晚才接觸到嵌入式系統(tǒng)編程,因?yàn)槲覀冊(cè)谙拗戚^少的平臺(tái)上學(xué)習(xí)了我們的編碼技能。除了算法的一般效率之外,我們不必過多擔(dān)心硬件細(xì)節(jié),但在嵌入式應(yīng)用程序中,我們需要更加小心,當(dāng)然是為了性能,還要適應(yīng)我們想要做的實(shí)際限制我們的硬件目標(biāo),尤其是可用內(nèi)存的類型和大小。這些系統(tǒng)中的內(nèi)存是您必須將所有軟件和所有工作數(shù)據(jù)裝入其中的手提箱,而且手提箱通常比您希望的要小得多。
作為一個(gè)額外的復(fù)雜因素,這些系統(tǒng)中通常有不止一種類型的內(nèi)存。為了保持編程簡(jiǎn)單,您只看到一個(gè)邏輯內(nèi)存空間,但某些地址范圍可能以不同的方式在硬件中實(shí)現(xiàn)。一些空間可以實(shí)現(xiàn)為外部主存儲(chǔ)器,可以通過一級(jí)或多級(jí)高速緩存從處理器訪問。
一個(gè)常見的硬件優(yōu)化將實(shí)現(xiàn)另一個(gè)范圍作為緊耦合內(nèi)存 (TCM)。它與處理器位于同一芯片內(nèi),通常緊鄰該處理器。TCM 為存儲(chǔ)在該內(nèi)存中的任何指令或數(shù)據(jù)提供有保證的單時(shí)鐘周期訪問,這與標(biāo)準(zhǔn)內(nèi)存不同,標(biāo)準(zhǔn)內(nèi)存只有在指令/數(shù)據(jù)已經(jīng)在緩存中時(shí)才能提供該性能;否則它必須進(jìn)入主存儲(chǔ)器,花費(fèi)更多的時(shí)鐘周期。TCM 是(內(nèi)存映射)快速片上內(nèi)存的一個(gè)例子;還有其他用途,例如用于圖像處理中快速訪問的圖像緩沖區(qū)。
另一個(gè)考慮因素 - 使用片上存儲(chǔ)器可降低功耗,而使用主存儲(chǔ)器會(huì)消耗更多功率,這要?dú)w功于更高的電流來驅(qū)動(dòng)所有這些封裝引腳和芯片之間的電路板互連。這是低功耗應(yīng)用中的一個(gè)重要考慮因素。
為什么不只使用大的片上存儲(chǔ)器并從片外不頻繁地加載/存儲(chǔ)?不幸的是,大型片上存儲(chǔ)器顯著增加了芯片面積,并且隨著芯片尺寸的增長(zhǎng),該設(shè)備變得更加昂貴且競(jìng)爭(zhēng)力下降。系統(tǒng)架構(gòu)師必須非常小心地平衡性能增益與此成本,考慮他們是否可能僅提供 16KB 的 TCM 與可能多達(dá) 1MB 的 TCM。這讓程序員有很多責(zé)任要盡可能節(jié)儉和謹(jǐn)慎地使用或規(guī)劃這些存儲(chǔ)器(如果你在早期的芯片架構(gòu)中有發(fā)言權(quán)),尤其是在涉及到你想要的功能或數(shù)據(jù)時(shí)使用快速內(nèi)存。
您需要在這里做的一些事情是相當(dāng)明顯的;我假設(shè)您從基于 PC 的實(shí)現(xiàn)或?yàn)樵缙诋a(chǎn)品開發(fā)的實(shí)現(xiàn)開始。由于您顯然對(duì) DSP 感興趣,因此您可能計(jì)劃進(jìn)行大量浮點(diǎn)計(jì)算。盡可能將數(shù)據(jù)類型從雙精度減少到單精度;僅此一項(xiàng)就可能將數(shù)據(jù)大小減半。
臨時(shí)內(nèi)存池是一種一次性分配內(nèi)存塊以滿足多個(gè)較小相關(guān)分配需求的方法,它在分配和釋放速度方面很受歡迎,但在內(nèi)存方面可能非常昂貴。嘗試將所有這些合并到一個(gè)內(nèi)存池中,只要它們不并行使用或硬著頭皮返回堆上的傳統(tǒng)malloc;這可能會(huì)慢一些,但在內(nèi)存中效率會(huì)高很多。
特別是在 TCM 方面,分析代碼以找到消耗最多運(yùn)行時(shí)間的函數(shù)。您的策略將是從需求最高的功能開始,決定其中哪些可以適合 TCM。當(dāng)然,這里必須有一些判斷。如果一個(gè)高需求函數(shù)調(diào)用一個(gè)低需求函數(shù),你能負(fù)擔(dān)得起從緩存中拉出那個(gè)低需求函數(shù)嗎?只要緩存命中率很高,或者偶爾較長(zhǎng)的延遲是可以容忍的,這可能就可以了。
在支持 MP3 和 FLAC 解碼器的音樂播放器中,較長(zhǎng)的延遲可能是可以的。每首歌曲最多只能使用一個(gè),因此它們不需要都駐留在快速內(nèi)存中。接受延遲加載所需的任何內(nèi)容,按需從片外加載到快速存儲(chǔ)器中。
您希望將生產(chǎn)代碼和數(shù)據(jù)壓縮到盡可能小的大小,因此作為一般良好衛(wèi)生的一點(diǎn),請(qǐng)確保所有調(diào)試、分析和日志記錄代碼都包含在編譯指示中,這些編譯指示可以在生產(chǎn)構(gòu)建中禁用。在 PC 代碼中,您可能不會(huì)太擔(dān)心這一點(diǎn)(特別是如果您想在生產(chǎn)軟件上運(yùn)行調(diào)試器),但在這里它是必不可少的。相反,您還應(yīng)該確保在 禁用該代碼的情況下運(yùn)行所有回歸測(cè)試。只需要在調(diào)試中忽略一個(gè)運(yùn)行時(shí)依賴項(xiàng)即可創(chuàng)建下游噩夢(mèng)。
同樣,請(qǐng)確保您的軟件中的每一段代碼都在被使用。運(yùn)行覆蓋測(cè)試。如果您發(fā)現(xiàn)未使用的代碼,則可能是早期版本的遺留問題,可能需要它。這里不是,所以你應(yīng)該能夠擺脫它,對(duì)吧?再次,你必須小心。也許這是對(duì)一個(gè)不能忽視的非常罕見的情況的錯(cuò)誤處理。也許它應(yīng)該包含在回歸測(cè)試中,但直接觸發(fā)太難了。您必須根據(jù)與架構(gòu)師甚至硬件團(tuán)隊(duì)的討論做出決定。
最后,與架構(gòu)師(如果需要,還有營(yíng)銷人員)爭(zhēng)論他們要求包含哪些功能是真正必要的。他們可能沒有意識(shí)到,在您可能想到的每一次優(yōu)化之后,手提箱仍然不會(huì)關(guān)閉。然后他們將不得不決定可能不得不犧牲他們真正想要的真正酷的功能。或者,也許他們必須回到業(yè)務(wù)團(tuán)隊(duì)并要求更大的片上存儲(chǔ)器,使用您可以提供的關(guān)于這些存儲(chǔ)器需要增長(zhǎng)多少的信息。無論哪種方式,你都會(huì)看起來不錯(cuò)!
審核編輯 黃昊宇
-
dsp
+關(guān)注
關(guān)注
555文章
8142瀏覽量
355186 -
嵌入式
+關(guān)注
關(guān)注
5141文章
19526瀏覽量
314863
發(fā)布評(píng)論請(qǐng)先 登錄
如何在 Raspberry Pi AI Camera 上構(gòu)建為開發(fā)人員提供實(shí)時(shí)的智能應(yīng)用程序!

AWTK-WEB 快速入門(5) - C 語言 WebSocket 應(yīng)用程序

基于HPM_SDK_ENV開發(fā)應(yīng)用程序的升級(jí)處理

ANACONDA——關(guān)于發(fā)布數(shù)據(jù)應(yīng)用程序的新簡(jiǎn)單方法

BQ78412應(yīng)用程序編程接口

TAS2521應(yīng)用程序參考指南

android手機(jī)上emulate應(yīng)用程序的方法
AWTK-WEB 快速入門(2) - JS 應(yīng)用程序

AWTK-WEB 快速入門(1) - C 語言應(yīng)用程序

使用OpenVINO? ElectronJS中創(chuàng)建桌面應(yīng)用程序

PCM2912應(yīng)用程序的操作環(huán)境

為I2C啟動(dòng)加載準(zhǔn)備TMS320C645x應(yīng)用程序

將DSP/BIOS 5應(yīng)用程序遷移到SYS/BIOS 6

使用HIC啟用外圍擴(kuò)展應(yīng)用程序應(yīng)用說明

評(píng)論