電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2067|回復: 0
收起左側(cè)

浙江大學嵌入式培訓_嵌入式項目中使用Linux的技巧

[復制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-8-4 16:18:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
浙江大學嵌入式培訓_嵌入式項目中使用Linux的技巧,   

微控制器制造商的開發(fā)板,以及他們與開發(fā)板一起提供的軟件項目例程,在工程師著手一個新設計時可以提供很大幫助。但在設計項目完成其早期階段后,進一步設計時,制造商提供的軟件也可能會導致一些問題。

使用實時操作系統(tǒng)作為應用程序代碼平臺的設計還面臨著許多挑戰(zhàn),比如如何將功能分配給不同的并行任務、如何設計高可靠的進程間通信、以及如何在硬件上測試整個軟件包等問題。

越來越多的OEM廠商發(fā)現(xiàn),避免上述兩個問題的最好方式,是使用基于開源、經(jīng)過驗證、可擴展、可運行在不同硬件平臺的操作系統(tǒng)Linux開始新的設計。就已經(jīng)被移植到各種計算機硬件平臺的操作系統(tǒng)的數(shù)量來說,Linux首屈一指。Linux的衍生版本已運行在非常廣泛的嵌入式系統(tǒng)中,包括:網(wǎng)絡路由器、移動電話、建筑自動化控制、電視機和視頻游戲控制臺。

雖然Linux被成功使用,但并不意味著它很容易使用。Linux包含的代碼超過一百萬行,其運作帶有鮮明的Linux方法論味道,初學者可能難以迅速掌握。

因此,本文的主旨是為使用Linux的嵌入式操作系統(tǒng)版本——μClinux,開始一個新的設計項目,該指南共分為五個步驟。為了說明該指南,本文介紹了在意法半導體的STM32F429微控制器(ARMCortex-M4內(nèi)核,最高180MHz)上的一個μClinux項目實現(xiàn),使用了emcraft 的STM32F429DiscoveryLinux板支持包(BSP)。

步驟1:Linux工具和項目布局

每個嵌入式軟件設計都從選擇合適的工具開始。

工具鏈是一組連接(或鏈接)在一起的軟件開發(fā)工具,它包含諸如GNU編譯器集合(GCC)、binutils(一組包括連接器、匯編器和其它用于目標文件和檔案工具的開發(fā)工具)和glibc(提供系統(tǒng)調(diào)用和基本函數(shù)的C函數(shù)庫)等組件;在某些情況下,還可能包括編譯器和調(diào)試器等其它工具。

用于嵌入式開發(fā)的工具鏈是一個交叉工具鏈,更常見的叫法是交叉編譯器。

GNUBinutils是嵌入式Linux工具鏈的第一個組件。GNUBinutils包含兩款重要工具:

●“as”,匯編器,將匯編代碼(GCC所生成)轉(zhuǎn)換成二進制代碼

●“l(fā)d”,連接器,將離散目標代碼段連接到庫或形成可執(zhí)行文件

編譯器是工具鏈的第二個重要組成部分。在嵌入式Linux,它被稱為GCC,支持許多種微控制器和處理器架構(gòu)。

接下來是C函數(shù)庫。它實現(xiàn)Linux的傳統(tǒng)POSIX應用編程接口(API),該API可被用來開發(fā)用戶空間應用。它通過系統(tǒng)調(diào)用與內(nèi)核對接,并提供高階服務。

工程師有幾種C函數(shù)庫選擇:

●glibc是開源GNU項目提供的可用C函數(shù)庫。該庫是全功能、可移植的,它符合Linux標準。

●嵌入式GLIBC(EGLIBC)是一款針對嵌入式系統(tǒng)優(yōu)化的衍生版。其代碼是精簡的,支持交叉編譯和交叉測試,其源代碼和二進制代碼與GLIBC的兼容。

●uClibc是另一款C函數(shù)庫,可在閃存空間有限、和/或內(nèi)存占用必須最小的情況下使用。

調(diào)試器通常也是工具鏈的一部分,因為在目標機上調(diào)試應用程序運行時,需要一個交叉調(diào)試器。在嵌入式Linux領域,GDB是常用調(diào)試器。

上述工具是如此地不可或缺,但當它們各自為戰(zhàn)時,會花太長時間來編譯Linux源代碼并將其整合成最終映像(image)。幸運的是,Buildroot(自動生成交叉編譯工具的工具)會自動完成構(gòu)建一個完整嵌入式系統(tǒng)的過程,并通過產(chǎn)生下述任一或所有任務,簡化了交叉編譯:

●交叉編譯工具鏈

●根文件系統(tǒng)

●內(nèi)核映像

●引導映像

對嵌入式系統(tǒng)設計師來說,還可以方便地使用一種工具(utility)聚合工具,如BusyBox,這種工具將通常最需要的工具整合在一起。根據(jù) BusyBox的信息頁面介紹,“它將許多常用UNIX工具的微型版本整合成一個小的可執(zhí)行文件。它提供了對大多數(shù)你通常會在GNUfileutils和 shellutils等工具中看到的工具的替代。BusyBox里的工具通常比其全功能GNU對應版本的選擇少;但所包含選項所提供的預期功能和行為則與對應的GNU所提供的幾無差別。對任何小或嵌入式系統(tǒng)來說,BusyBox提供的環(huán)境都是相當完整的!

最后一個重要工具是一款BSP,是為搭載了項目目標MCU或處理器的主板專門做的。

BSP包括預先配置的工具,以及將操作系統(tǒng)加載到主板的引導加載程序。它還為內(nèi)核和器件驅(qū)動器提供源代碼(見圖1)。

  
  




圖1:用于STM32F429Discovery板的EmcraftBSP的主要部件

步驟2:引導序列、時鐘系統(tǒng)、存儲器和串行接口

典型的嵌入式Linux啟動順序執(zhí)行如下:

1)引導加載程序固件(示例項目里的U-Boot)運行于目標MCU內(nèi)置閃存(無需外部存儲器),并在上電/復位后,執(zhí)行所有必需的初始化工作,包括設置串口和用于外部存儲器(RAM)訪問的存儲器控制器。

