當前位置:才華齋>IT認證>嵌入式>

2016年嵌入式專案中使用Linux的技巧

嵌入式 閱讀(7.87K)

本文yjbys小編為大家準備的是在嵌入式專案中如何使用Linux的技巧,希望能幫助到大家!

2016年嵌入式專案中使用Linux的技巧

眾所周知,微控制器製造商的開發板,以及他們與開發板一起提供的軟體專案例程,在工程師著手一個新設計時可以提供很大幫助。但在設計專案完成其早期階段後,進一步設計時,製造商提供的軟體也可能會導致一些問題。

使用實時作業系統作為應用程式程式碼平臺的設計還面臨著許多挑戰,比如如何將功能分配給不同的並行任務、如何設計高可靠的程序間通訊、以及如何在硬體上測試整個軟體包等問題。

越來越多的OEM廠商發現,避免上述兩個問題的最好方式,是使用基於開源、經過驗證、可擴充套件、可執行在不同硬體平臺的作業系統Linux開始新的設計。就已經被移植到各種計算機硬體平臺的作業系統的數量來說,Linux首屈一指。Linux的衍生版本已執行在非常廣泛的嵌入式系統中,包括:網路路由器、行動電話、建築自動化控制、電視機和視訊遊戲控制檯。

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

因此,本文的主旨是為使用Linux的嵌入式作業系統版本——μClinux,開始一個新的設計專案,該指南共分為五個步驟。

為了說明該指南,本文介紹了在意法半導體的STM32F429微控制器(ARM Cortex-M4核心,最高180MHz)上的一個μClinux專案實現,使用了Emcraft的STM32F429 Discovery Linux板支援包(BSP)。

  步驟1:Linux工具和專案佈局

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

工具鏈是一組連線(或連結)在一起的軟體開發工具,它包含諸如GNU編譯器集合(GCC)、binutils(一組包括聯結器、彙編器和其它用於目標檔案和檔案工具的開發工具)和glibc(提供系統呼叫和基本函式的C函式庫)等元件;在某些情況下,還可能包括編譯器和偵錯程式等其它工具。

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

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

●“as”,彙編器,將彙編程式碼(GCC所生成)轉換成二進位制程式碼

●“ld”,聯結器,將離散目的碼段連線到庫或形成可執行檔案

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

接下來是C函式庫。它實現Linux的傳統POSIX應用程式設計介面(API),該API可被用來開發使用者空間應用。它通過系統呼叫與核心對接,並提供高階服務。

工程師有幾種C函式庫選擇:

●glibc是開源GNU專案提供的可用C函式庫。該庫是全功能、可移植的,它符合Linux標準。

●嵌入式GLIBC(EGLIBC)是一款針對嵌入式系統優化的衍生版。其程式碼是精簡的,支援交叉編譯和交叉測試,其原始碼和二進位制程式碼與GLIBC的相容。

●uClibc是另一款C函式庫,可在快閃記憶體空間有限、和/或記憶體佔用必須最小的情況下使用。

偵錯程式通常也是工具鏈的一部分,因為在目標機上除錯應用程式執行時,需要一個交叉偵錯程式。在嵌入式Linux領域,GDB是常用偵錯程式。

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

●交叉編譯工具鏈

●根檔案系統

●核心映像

●引導映像

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

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

BSP包括預先配置的工具,以及將作業系統載入到主機板的引導載入程式。它還為核心和器件驅動器提供原始碼(見圖1)。

圖1:用於STM32F429 Discovery板的Emcraft BSP的主要部件。

  步驟2:引導序列、時鐘系統、儲存器和序列介面

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

1)引導載入程式韌體(示例專案裡的U-Boot)運行於目標MCU內建快閃記憶體(無需外部儲存器),並在上電/復位後,執行所有必需的初始化工作,包括設定串列埠和用於外部儲存器(RAM)訪問的儲存器控制器。

2)U-Boot可將Linux映像從外部Flash轉移到外部RAM,並將控制交接到RAM中的核心入口點。可壓縮Linux映像以節省快閃記憶體空間,代價是在啟動時要付出解壓縮時間。

3)Linux進行引導並安裝基於RAM的檔案系統(initramfs)作為根檔案系統。在專案構建時,Initramfs被填充以所需的檔案和目錄,然後被簡單地連結到核心。

4)在Linux核心下,執行/sbin/init。/sbin/init程式按照/etc/inittab中配置檔案的描述對系統進行初始化。

5)一旦初始化程序完成執行級執行和/sbin/init裡的命令,它會啟動一個登入程序。

6)殼初始化檔案/etc/profile的執行,標誌著啟動過程的完成。

通過使能就地執行(Execute In Place——XIP)可以顯著縮短啟動時間、提升整體效能,XIP是從快閃記憶體執行程式碼的方法。通常,Linux程式碼是從快閃記憶體載入到外部儲存器,然後從外部儲存器執行。通過從快閃記憶體執行,因不再需複製這步,從而只需較少的儲存器,且只讀儲存器不再佔程式空間。

