1. 程式人生 > >嵌入式linux應用的製作與韌體燒錄的概述

嵌入式linux應用的製作與韌體燒錄的概述

僅概述, 不對細節進行過多描述(不同的晶片平臺,細節也會略有不同,多說無益)。文章只有一個目的,就是對於新接觸linux SOC平臺的人,幫助他們明確目標,清晰思路,以便更迅速的切入到工作中;

很明顯,為了讓一個晶片工作起來,晶片需要程式。

一、關於嵌入式linux的SOC,晶片裡到底燒錄了哪些程式?又是如何製作這些程式的?

二、使用者的驅動程式在哪裡?如何載入的?使用者的應用程式在哪裡?如何自啟動的?

三、應用程式編寫過程中如何在晶片平臺上debug?程式如何固化到晶片上?

首先,針對第一個問題,嵌入式linux的SOC,整體架構,從操作的步驟上劃分,可以分為三大塊,也可以理解為,有三大塊程式需要固化(燒錄),

1. U-boot的固化

(雖然,LINUX核心也有引導程式碼,但是U-boot可以提供更便利的debug與updata,所以犧牲一些啟動速度是值得的。市面上大多數的SOC是有U-boot的);

作為新人,對U-BOOT有點陌生,是正常的。即使這樣,也不建議過多的去閱讀/瞭解U-boot。除非,工作的本身就是U-boot的維護及個性化升級。為什麼不建議去深入研究U-boot呢,原因很簡單,通常廠商會提供適用的原始碼、編譯步驟、固化工具/步驟;所以,新平臺,你需要做的,就是耐心的讀完廠家的操作指南;關於u-boot,在99%以上的應用場合裡,是一個幾近於標準不需要使用者做出修改的。

2. linux核心固化

對linux-kernel進行必要的裁剪或載入使用者自己的驅動;聽起來,好怕怕的樣子。事實上,廠商也提供了linux-kernel原始碼及工具。裡面還包含了平臺本身硬體資源對應的驅動,譬如 SPI,USB-HOST,OTG,IIC等等,傻瓜式的編譯,傻瓜式的勾選配置。裁剪就完成了。高大尚的說辭,瞬間被拉低了身價;所以,需要你做的是,有耐心的讀完廠商提供的操作指南,這個指南會告訴你,如何去編譯這個核心原碼,生成映象檔案,固化到晶片裡。

雖然,操作如此傻瓜,但是我們還應該稍稍瞭解點基本常識。linux是一個一體化的核心(一體化核心也稱“巨集核心”相對於“微核心”-例如,uCOS-II,PSOS,VxWork);“一體化”三個字隱隱透露出這玩意,移植是相當"方便"的(至於如何從0開始移植,只有傻冒才會去做,除非你要乾的就是這個活兒。敲黑板,敲黑板,敲黑板,廠家已經提供了與晶片相匹配的 linux-kernel原始碼了,應該在這個原始碼的基礎上去繼續深耕才是正道兒)。

linux核心採用模組化設計,功能模組(驅動層)先編譯成模組,然後可以在核心執行中動態的載入/解除安裝而不需要重啟;

linux核心集成了完整的POSIX網路協議棧,網路功能完善;

其他的一些穩定性強,安全性好,支援裝置廣泛等等一些張嘴就來優點,就不再描述了。隨便說,反正不會錯就對了。

那麼linux-kernel有哪些作用呢?或者說有啥組成的呢?又或者說它能幹點嘛?

上個結構圖看一下。如下圖:

上圖裡的所有的功能模組,基本就是字面意思,也沒啥深入要說的了。但是,有一個叫 “檔案系統”的模組,敲黑板,敲黑板,上圖的 第二行,“檔案系統”。這個檔案系統,是使用者自制作的。也就是本段落開始的時候說的,“需要固化三大塊程式”中的一個;詳述如下“ 3.”。

3.根檔案系統的固化

從上圖看,linux核心裡有一個單元叫“檔案系統” ,linux啟動後期,會去尋找並掛載根檔案系統;然後,執行裡面指定的程式及其他等等。。。簡而言之這玩意很重要。需要執行的根檔案系統可以是固化在晶片內部的(作為產品,肯定要固化到晶片裡面),也可以是存在於晶片記憶體的映象(顯然掉電,重啟記憶體裡資料就丟失了。);根檔案系統它包含了linux正常執行所必須的程式、庫、各種配置引數等;

剛剛在第“2.”中提到的廠商提供的核心原始碼。是指,除了“檔案系統”以外的所有的東西。所以,開發者,需要自己製作一個檔案系統;開發者編寫的應用程式(bin),驅動程式(.ko)也都存放在這個檔案系統裡的。

綜上述,製作一個完整的linux SOC需要 製作個U-boot映象( 這是容易的),製作個linux核的映象(也算不復雜),製作個根檔案系統映象(如何製作根檔案系統,需要了解linux根檔案系統的目錄結構(大多數時候,業內基本上是按照FHS--檔案層次標準--來執行的))這裡不做詳細描述;

其次,針對第二個問題,做如下描述:

值得強調的是“linux驅動程式”與“linux應用程式”是有區別的。驅動載入後執行在核心態,屬於核心部分,應用程式執行在使用者態;在程式設計時,它們的編寫格式/風格也是有區別的而且區別很大,這裡不贅述細節。

為了實現某個產品的功能,在一個完整的應用中,有可能會需要用到“驅動程式+應用程式”,也可能僅僅只需要“應用程式”。

現在說的重點是,如果需要用到自定義的驅動程式時,那麼除錯好的驅動程式( .KO檔案),放在哪裡,如何載入到核心中?換句話說,如何固化這個驅動程式呢?

驅動程式,與應用程式都是存放在根檔案系統下的。應用程式,通過配置檔案可以開機自啟動。驅動程式也可以通過指令碼來載入。顯然,應用程式,自定義的驅動,配置檔案,指令碼等等都可以在製作檔案體系生成映象檔案前,就存放在檔案體系中,生成映象時便包含在映象檔案裡。固化到晶片裡就可以了。

第三、關於Debug

交叉編譯環境,宿主機開發; 我們可以把目標板上的檔案系統建立在主機上,通過tftp或其他方式,讓宿機掛載這個檔案系統;所以,修改主機上的這個檔案體系內容,實質上就是修改了目標機上的檔案體系內容;提供了相對便捷的debug的方式;除錯成功後,把這個檔案體系打包製作成映象檔案,固化到晶片中就可以了。(固化工具,方法,步驟,供應商同樣也有指導說明。需要耐心閱讀).