2)U-Boot可將Linux映像從外部Flash轉(zhuǎn)移到外部RAM,并將控制交接到RAM中的內(nèi)核入口點?蓧嚎sLinux映像以節(jié)省閃存空間,代價是在啟動時要付出解壓縮時間。

3)Linux進行引導并安裝基于RAM的文件系統(tǒng)(initramfs)作為根文件系統(tǒng)。在項目構(gòu)建時,Initramfs被填充以所需的文件和目錄,然后被簡單地鏈接到內(nèi)核。

4)在Linux內(nèi)核下,執(zhí)行/sbin/init。/sbin/init程序按照/etc/inittab中配置文件的描述對系統(tǒng)進行初始化。

5)一旦初始化進程完成運行級執(zhí)行和/sbin/init里的命令,它會啟動一個登錄進程。

6)殼初始化文件/etc/profile的執(zhí)行,標志著啟動過程的完成。

通過使能就地執(zhí)行(ExecuteInPlace——XIP)可以顯著縮短啟動時間、提升整體性能,XIP是從閃存執(zhí)行代碼的方法。通常,Linux代碼是從閃存加載到外部存儲器,然后從外部存儲器執(zhí)行。通過從閃存執(zhí)行,因不再需復制這步,從而只需較少的存儲器,且只讀存儲器不再占程序空間。

本文的示例項目基于STM32F429MCU。事實上,用戶可能會發(fā)現(xiàn),開始時,STM32F4系列MCU的外設初始化不容易掌握。幸運的是,意法半導體開發(fā)了一些工具來幫助解決這一問題。STM32CubeMX初始化代碼生成器(部件編號UM1718)屬于最新的。該工具包括外設初始化的每一個細節(jié),在配置外設時,會顯示警告和錯誤、并警告硬件沖突。[!--empirenews.page--]

