poky linux初探 新增自己的核心食譜

2021-05-25 14:25:07 字數 4433 閱讀 4650

poky是乙個distribution,採用

openembedded 構建,包含乙個基於gnome的embedded linux software stack。poky封裝了openembedded,選擇了openembedded的核心,外加更多的指令碼,作為開發者,如果想學習openembedded這一強大的工具,建議從poky開始。即便如此,poky的學習曲線仍然是陡峭的(雖然很好用)。

我最早接觸的poky其實已經不是當前最新的poky了。如果用git來取得poky的原始碼倉庫的話,那其實是名叫pinky-3.1的分支。可惜這個分支從09年左右就停止維護了,現在的poky(如master分支)叫"yocto",這應該已經是openhand被intel收購之後的事了。成為yocto之後,poky已不再簡單地定位為乙個distribution,而是乙個tool-maker,或者是「

協作開發軟體,增加了更多的模版、指令碼、工具等,來幫助開發者定製嵌入式系統 」,相對於增加了更多layers的yocto,早期的poky(pinky)顯得更「單純」,簡單的說,就是更少的檔案(meta bb file,meta class file等)。對於乙個初學者來說,這意味著遇到問題後更容易解決(不管你的native system同poky要求的多麼匹配,問題仍然是難免的)。當然,缺點就是不再被社群支援後,各軟體包的版本均停留在了pinky-3.1發布的那一刻,想公升級,想使用更新的軟體的話,要麼就老老實實切換到poky(yocto),與社群同步;要麼就do it yourself。相對與前者,後者這種行為無疑是『重新發明輪子』,但重新發明輪子有時也不是一件壞事,按候捷的話說(非原話)「學往深處學,用往易處用」。用我的話來說,就是「想學會游泳的方法就是下水」。下面,我就從零開始自己動手新增乙個食譜,這個食譜將產生乙個較新的linux核心包(2.6.37),取代poky(pinky)中還較早版本(2.6.24)的核心,以此來學習poky,bitbake中的一些概念。

一步步建立inux kernel的食譜

建立linux_2.6.37.bb

食譜檔案,食譜的檔名很重要,bitbake會從檔名中提取資訊來設定一些環境變數。這些環境變數決定比如在**找到源**,最後所生成的包的名字等等。

首先,我要將kernel源代嗎從網上下下來。bitbake通過src_uri

中的src_uri設定。

於是,第一步,在linux_2.6.37.bb

中新增:

protocol告訴bitbake用git作為source fetcher。

因為我已決定了用2.6.37的kernel release版本,所以這裡要用『tag』標記來指定它。通過git tag知道在master分支下對應的tag名為『v2.6.37』,對於git來說,這裡的tag也可以設定成乙個任何乙個git commit。

再加上linux.inc

標頭檔案,乙個很簡單的食譜檔案就完成了。linux.inc

是提煉出來的可適用於所有不同linux kernel食譜檔案的「公共檔案」,同對應的class檔案一樣,目的就在於code reuse,減少冗餘。比如「inherit kernel」這樣的指令可以在linux.inc

中看到。

我們可以用bitbake -c fetch linux 來驗證以上內容是否正確。耐心的等待一段不短的時間,bitbake就會呼叫git clone從src_uri所指定的目錄裡。該變數可以在bitbake.conf

中找到:

bitbake.conf

設定了bitbake所需要的環境變數的預設值。根據poky的需要,一些變數也被local.conf

進行了重置。

在poky根目錄的sources目錄下,可以看到fetch linux的結果:

bitbake的git fetcher已經將其指定的tag版本checkout並壓縮成了tar.gz檔案。檔名則是由src_uri變化而來。

執行bitbake -c unpack linux ,將其解壓到由變數workdir定義的工作目錄下,該變數也定義在bitbake.conf

中: 在$目錄下,可以看到unpack task執行後產生的名叫git的目錄,該目錄裡面就是解壓後的2.6.37的kernel code。如果此時執行bitbake -c build linux 會失敗,因為bitbake找不到解壓後的source code在**。原因是bitbake通過環境變數s來知道原始碼目錄在什麼地方的。在bitbake.conf

中: 原來,如果對應的bb檔案名叫「linux_2.6.37.bb

」,那麼預設bitbake會到$/linux-2.6.37

下面去執行build動作。但是因為源**是被git fetcher取下來的,source code被unpack到了$/git

下,於是bitbake報錯找不到檔案。所以,要在linux_2.6.37.bb

檔案中重置s變數,顯示地告訴bitbake源**放在**:

