構(gòu)建自己的嵌入式開發(fā)模版的五個(gè)理由
一開始,開發(fā)人員從零開始創(chuàng)建所有的代碼,這是困難的,耗時(shí)的,痛苦的。開發(fā)人員努力工作,微控制器供應(yīng)商生成構(gòu)建環(huán)境和平臺(tái)來抽象低級(jí)別的啟動(dòng)代碼和構(gòu)建環(huán)境。開發(fā)人員很高興,現(xiàn)在能夠更快地編寫他們的應(yīng)用程序代碼。雖然提供預(yù)配置的構(gòu)建環(huán)境是有幫助的,但是有五個(gè)原因,開發(fā)團(tuán)隊(duì)?wèi)?yīng)該考慮構(gòu)建自己的C/C++環(huán)境,而不是使用他們的單片機(jī)供應(yīng)商提供的環(huán)境。
理由1-了解你的應(yīng)用程序的基礎(chǔ)
許多單片機(jī)供應(yīng)商在創(chuàng)建開發(fā)平臺(tái)方面做了很多工作,他們的客戶可以使用這些平臺(tái)開發(fā)嵌入式產(chǎn)品。畢竟,如果客戶完成了所有通常在每個(gè)產(chǎn)品上完成的工作,比如編寫鏈接器腳本、啟動(dòng)代碼、鏈接標(biāo)準(zhǔn)庫(kù)和初始化微控制器,他們將從中受益。客戶可以忽略這個(gè)標(biāo)準(zhǔn)代碼,而專注于更快地編寫他們的應(yīng)用程序,這將使他們更快地進(jìn)入市場(chǎng),并且,一般來說,銷售更多的微控制器。
我看到的問題是,開發(fā)人員忽略了底層代碼,忽略了他們的構(gòu)建環(huán)境是如何工作的,甚至忽略了與項(xiàng)目相關(guān)的內(nèi)容!更糟糕的是,供應(yīng)商編寫的代碼是作為通用代碼開發(fā)出來的,是一個(gè)適合所有解決方案的"一刀切"。這可能不適合任何一個(gè)特定的應(yīng)用。
創(chuàng)建您的構(gòu)建環(huán)境,在這里您編寫鏈接器,啟動(dòng)代碼,設(shè)置C/C++運(yùn)行時(shí),并創(chuàng)建您的制作文件,確保您了解您的應(yīng)用程序和環(huán)境的基礎(chǔ)。你知道哪里有什么原因。您知道您使用什么程序集和C/C++標(biāo)記來構(gòu)建應(yīng)用程序以及原因。實(shí)際上,您甚至將了解C/C++運(yùn)行時(shí)環(huán)境,以及它如何影響代碼大小和執(zhí)行效率。如果你只使用你所提供的東西,或者回顧其中的東西,你就會(huì)錯(cuò)過一些重要的細(xì)節(jié)。
原因2-代碼優(yōu)化
默認(rèn)情況下,提供給開發(fā)人員的許多構(gòu)建環(huán)境可能被配置為嵌入式開發(fā),但它們通常被配置為通用解決方案。該解決方案旨在滿足一般開發(fā)商或公司的需求。不幸的是,結(jié)果往往是代碼膨脹,不需要庫(kù)函數(shù),甚至是復(fù)雜的讀取代碼。例如,看看很多供應(yīng)商提供的代碼。它們將包括來自C庫(kù)的標(biāo)準(zhǔn)系統(tǒng)調(diào)用,如打印機(jī)、退出、殺死、讀、寫等。使用這些系統(tǒng)調(diào)用的最小實(shí)現(xiàn)可以很容易地添加超過10千字節(jié)的代碼空間。也許這對(duì)許多團(tuán)隊(duì)來說并不是什么大問題,因?yàn)樗麄兪褂么笮?2位處理器,但是對(duì)于其他嵌入式產(chǎn)業(yè),這可能會(huì)制造或破壞一個(gè)應(yīng)用程序!(從閃爍著LED的平臺(tái)代碼創(chuàng)建一個(gè)基線項(xiàng)目并發(fā)現(xiàn)它編譯到超過60千字節(jié)的代碼,這種情況并不少見!)。
另一個(gè)優(yōu)化開發(fā)人員經(jīng)常忽略了默認(rèn)情況下不會(huì)進(jìn)入構(gòu)建系統(tǒng)的小性能技巧。例如,如果我使用具有特殊的無等待RAM的部件,我可能會(huì)設(shè)置我的啟動(dòng)代碼,將中斷向量放到無等待RAM中,以便從我的中斷中獲得更高效、確定性的運(yùn)行時(shí)行為。不幸的是,我經(jīng)常看到的由供應(yīng)商提供的代碼并沒有做到這一點(diǎn)。如果您不構(gòu)建或仔細(xì)檢查您的環(huán)境,您將浪費(fèi)時(shí)鐘周期,并可能增加系統(tǒng)的響應(yīng)時(shí)間。原因#3-更容易與快速和DevOps流程的集成
使用快速和開發(fā)是一個(gè)必要的過程,正在許多嵌入式團(tuán)隊(duì)中流行。在嵌入式社區(qū)中獲得動(dòng)力的快速方法包括測(cè)試驅(qū)動(dòng)開發(fā)(TDD)。開發(fā)人員開發(fā)計(jì)劃所包含的不僅僅是持續(xù)集成和持續(xù)部署(CI/CD),但這也是我遇到的大多數(shù)團(tuán)隊(duì)都專注的地方。
使用單片機(jī)供應(yīng)商提供的環(huán)境,利用TDD和CI/CD可能會(huì)更麻煩和復(fù)雜。這是因?yàn)樗麄儧]有考慮你需要遵循哪些流程來交付產(chǎn)品,只是你需要什么來讓他們的處理器啟動(dòng)和運(yùn)行。結(jié)果可能是一個(gè)構(gòu)建環(huán)境,不能很好地與你的其他過程和需求相匹配。我見過團(tuán)隊(duì)為了讓所有這些過程和工具都能很好地結(jié)合在一起而艱難地通過各種解決方案,有時(shí)甚至是雙重環(huán)境。
理由4-靈活性
有時(shí)候,我發(fā)現(xiàn)一個(gè)已經(jīng)為我建立的環(huán)境很難定制。有時(shí),整個(gè)構(gòu)建系統(tǒng)中有太多的小掛鉤,因此自定義它所需的時(shí)間是從頭開始所需時(shí)間的兩倍。例如,您可能希望禁用一個(gè)庫(kù),但卻發(fā)現(xiàn)這樣做會(huì)導(dǎo)致幾十個(gè)編譯錯(cuò)誤,迫使研究時(shí)間去解決。
我發(fā)現(xiàn)一個(gè)有幫助的靈活性方法是IDI靈活性。我經(jīng)常發(fā)現(xiàn)不同的開發(fā)人員對(duì)于他們想要使用的IDES和文本編輯器有不同的偏好。例如,一個(gè)人可能喜歡崇高的文本,另一個(gè)視覺工作室的代碼,或另一個(gè)供應(yīng)商提供的IDI。開發(fā)人員經(jīng)常爭(zhēng)論,試圖獲得他們喜歡的工具作為團(tuán)隊(duì)的選擇。如果您構(gòu)建您的環(huán)境,每個(gè)人都可以使用他們的首選工具,這有助于提高開發(fā)人員的效率。
理由5-構(gòu)建系統(tǒng)定制
我相信建立自己的C+C++環(huán)境的最大原因是能夠定制它。正如我提到的,沒有兩個(gè)項(xiàng)目是相同的。有些共同點(diǎn)是存在的,但是您可以通過定制構(gòu)建系統(tǒng)來顯著地提高代碼的大小和性能。有時(shí),在你從頭開始之前,你無法理解需要什么樣的定制。自定義您的C/C++環(huán)境和構(gòu)建系統(tǒng)的能力可以顯著影響您的項(xiàng)目的成功。
結(jié)論
為嵌入式應(yīng)用程序創(chuàng)建定制構(gòu)建系統(tǒng)有許多好處。今天我們探索了一些可能激起你興趣的東西。一開始,進(jìn)行這樣的努力可能看起來很復(fù)雜,并且充滿潛在的問題。幸運(yùn)的是,這個(gè)過程遠(yuǎn)沒有你想象的那么復(fù)雜。在不到一周的時(shí)間里,幾乎任何嵌入式處理器都可以研究和實(shí)現(xiàn)定制構(gòu)建系統(tǒng)。此外,該構(gòu)建系統(tǒng)是一個(gè)高度調(diào)整、優(yōu)化良好的系統(tǒng),可以幫助為您的應(yīng)用程序奠定基礎(chǔ),并構(gòu)建能夠支持您的產(chǎn)品數(shù)年的流程。