對小型嵌入式Linux項目來說,STM32F429MCU內(nèi)部閃存足夠用。重要的是要記。呵度胧絃inux項目中使用多個二進制映像(引導加載程序、Linux內(nèi)核和根文件系統(tǒng)):這些都需要閃存扇區(qū)邊界對齊。這就避免了在裝載一個圖像時,另一圖像被部分刪除或損壞的風險。

步驟3:在主機上安裝Linux

要構(gòu)建一個嵌入式Linux項目,一臺Linux主機是必需的。對于WindowsPC,最好是安裝OracleVirtualBox,以創(chuàng)建“一臺”512MbyteRAM和16Gbyte硬盤的新虛擬機。

有許多Linux版本可用;據(jù)筆者的經(jīng)驗,Debian就是與VirtualBox環(huán)境相匹配的一款。這款Linux主機必須能夠訪問互聯(lián)網(wǎng),以便下載針對這款ARMCortex-M目標MCU的GNU交叉編譯工具。設計師將創(chuàng)建一個類似于圖1所示的樹形結(jié)構(gòu),并將交叉構(gòu)建工具提存到/tools文件夾。

在這點上,有必要建立一個ACTIVATE.sh腳本。只需使用下列代碼就可實現(xiàn)。(<......>是提取到的GNU工具文件夾路徑):

exportINSTALL_ROOT=<.......>

exportPATH=$INSTALL_ROOT/bin:$PATH

exportCROSS_COMPILE=arm-uclinuxeabiexport

CROSS_COMPILE_APPS=arm-uclinuxeabiexport

MCU=STMDISCO

exportARCH=arm

在干凈的Linux系統(tǒng)中安裝GNU工具,但其使用并非自給自足,實際上還需要其它系統(tǒng)的配合。其運行實際上依賴于若干其它系統(tǒng)組件(如主機C/C++ 編譯器、標準C函數(shù)庫頭文件,以及一些系統(tǒng)工具)。獲得這些必要組件的一種方法是安裝用于C的Eclipse集成開發(fā)環(huán)境(IDE)。除解決這個迫在眉睫的問題外,EclipseIDE還可在開發(fā)過程中的許多其它方面提供幫助,當然,詳述EclipseIDE的特性不是本文目的。

現(xiàn)在,是時候啟用Linux終端工具了:點擊“應用程序(Applications)”,然后“附件(Accessories)”和“終端(Terminal)”(見圖2)。

  
  




圖2:Linux包含的“終端(Terminal)”工具和“文件(Files)”、一種類似Windows資源管理器的圖形化工具。

終端是用于配置Linux主機和構(gòu)建嵌入式Linux應用程序的主要工具。鍵入以下命令來安裝Eclipse和其它所需工具:

su[輸入根用戶密碼]

apt-getinstalleclipse-cdt

apt-getinstallgenromfs

apt-getinstalllibncurses5-dev嵌入式系統(tǒng)設計方波, 嵌入式端景造型墻, 嵌入式兩張照片對比, 嵌入式堆棧是什么, 高端嵌入式開發(fā)套件, 現(xiàn)在三級里面嵌入式, 嵌入式用的算法多嗎, 單片機嵌入式的書籍, 嵌入式dps, 嵌入式qt作用, 嵌入式系統(tǒng)狹義, 嵌入式選擇題面試, ANSYS嵌入式, 嵌入式四吹風機組, 嵌入式補牙的優(yōu)缺點, 問題叫嵌入式成效, 用什么語言開發(fā)嵌入式, 嵌入式社會組織,

apt-getinstallgit

apt-getinstallmc

準備該Linux項目的最后一步是下載STM32F429DiscoveryBuildroot,并解壓到/uclinux文件夾。

步驟4:用Buildroot構(gòu)建μClinux

