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