poky將build kernel的策略中的不變的部分抽象出來成為類(比如總是通過make oldconfig來配置核心而非make menuconfig等決策),在kernel.bbclass

中可以看到:

oldconfig需要源檔案目錄下有.config檔案作為配置輸入,剛clone下來的kernel source是沒有.config的,於是,poky提供標頭檔案為大多數不同版本的kernel『食譜』檔案來封裝這個拷貝.config檔案的過程,在linux.inc

中,有:

從上可知,

linux.inc

希望在$

目錄下能找到defconfig

檔案,該檔案就是linux的.config

檔案模板,在做一些定製化的修改後,再拷貝到$

目錄下重新命名為.config

檔案。注意到該方法的名為「do_configure_prepend」,意思是過載(overload)linux.bbclass

類中定義的的預設configure方法,這正式是bitbake這種『方言』的乙個強大特性。這種類似物件導向的方法可以積累前人的工作並且很方便的對其進行擴充套件。

在之前執行過的unpack任務中,bitbake會把在src_uri變數中定義的所有檔案都拷貝到$

目錄下(這其實也是poky的base.bbclass指令碼指定的),於是,我只要在src_uri裡新增我希望make oldconfig時要用到的defconfig

檔案即可:

上面還增加了對變數pr的重置(預設為r0),該環境變數意思是指定乙個軟體包的修訂版本。

src_uri中的「file://defconfig」位址表示defconfig檔案應該放在同當前被執行的bb檔案同級的乙個名叫linux-2.6.37的目錄中(因為正在被執行的bb檔案名叫linux_2.6.37.bb),bitbake正是根據bb檔名來決定file協議的目錄名應該叫什麼。所以,我找了乙個在x86系統上可以工作的.config檔案(其實就是來自於自己的ubuntu 10.10),然後拷貝換名到linux-2.6.37目錄下,畢竟不同的kernel配置差不多就行了。

截個圖來說明這些目錄:

右邊的目錄是我們編輯linux kernel菜譜原始檔的目錄,bitbake也是從該目錄取得菜譜檔案。

左邊的目錄是bitbake以linux kernel菜譜檔案為指導而進行構建、打包的工作目錄($

)。這樣,乙個最簡單的linux kernel食譜檔案就準備好了,再執行bitbake linux命令

,經過漫長的時間後(依賴於處理器的速度、記憶體等),bitbake會根據linux.inc以及kernel.bbclass檔案中定義的指令碼來配置、編譯核心、編譯模組、安裝、打包等動作。因為我選擇的package打包策略為deb(poky還支援rpm,ipkg),bitbake命令結束後,在$

目錄 下面就可以看到生成的linux kernel的package檔案,同時還有很多kernel module package檔案(每個module都屬於乙個deb包);這些指導bitbake的環境變數同樣定義在bitbake.conf

檔案中:

生成的.deb檔案:

以上過程從乙個菜譜檔案到構建完乙個包結束。這離生成乙個根檔案系統、發布核心、得到乙個可以執行的系統還有一段距離。因為目前還沒有處理依賴關係,公升級了核心後,對應的一些軟體元件也要跟著變,比如libc的標頭檔案等。解決這些問題都需要豐富的領域知識。當然,已有的poky、openembedded菜譜檔案很有重用價值。

借助poky或者openembedded,可以幫助我們節省了很多dirty works,讓我們不用把大量時間浪費在敲鍵盤上面。我認為即how-to的部分。但what-to和why-to,還是需要我們開發者自己思考的。

TI BLE 新增自己UUID

可以參考demo的給 的 profile char1 的樣式 我這裡使用 char5 因為在demo中char5 沒有配置成我想要的,我就配置為 16byte的資料長度的可讀寫!gattprofile.h 檔案 1 profile parameters define profile char1 0 ...

給 TI BLE 新增自己UUID

給 ti ble 新增自己uuid 個人覺得這裡的uuid就像usb報告的裡面的id作用一樣,乙個usb的裝置可以根據id讀寫不同資料長度的資料塊,藍芽也如此通過特性的uuid來識別讀寫不同長度的資料塊!可以參考demo的給 的 profile char1 的樣式 我這裡使用 char5 因為在de...

給 TI BLE 新增自己UUID

syd8801是一款低功耗高效能藍芽低功耗soc,整合了高效能2.4ghz射頻收發機 32位arm cortex m0處理器 128kb flash儲存器 以及豐富的數字介面。syd8801片上整合了balun無需阻抗匹配網路 高效率dcdc降壓轉換器,適合用於可穿戴 物聯網裝置等。具體可諮詢 給 ...