現(xiàn)在有必要關(guān)閉先前使用根用戶配置文件的終端,并啟動一個新終端。在命令行中輸入“mc”,并使用導航器導航到“Documents”,然后輸入 “uClinux”命令。按Ctrl+O并激活LinuxARMCortex-M開發(fā)部分,并運行“.ACTIVATE.sh”命令。再次按下 Ctrl+O并進入“stm32f429-linux-builder-master”文件夾。

用戶現(xiàn)在有兩個選擇。如果使用VirtualBox中的示例項目,請遵循“makeclean”和“makeall”命令序列。如果準備一個全新環(huán)境,使用“make”命令。約30分鐘后,新的μClinux映像將可用,如下所示:

outubootu-boot.bin

outkernelarcharmbootxipuImage.bin

outromfs.bin

將這些新映像寫入閃存。如果使用Windows和ST-LINK工具,下面的代碼將工作:

ST-LINK_CLI.exe-ME

ST-LINK_CLI.exe-P“u-boot.bin”0x08000000

ST-LINK_CLI.exe-P“xipuImage.bin”0x08020000

ST-LINK_CLI.exe-P“romfs.bin”0x08120000

將串行調(diào)試器(serialconsole)連接到目標電路板(外部RX=>PC10、外部TX=>PC11、115200bits/s、8個數(shù)據(jù)位、無奇偶校驗、1個停止位模式),然后按下復位按鈕,該μClinux項目將啟動運行。開機輸出將顯示在串行調(diào)試器上,顯示屏將出現(xiàn)Linux的企鵝標識。

步驟5:創(chuàng)建“你好,世界”應用

現(xiàn)在,按照代碼示例和下面的說明,將一個用戶應用添加到μClinux項目中。

創(chuàng)建:“stm32f429-linux-builder-master/user/src/hello.c”文件:

#include

intmain(){

printf(“Hello,worldn”);

return0;

}

必要時使用Tab鍵,創(chuàng)建:“stm32f429-linux-builder-master/user/Makefile”文件:

CC=$(CROSS_COMPILE)gcc

LDFLAGS?=$(CFLAGS)

target_out?=out

all:checkdirs

[Tab]$(CC)$(LDFLAGS)src/hello/hello.c-o$(target_out)/bin/

hello$(LDLIBS)

[Tab]-rm-rf$(target_out)/bin/*.gdb

checkdirs:

[Tab]mkdir-p$(target_out)/bin

clean:

[Tab]-rm-rf$(target_out)

通過activate.sh腳本,在不激活交叉編譯環(huán)境下,在主機測試“Hello,world”這個應用。

在/user文件夾下,輸入:

makeall

./out/bin/hello

為將hello.c嵌入到LinuxBuildroot里的腳本,修改mk/rootf.mak文件,必要時,使用Tab鍵。(粗體字表示新行開始處):

...

user_hello:

[Tab]make-C$(user_dir)CROSS_COMPILE=$(CROSS_

COMPILE)CFLAGS=$(ROOTFS_CFLAGS)target_

out=$(target_out_user)

$(rootfs_target):$(rootfs_dir)$(target_out_busybox)/.config

user_hello

[Tab]cp-af$(rootfs_dir)/*$(target_out_romfs)

[Tab]cp-f$(target_out_kernel)/fs/ext2/ext2.ko$(target_out_romfs)/lib/modules

[Tab]cp-f$(target_out_kernel)/fs/mbcache.ko$(target_out_romfs)/lib/modules

[Tab]cp-f$(target_out_user)/bin/*$(target_out_romfs)/usr/bin[!--empirenews.page--]



需對mk/defs.mak文件做最后修改。加入以下幾行:

...

user_dir:=$(root_dir)/user

target_out_user:=$(target_out)/user

user_dir:=$(root_dir)/user

target_out_user:=$(target_out)/user

一旦在目標MCU上建成、下載并運行映像,就可在/usr/bin目錄中找到該應用程序以及其它已有的應用程序。在連接到Discovery板的終端上鍵入“hello[回車]”,可對該應用進行測試。
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表