量化節(jié)約的最簡單方法之一是BML:低成本零件要求公司花費(fèi)更少的錢來制造產(chǎn)品。在大多數(shù)嵌入式設(shè)計中,兩個最昂貴的部件通常是屏幕(如果設(shè)備有,大多數(shù)物聯(lián)網(wǎng)設(shè)備沒有)和處理器。隨著您向處理器添加更多內(nèi)存(閃存和 RAM),處理器的成本也會增加。雖然成本增加多少的具體細(xì)節(jié)因半導(dǎo)體公司而異,但粗略的經(jīng)驗法則是,每增加一倍內(nèi)存,處理器單位成本就會增加約一美元。
使這個問題變得更糟的是,嵌入式工程師通常不太擅長在應(yīng)用程序的設(shè)計階段預(yù)測內(nèi)存需求。這些對所需內(nèi)存量的最佳“猜測”是處理器選擇的關(guān)鍵因素。鑒于許多生產(chǎn)運(yùn)行每年達(dá)到數(shù)十萬或數(shù)百萬臺,在BML中增加不必要的美元會對公司的底線產(chǎn)生有害影響。
結(jié)果,無數(shù)項目“資源緊張”,這是“我們沒有正確預(yù)測內(nèi)存需求”的代碼。加劇這個問題的是,BML通常在項目開始時就被推薦給高層管理人員。一旦發(fā)生這種情況,成本就變得不可侵犯。這使人們爭先恐后地減少內(nèi)存占用,或者依靠采購來保持BML成本與管理層預(yù)期的相同,通過協(xié)商其他組件的更好價格。為了減少內(nèi)存占用,團(tuán)隊經(jīng)常求助于編譯器的優(yōu)化引擎來減小生成的代碼的大小。
提高編譯器優(yōu)化的標(biāo)準(zhǔn)
一些工程師非常不愿意加快優(yōu)化,因為他們認(rèn)為優(yōu)化會給系統(tǒng)帶來錯誤。這種情況很少發(fā)生,根據(jù)我的經(jīng)驗,大約 5% 的優(yōu)化器問題最終是優(yōu)化器的問題。
當(dāng)優(yōu)化級別提高時,編譯器對 C 和 C++ 語言的語義非常挑剔。優(yōu)化決策是基于對語言規(guī)則的嚴(yán)格解釋做出的。通常,工程師并沒有以他們看起來很自然的方式完全了解語言和代碼的所有細(xì)微差別。
例如,如果函數(shù)調(diào)用是這樣編寫的:
myFunc(varA, varB, varC, varD);
自然的假設(shè)是從左到右讀取變量:varA 將從內(nèi)存中讀取,然后是 varB 等。
但是,C 或 C++ 中沒有任何內(nèi)容表明必須如此。如果內(nèi)存是有目的地布置的,或者是偶然的,其中varB位于varD旁邊,那么高級優(yōu)化可能會使用索引寄存器來讀取連續(xù)的內(nèi)存空間,以節(jié)省代碼大小和速度。
在大多數(shù)情況下,這不會對代碼產(chǎn)生影響。但是,如果您依賴于從左到右編寫時要訪問的變量,則可能會出現(xiàn)代碼在較低優(yōu)化下運(yùn)行良好但在高級別無法正常運(yùn)行的情況。這就是工具供應(yīng)商提供的良好支持結(jié)構(gòu)可以幫助發(fā)現(xiàn)這些類型的問題并重寫代碼部分以更好地優(yōu)化和正常工作的地方,而與優(yōu)化設(shè)置無關(guān)。
此外,如果您的代碼可以在高優(yōu)化下工作,那么它編寫正確并且經(jīng)過更好的測試。如果代碼在更高的優(yōu)化下不起作用,則很有可能潛在缺陷正在等待“咬你”。
當(dāng)設(shè)置為高尺寸優(yōu)化時,好的工具可以節(jié)省 10-40% 的代碼大小。但是,并非所有優(yōu)化轉(zhuǎn)換都是任何代碼段的好選擇 - 某些轉(zhuǎn)換實際上可能會增加某些類型代碼的代碼大小。這本身就是一篇文章。
目前,有一些資源可以解決“從編譯器中獲得最少的資源”,這意味著最小大小的代碼和最緊湊的執(zhí)行時間。節(jié)省如此多的代碼空間可能是剝離功能以保持在設(shè)備尺寸內(nèi)、由于手動優(yōu)化代碼而錯過計劃或超出 BML 預(yù)算之間的區(qū)別。
雖然好的代碼可以在任何優(yōu)化級別上運(yùn)行相同的操作,但調(diào)試高度優(yōu)化的代碼在最好的情況下是很棘手的。例如,整個代碼段可以折疊到完全不同的位置的其他代碼段中。這就是為什么必須在低優(yōu)化或無優(yōu)化下調(diào)試代碼,并在增加優(yōu)化以運(yùn)行全部測試之前驗證代碼是否正常運(yùn)行的原因。
在 BML 中調(diào)試成本
使嵌入式調(diào)試變得困難的部分原因是,大多數(shù)人根本不知道他們武器庫中的所有調(diào)試工具。它們傾向于默認(rèn)使用 printf 語句和代碼斷點。在嘗試隔離硬故障、查找發(fā)生堆棧溢出的位置或找出變量不斷被破壞的原因時,這些默認(rèn)值無濟(jì)于事。
好消息是,存在特殊的工具可以幫助發(fā)現(xiàn)這些類型的問題。
處理硬故障
讓我們從硬故障開始。許多現(xiàn)代MCU都具有實時指令跟蹤功能,可讓您跟蹤指令流。在基于 Arm 的設(shè)備上,用于實現(xiàn)此目的的技術(shù)是嵌入式跟蹤宏單元 (ETM)。參考手冊將指示設(shè)備是否支持 ETM。如果是這樣,請將跟蹤引腳拉到調(diào)試標(biāo)頭,并使用啟用跟蹤的調(diào)試器(如 IAR I-jet 跟蹤),該調(diào)試器可以捕獲該實時指令流并將其顯示在調(diào)試器窗口中。
要查找導(dǎo)致硬故障的原因,只需滾動跟蹤窗口并找到在轉(zhuǎn)到錯誤處理程序之前執(zhí)行的指令。瞧!這個指示是罪魁禍?zhǔn)?。如果可以可靠地重現(xiàn)錯誤,請在錯誤處理程序處設(shè)置斷點并消除跟蹤窗口中的所有滾動 - 罪魁禍?zhǔn)资歉櫞翱谥械牡箶?shù)第二條指令。
現(xiàn)在原因已知,因此可以在罪魁禍?zhǔn)咨显O(shè)置斷點,并再次運(yùn)行測試用例,以查看導(dǎo)致異常的代碼出了什么問題。
但是,如果您沒有 ETM 怎么辦?大多數(shù)基于 Arm 的設(shè)備都具有串行線輸出 (SWO),允許采樣、低速跟蹤。雖然您沒有收到每一條指令,但這可以提供足夠的跟蹤信息來縮小范圍并定位問題。此外,嘗試降低MCU時鐘和/或調(diào)整SWO設(shè)置,以便從調(diào)試器中獲取更精細(xì)的跟蹤信息粒度,以查明問題發(fā)生的位置。
其他設(shè)備架構(gòu)具有與 ETM 或 SWO 類似的功能。因此,使用高質(zhì)量的工具可以利用這些信息并快速隔離和消除問題。此外,可用的支持資源有助于提高 SWO 的性能,以保護(hù)更多的跟蹤數(shù)據(jù)。
停止堆棧溢出
堆棧溢出或找出變量神秘丟失其內(nèi)容的原因怎么樣?使用相同的技術(shù)來診斷這兩種情況。
在 Arm 領(lǐng)域,大多數(shù)處理器在其調(diào)試接口中都有一個數(shù)據(jù)觀察點和跟蹤 (DWT) 塊,可用于快速隔離這些類型的問題。在這種情況下,請使用數(shù)據(jù)觀察點來找出壞事發(fā)生的地方。每當(dāng)接觸一段數(shù)據(jù)時,此觀察點本質(zhì)上就是一個斷點。
將選項配置為僅在讀取和/或?qū)懭霐?shù)據(jù)時中斷執(zhí)行。此外,甚至可以將其限制為僅在數(shù)據(jù)是具有特定位掩碼的特定值時才中斷。在避免每次訪問數(shù)據(jù)時都停止時,這非常方便。
在堆棧溢出的情況下,我們希望在堆棧頂部設(shè)置一個數(shù)據(jù)觀察點。讀取或?qū)懭朐撝挡⒉恢匾驗槎褩T诖a中的那個點已經(jīng)吹響了。處理器將在堆棧頂部停止執(zhí)行,提供一個完全保留的調(diào)用堆棧,允許查看哪一段代碼正在吹堆棧以及您如何到達(dá)該點。這是確定如何修復(fù)錯誤的關(guān)鍵。
清理整理數(shù)據(jù)
對于被破壞的數(shù)據(jù),我們使用基本相同的技術(shù),只是在該變量經(jīng)歷寫入時設(shè)置數(shù)據(jù)觀察點。如果始終使用相同的值進(jìn)行破壞,則進(jìn)一步縮小斷點的范圍,僅在將該值寫入變量時跳閘。然后,再次運(yùn)行我們的測試用例,找出導(dǎo)致問題的代碼。
同樣,許多其他架構(gòu)(如瑞薩電子RL78、RX和許多其他芯片供應(yīng)商的器件)具有類似的功能,可用于實現(xiàn)相同的結(jié)果。使用高質(zhì)量的工具,查找這些類型的問題變得更加容易,并增加了滿足緊迫的時間表和截止日期的幾率。
讓采購知道您的關(guān)心
事半功倍似乎是一個矛盾,但通過使用正確的工具可以輕松實現(xiàn)。通過使用編譯器優(yōu)化,您可以將代碼硬塞到盡可能小的空間中,以便為您的應(yīng)用程序使用最便宜的設(shè)備。
優(yōu)化還可以幫助桌面檢查您的代碼,以查看它在高優(yōu)化下是否運(yùn)行相同,以便在您將代碼簽入構(gòu)建之前找到潛在的代碼缺陷(從而使每個缺陷都計入您的發(fā)布指標(biāo))。它還通過使用完整的工具箱更快地查找錯誤來幫助您更有效地進(jìn)行調(diào)試,從而縮短測試和修復(fù)周期并更快地啟動項目。
如果您知道工具箱中有哪些工具(以及如何正確使用它們),您就可以讓每一分錢都為您的組織發(fā)揮作用。
審核編輯:郭婷
-
處理器
+關(guān)注
關(guān)注
68文章
19100瀏覽量
228816 -
C++
+關(guān)注
關(guān)注
21文章
2102瀏覽量
73453 -
編譯器
+關(guān)注
關(guān)注
1文章
1617瀏覽量
49015
發(fā)布評論請先 登錄
相關(guān)推薦
評論