本文的示例專案基於STM32F429 MCU。事實上,使用者可能會發現,開始時,STM32F4系列MCU的外設初始化不容易掌握。幸運的是,意法半導體開發了一些工具來幫助解決這一問題。STM32CubeMX初始化程式碼生成器(部件編號UM1718)屬於最新的。該工具包括外設初始化的每一個細節,在配置外設時,會顯示警告和錯誤、並警告硬體衝突。

對小型嵌入式Linux專案來說,STM32F429 MCU內部快閃記憶體足夠用。重要的是要記住:嵌入式Linux專案中使用多個二進位制映像(引導載入程式、Linux核心和根檔案系統):這些都需要快閃記憶體扇區邊界對齊。這就避免了在裝載一個影象時,另一影象被部分刪除或損壞的風險。

  步驟3:在主機上安裝Linux

要構建一個嵌入式Linux專案,一臺Linux主機是必需的。對於Windows PC,最好是安裝Oracle VirtualBox,以建立“一臺”512Mbyte RAM和16Gbyte硬碟的新虛擬機器。

有許多Linux版本可用;據筆者的經驗,Debian就是與VirtualBox環境相匹配的一款。這款Linux主機必須能夠訪問網際網路,以便下載針對這款ARM Cortex-M目標MCU的GNU交叉編譯工具。設計師將建立一個類似於圖1所示的樹形結構,並將交叉構建工具提存到/tools資料夾。

在這點上,有必要建立一個指令碼。只需使用下列程式碼就可實現。(<......>是提取到的GNU工具資料夾路徑):

export INSTALL_ROOT=<.......>

export PATH=$INSTALL_ROOT/bin:$PATH

export CROSS_COMPILE=arm-uclinuxeabiexport

CROSS_COMPILE_APPS=arm-uclinuxeabiexport

MCU=STMDISCO

export ARCH=arm

在乾淨的Linux系統中安裝GNU工具,但其使用並非自給自足,實際上還需要其它系統的配合。其執行實際上依賴於若干其它系統元件(如主機C/C++編譯器、標準C函式庫標頭檔案,以及一些系統工具)。獲得這些必要元件的一種方法是安裝用於C的Eclipse整合開發環境(IDE)。除解決這個迫在眉睫的問題外,Eclipse IDE還可在開發過程中的許多其它方面提供幫助,當然,詳述Eclipse IDE的特性不是本文目的。

現在,是時候啟用Linux終端工具了:點選“應用程式(Applications)”,然後“附件(Accessories)”和“終端(Terminal)”(見圖2)。

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

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

su [輸入根使用者密碼]

apt-get install eclipse-cdt

apt-get install genromfs

apt-get install libncurses5-dev

apt-get install git

apt-get install mc

準備該Linux專案的最後一步是下載STM32F429 Discovery Buildroot,並解壓到/uclinux資料夾。

  步驟4:用Buildroot構建μClinux

現在有必要關閉先前使用根使用者配置檔案的終端,並啟動一個新終端。在命令列中輸入“mc”,並使用導航器導航到“Documents”,然後輸入“uClinux”命令。按Ctrl+O並激活Linux ARM Cortex-M開發部分,並執行“”命令。再次按下Ctrl+O並進入“stm32f429-linux-builder-master”資料夾。

使用者現在有兩個選擇。如果使用VirtualBox中的示例專案,請遵循“make clean”和“make all”命令序列。如果準備一個全新環境,使用“make”命令。約30分鐘後,新的μClinux映像將可用,如下所示:

outuboot

outkernelarcharmboot

out

將這些新映像寫入快閃記憶體。如果使用Windows和ST-LINK工具,下面的程式碼將工作:

ST-LINK_ -ME

ST-LINK_ -P “” 0x08000000

ST-LINK_ -P “” 0x08020000

ST-LINK_ -P “” 0x08120000

將序列偵錯程式(serial console)連線到目標電路板(外部RX=>PC10、外部TX=>PC11、115200bits/s、8個數據位、無奇偶校驗、1個停止位模式),然後按下復位按鈕,該μClinux專案將啟動執行。開機輸出將顯示在序列偵錯程式上,顯示屏將出現Linux的企鵝標識。

  步驟5:建立“你好,世界”應用

現在,按照程式碼示例和下面的說明,將一個使用者應用新增到μClinux專案中。

建立:“stm32f429-linux-builder-master/user/src/hello.c”檔案:

#include

int main() {

printf(“Hello, worldn”);

return 0;

}

必要時使用Tab鍵,建立:“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/*

checkdirs:

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

clean:

[Tab] -rm -rf $(target_out)

通過指令碼,在不啟用交叉編譯環境下,在主機測試“Hello, world”這個應用。

在/user資料夾下,輸入:

make all

./out/bin/hello

為將hello.c嵌入到Linux Buildroot裡的指令碼,修改mk/檔案,必要時,使用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)/ig

user_hello

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

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

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

[Tab] cp -f $(target_out_user)/bin/* $(target_out_romfs)/usr/bin

需對mk/檔案做最後修改。加入以下幾行:

. . .

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[回車]”,可對該應用進行測試。