嵌入式Linux開發和裸機開發有何不同
時間:2023-10-23 來源:華清遠見
初學嵌入式開發的同學,經常面臨嵌入式學習是從裸機開發入手還是從嵌入式Linux入手,二者有何差異的困擾。那我們今天就來從軟件開發的角度來聊聊二者的區別。
我們來看什么是嵌入式Linux開發和裸機開發的概念。電子技術從出現至今發展飛快,從Intel開發出第一塊芯片開始,人類進入了電子信息時代。芯片內有集成電路,使用電子信號0和1的組合表示信息,進行運算處理。芯片有自己的指令集,不同的指令進行不同的操作,指令就是輸入給芯片的0和1信號。這些指令由程序員來設計編寫,芯片通過執行這一系列指令來執行任務。所以,最初的程序就是機器碼,由CPU直接訪問指令的存儲地址,然后執行。執行結果是輸出的計算結果或者控制外部硬件或外設的動作。然后程序語言升級,由匯編語言升級為C語言,更易閱讀理解和編寫。軟件控制硬件,如果硬件改了,軟件也要改。不同的硬件配置,也需要不同的驅動程序,這樣的沖突需要通過制定標準來減少,當標準不斷完善,功能更加清晰,各個硬件外設或者軟件模塊發展更加成熟。慢慢的,不斷完善的底層的、支持性的軟件模塊組合在一起,構成了操作系統。操作系統的目的之一,就是屏蔽硬件的差異化,使編程人員在OS之上寫代碼,而不用具體理解硬件的細節或差異。這會大大提高軟件的開發效率,提高軟件質量,加快軟件推向市場。所謂的裸機開發指的就是在你的開發板上不跑任何操作系統,直接面向硬件編程,而嵌入式Linux開發指的就是在開發板上運行Linux系統,在此基礎上進一步做軟件開發。
實際開發項目中到底是選擇嵌入式Linux還是裸機開發呢?如果實現的業務邏輯比較簡單,直接使用裸機編程就好了,如果應用業務邏輯很復雜,就需要使用OS了,一般在嵌入式OS中Linux系統得到了最為廣泛的使用。
裸機程序就是程序或軟件直接在硬件上運行,可以直接面對硬件進行操作。就像單片機開發里面,GPIO、IIC、SPI等,都是用代碼直接操作寄存器來完成相應的功能。包括中斷也要自己處理。內存也是自己直接分配使用,整個地址空間是透明的統一的。這種一般都是簡單的處理器芯片,Micro Controller Unit 簡稱MCU。但現在的情況,這種單片機的開發,廠商都會提供開發包,里面有各種現成的各種外設操作或相關應用的參考樣例,減少了開發難度。同時,也有很多庫可以使用,減少開發工作量。比如ARM-M0芯片開發時,開發IDE里就會link一個微型的標準C庫,一些基本函數可以直接調用,比如字符串操作等。
在嵌入式Linux里,程序是運行在Linux Kernel之上的。kernel是操作系統的核心,幾乎控制了系統中的一切。軟件和硬件的各種操作都要經過kernel。程序開發包括內核優化、系統移植、驅動開發、應用程序開發等多方面。用戶一般創建的是應用程序(User Space Applications), 是無法直接訪問硬件,所以需要通過Kernel Space的驅動程序來訪問控制硬件。在User space中,所見的只是一大塊內存和Kernel的接口。這樣做的最大好處就是user space applications是硬件無關的。Kernel的核心職責和操作:進程管理、內存管理、進程間通信、設備驅動、電源管理等,這些功能需要內核開發工程師、驅動開發工程師來完成。
使用嵌入式Linux的優缺點。使用嵌入式Linux操作系統有著諸多的好處:
代碼安全性提高。普通單片機程序開發,寫錯一個控制指針或者數組操作越界,整個系統就掛掉了。但用OS的話,有內存保護功能,不同的進程不會影響到對方的內存。OS能夠使運行的程序的一些任務在supervisor模式下運行,一些任務在用戶模式下運行,權限不同,降低操作風險。
集成了大量的外設驅動,開發時對底層硬件的驅動控制可以不用操心或者改動很少。這樣提高了程序的可移植性,上層應用程序是硬件無關的。即使這個設備沒有驅動,在OS上進行驅動開發也會容易很多,有參考模板、有可復用函數等。
對多線程或多進程的支持,包括優先級管理。這部分功能如果要自己實現顯然很復雜并不能保證性能和穩定性。當然也有一些RTOS系統能支持thread,這是一個選擇問題,選擇自己需要的、喜歡的、合適的、長期有效的技術生態。
OS上已經實現和集成了很多可用的庫,減少我們的工作量,更快更有效的完成軟件開發工作。同樣,基于OS已有的庫,會跟容易開發出更強的庫,這樣不斷加強,使得選擇更多,自己的應用可以借用第三方的庫,減少風險提高效率。
Linux操作系統有很強的可裁剪性,便于不同的規模的應用選擇需要的功能或模塊。
Linux是行業通用的,應用廣泛的,接受度高,生態完善,還是免費。
當然事務都是兩面性的,使用嵌入式Linux OS也有一些顯而易見的缺點:
相對小規模應用來講系統太復雜了。
相對裸機開發來說,學習曲線太陡峭
系統會不斷更新升級,要注意整個Linux Kernel和相關庫的版本管理。
相對裸機程序,Linux OS是個通用系統,內部機制為眾所知,所以要注意安全和保護問題。
裸機開發的優缺點正好與嵌入式Linux開發相反。比如裸機存在著同樣硬件條件下代碼執行效率更高,小規模應用開發簡單、快速,可靠性更高等優點。同樣的隨著軟件規模和功能的增加其開發的復雜度成指數級上升,沒有對多線程的支持也會使得實現復雜業務邏輯顯得可望不可及。
從就業的崗位上來看嵌入式Linux開發是當前嵌入式領域中非常熱門和重要的一個方向,相關崗位有:
嵌入式Linux驅動工程師:主要負責針對特定硬件平臺,開發和優化驅動程序,以便與硬件設備通信,并實現更好的性能和穩定性。
嵌入式Linux應用開發工程師:主要負責設計和實現嵌入式應用程序,如物聯網終端、智能家居系統、智能交通系統等。
嵌入式系統架構師:主要負責整個嵌入式系統的軟硬件架構設計、方案評估、平臺選擇、資源協調等相關工作。
嵌入式解決方案工程師:主要負責結合客戶需求、技術資源和市場情況,為客戶提供完整的嵌入式解決方案,包括硬件選型、軟件支持、系統集成等。
裸機開發是嵌入式領域中的關鍵技術之一,相關崗位有:
嵌入式軟件工程師:負責開發和維護裸機程序,在沒有操作系統支持的情況下針對特定硬件平臺進行開發。
嵌入式硬件工程師:負責開發和維護硬件電路設計,為嵌入式設備提供數據采集、存儲等基礎功能支持。
嵌入式系統架構師:負責整個嵌入式系統的軟硬件架構設計、方案評估、平臺選擇、資源協調等相關工作。
嵌入式系統優化工程師:負責優化系統性能和功耗,并針對系統限制優化算法,縮小代碼和內存占用。
嵌入式應用開發工程師:主要負責嵌入式應用程序的設計和實現,如智能家居控制器、自動駕駛汽車控制器等。
給初學者的建議。建議小白學員可以從裸機開發入手,它的學習難度較低,可以更直接的體會到軟件控制硬件、軟硬件協同工作的過程。在短期內就可以完成一些簡單功能開發,提高學習興趣,為后續嵌入式Linux環境下軟件開發打下堅實基礎。而嵌入式Linux開發由于學習周期長,技術要求高,更容易拿到更高的薪資待遇,是小白學員學習的追求的終極目標。^_^

