??最近,有個需求需要驗證一下嵌入式 LINUX 系統在 STM32上使用效果,正好手里有一塊前幾年的 STM32F769I-EVAL 的評估板,如下圖所示的這個:

這塊評估板的功能應該是非常全了,價格也是不便宜(應該算是挺貴),ST 官網對于這塊評估板的介紹參見 Evaluation board with STM32F769NI MCU,
??熟悉 ST 的開發板的都知道,ST 的開發板主要有 ST 官方的 Nucleo 系列、Discovery Kits 系列、Evaluation 系列以及第三方開發板這些組成,其中,ST 自家開發板中 Evaluation 系列是功能最全的,也是價格最高的,第三方開發板差異就比加大了,

嵌入式 Linux 環境
??在開始實際的移植編譯作業之前,有必要先來說一下我們要搭建的完整的 Linux 運行環境是啥樣的,以及包含那些部分,廢話不多說,直接上圖:

- U-Boot 本質就是就是一個復雜點的裸機程式(鏡像是 u-boot.bin),與我們通常撰寫的 ARM 裸機程式沒有本質區別,U-Boot 是無條件啟動的,從零開始啟動的,
- Linux Kernel 本身也是一個裸機程式(鏡像是 zImage),和 U-Boot、裸機程式無本質區別,要說不同的地方,那就是內核運行起來后,在軟體上分為內核層和應用層,分層后兩層的權限不同,記憶體訪問和設備操作的管理上更加精細(內核可以隨便訪問各種硬體,而應用程式只能被限制地訪問硬體和記憶體地址),
??內核是不能開機自動完全從零開始啟動的,內核啟動需要別人幫忙,U-Boot 需幫助內核實作重定位,U-Boot 還要給內核提供啟動引數, - 我們的嵌入式 Linux 中的應用程式所需的編譯工具鏈也需要我們自己編譯,現有的就只有 ARM 提供的 Cortex-A 系列的(有些開發板廠商也提供自己編譯好的 Linux 編譯套件),這里需要注意,嵌入式 linux 編譯套件往往不是通用的!
- 根檔案系統包括 Linux 啟動時所必須的目錄和關鍵性的檔案,例如 Linux 啟動時都需要有 init 目錄下的相關檔案,Linux 啟動時,第一個必須掛載的是根檔案系統;若系統不能從指定設備上掛載根檔案系統,則系統會出錯而退出啟動,成功之后可以自動或手動掛載其他的檔案系統,
- 這里的應用程式必須使用我們自己編譯出的配套的編譯套件來編譯,根檔案系統就是第一個需要使用我們自己的編譯套件來編譯的程式,
??嵌入式環境與我們熟悉的 PC 環境還是有很大區別的,尤其是對于部分芯片,它沒有 MMU,也就不能使用虛擬記憶體相關的所有技術,也就意味著,嵌入式中的地址都是實際的物理地址,
??其次,嵌入式環境的另一個大特點就是資源非常緊張,這就導致了我們可能需要將最終的多部分的可執行程式放到不同的地方,舉個例子,STM32 的 MCU 中,往往不能存放 Linux Kernel,我們需要將 Linux Kernel 放到一些外部存盤器中,
??對于 ARM 平臺,ARM 給出了兩個概念:加載域 和 執行域,加載域對應加載地址,執行域對應了一個執行地址,關于 ARM 的分散加載機制,可以參見博文 ARM 之十三 armlink(Keil) 分散加載機制詳解 及 分散加載檔案的撰寫 即可,

??進一步具體到 STM32 芯片,我們的程式是放到內部的 FLASH 上的,FLASH 就是加載域,FLASH 上的具體地址就是加載域地址,同時,ST 芯片的設計可以從 FLASH 上執行代碼(速度相對較慢),此時的加載域與執行域是同一個;還有一種更高效的方式是將代碼放到 RAM 中執行(存放還是在 FLASH),此時 RAM 就是執行域,程式在 RAM 中的地址就是執行域地址,
嵌入式系統啟動
??前面介紹了嵌入式系統的組成部分,接下來看看整個系統如何作業起來,一般 SoC 內部會有個固化的引導程式,這個固化的 BootLoader 我在博文 STM32 之十四 System Memory、Bootloader 中有過詳細的介紹,這段程式的會初始化部分外設以與外部通信,具體可以參考官方手冊,

