2016年嵌入式項目中使用Linux的技巧
本文yjbys小編為大家準備的是在嵌入式項目中如何使用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[回車]”,可對該應用進行測試。
-
學習嵌入式的技巧
1、安全和備份:對於生產型系統,安全最重要。一旦發現安全問題,管理員首先就要停止相應的服務,查看日誌,執行備份,以及打補丁。世界上沒有什麼東西是絕對安全的,Linux系統也並非百分之百安全,所以每天進行日常備份十分必要。2、安裝Linux操作系統:通過對Linux操作系統的`...
-
2016嵌入式開發驅動程序設計的5個竅門
在嵌入式系統的開發中,驅動程序的設計和實施是一個關鍵組成部分,是滿足系統實時性需求的關鍵。yjbys小編為大家總結了設計驅動程序開發者應該掌握的五個技巧。希望對大家有所幫助!每一個嵌入式應用軟件都會在某些時候訪問最底層的固件和進行一些硬件控制。驅動的...
-
嵌入式車庫管理系統設計
過去智能卡應用領域常採用磁卡或接觸式IC卡,但由於讀寫速度慢,易損壞,使用壽命比較短,無法保證系統長期運行的可靠性和方便性。非接觸式IC卡由於使用方便、交易速度快、便於維護和使用壽命較長等優點,正在各種場合逐漸替代目前廣泛使用的接觸式IC卡。我們對現代化車...
-
基於嵌入式系統的語音加密處理系統設計
嵌入式系統的發展促進了嵌入式通信安全技術的發展,基於嵌入式系統的語音加密處理系統作為可以有效確保嵌入式系統通信安全的一個系統,其在嵌入式系統中的應用有效的提高了嵌入式系統數據信息傳輸的安全性和可靠性。下面yjbys小編為大家準備了關於語音加密處理系...