嵌入式系統構建工具
??構建一整套嵌入式 Linux 系統是一件很龐大的事情,需要做很多作業,因此,誕生了一些嵌入式系統構建工具,以幫助開發者簡化嵌入式系統的構建程序,減少作業量,常用的嵌入式系統構建工具有如下幾個:
- Buildroot: Linux 平臺上的一個用于構建嵌入式 Linux 系統的框架,整個 Buildroot 是由 Makefile 腳本和 Kconfig 組態檔構成的,使用它可以和編譯 Linux 內核一樣,通過使用 Kbuild/Kconfig 系統編譯出一個完整的可以直接燒寫到機器上運行的 Linux 系統軟體(包含boot、kernel、rootfs 以及 rootfs 中的各種庫和應用程式、交叉編譯工具鏈),
??官方網站:https://buildroot.org/,提供了非常詳細的檔案, - Yocto: Yocto Project 推出的一個開源的協作軟體,提供模板、工具和方法幫你創建定制的 Linux 系統和嵌入式產品,而無需關心硬體體系,適合嵌入式Linux開發人員使用,極大地簡化你的開發程序,Yocto 推薦使用 OpenEmbedded 構建系統,
??Yocto Project 是 Linux 基金會的一個協作開源專案,其目標是生成工具和流程,以便為嵌入式和物聯網軟體創建獨立于嵌入式硬體底層架構的 Linux 發行版,官方網站:https://www.yoctoproject.org/,提供了非常詳細的檔案, - OpenEmbedded: 一個開源的嵌入式 Linux 系統構建環境,它允許開發人員為嵌入式系統創建一個完整的 Linux 發行版,由OpenEmbedded 社區開發,該社區于 2003 年正式成立,OpenEmbedded 的構建系統基于 BitBake 構建工具,其操作行為與 Gentoo Linux ebuilds 相似,
??官方網站:http://www.openembedded.org/wiki/Main_Page,提供了非常詳細的檔案, - PTXdist: Pengutronix 在 2001 年開發的一個構建系統,用于生成韌體鏡像,采用了 Linux 內核中的配置系統 Kconfig 來選擇和配置每個包,
??官方網站:https://www.ptxdist.org/,提供了非常詳細的檔案,
??當然,我們也可以選擇自己動手,根據上面嵌入式 Linux 環境,一點一點來構建其中的各個部分,后續,我就以手里的 STM32F769I-EVAL 的評估板為載體,盡量不使用已有的嵌入式構建工具,來一步一步搭建這個嵌入式 Linux 環境,
搭建程序
??工欲善其事,必先利其器,第一步就是搭建 LINUX 系統開發環境,為此特地在筆記本上安裝了 Ubuntu,具體使用的桌面開發環境是 Ubuntu 20.04.3 LTS,至于為啥選擇 Linux 系統,而不是直接使用 Windows 系統想必大家都清楚為啥,
??接下來準備好一個目錄,后續所有的操作均在此目錄中進行,我的操作是新建 /home/zcshou/STM32LINUX 這個目錄,用于存放整個要為 STM32 嵌入式 Linux 環境編譯的源代碼,后續都在這個目錄中進行,如下圖所示:

??最開始我想按照上面說的嵌入式環境的各個部分來分別寫幾篇博文來完整介紹整個搭建程序,然而寫著寫著內容越來越多,最終超過了 CSDN 編輯器的限制!最終決定把內容拆分成多篇文章,具體搭建程序就是如下幾步:
- 編譯 U-Boot,參見博文 U-Boot 之一 零基礎編譯 U-Boot 程序詳解 及 編譯后的使用說明
- 編譯 Linux Kernel,參見博文 Linux 之九 零基礎編譯嵌入式 Linux Kernel 程序詳解 及 編譯后的使用說明
- 編譯交叉編譯工具鏈,參見博文 Linux 之十 編譯自己的嵌入式 Linux 交叉編譯工具鏈
- 編譯 RootFS,參見博文 Linux 之十一 編譯嵌入式 Linux 下的 RootFS
參考
- https://codeantenna.com/a/wf8KVWOhym
- https://www.its404.com/article/qq_44034198/110872972
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401520.html
標籤:其他
上一篇:Java小題精煉訓練營(篇二)
