Global Sources
電子工程專輯
 
電子工程專輯 > 嵌入式技術
 
 
嵌入式技術  

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

上網時間: 2015年08月07日     打印版  Bookmark and Share  字型大小:  

關鍵字:嵌入式  Linux  編譯器  嵌入式系統 

Arnoldas Bagdonas,Future Electronics現場應用工程師

微控制器(MCU)製造商的開發板及搭配開發板共同提供的軟體專案,為著手新設計的工程師提供很大的幫助。但在設計專案完成早期階段,展開進一步設計時,製造商提供的軟體可能導致一些問題。

在進行設計時,利用即時作業系統(RTOS)作為實現應用程式碼的平台仍面臨諸多挑戰,例如如何將功能分配給不同的平行任務、如何設計高可靠的進程間通訊、以及如何在硬體上測試整個套裝軟體等問題。

越來越多的OEM廠商發現,避免上述兩個問題的最好方式在於使用基於開放源碼且經過驗證、可擴展、可運行在不同硬體平台的作業系統Linux展開新設計。針對已經被移植到各種電腦硬體平台的作業系統數量來說,Linux是最佳選擇之一。Linux的衍生版本已執行於非常廣泛的嵌入式系統,包括網路路由器、行動電話、建築自動化控制、電視機和視訊遊戲控制台。

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

因此,本文的主旨在於為使用Linux的嵌入式作業系統版本——μClinux,開始一個新的設計專案,該指南共分為五個步驟。為了說明該指南,本文介紹在意法半導體(STMicroelectronics)的STM32F429微控制器(ARM Cortex-M4核心,最高180MHz)上的μClinux專案建置,使用Emcraft的STM32F429 Discovery Linux板支援套件(BSP)。

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

每個嵌入式軟體設計都從選擇合適的工具開始。工具鏈是一組連接(或連結)在一起的軟體開發工具,它包含諸如GNU編譯器集合(GCC)、Binutils(一組包括連接器、匯編器和其它用於目的檔案和檔案工具的開發工具)和GLBC(提供系統除錯和基本函數的C函式程式庫)等元件;在某些情況下,還可能包括編譯器和除錯器等其它工具。

用於嵌入式開發的工具鏈是一個交叉工具鏈,通常稱為交叉編譯器。GNU Binutils是嵌入式Linux工具鏈的第一個元件。GNU Binutils包含兩款重要工具:

•‘as’,匯編器,將GCC產生的匯編程式碼轉換成二進位碼

•‘ld’,連接器,將分離式物性程式碼區段連接到庫或可執行檔

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

接下來是C函式程式庫。它可實現Linux的傳統POSIX應用程式介面(API),該API可被用來開發用戶空間應用。此外,它透過系統除錯與核心對接,並提供高階服務。

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

•GLIBC是開放源碼GNU專案提供的可用C函式程式庫。該全功能且可移植的庫符合Linux標準。

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

•uClibc是另一款C函式程式庫,可在Flash空間有限和/或記憶體佔用最小化的情況下使用。

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

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

•交叉編譯工具鏈

•根檔案系統

•核心程式映射

•啟動程式映射

對嵌入式系統設計師來說,還可以方便地使用一種程式聚合工具,如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內建Flash(無需外部記憶體),並在上電/重設後執行所有必要的初始化作業,包括設定序列埠以及用於外部記憶體(RAM)存取的記憶體控制器。

2)U-Boot可將Linux映射從外部Flash轉移到外部RAM,並將控制交接到RAM中的核心入口點。Linux映射可加以壓縮以節省Flash空間,代價是在啟動時花費一些解壓縮時間。

3)Linux進行啟動並安裝基於RAM的檔案系統(initramfs)作為根檔案系統。在專案建構時,Initramfs聚集了所需的檔案和目錄,然後直接連結到核心。

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

5)一旦初始化過程完成Run-level執行以及/sbin/init中的指令,將會啟動一個登錄程序。

6)當Shell初始化檔案/etc/profile執行,即完成啟動過程。

透過實現‘就地執行’(Execute In Place——XIP),可以顯著縮短啟動時間、提升整體性能,XIP是從Flash執行程式碼的方法。通常,Linux程式碼是從Flash載入到外部記憶體,然後從外部記憶體執行。從Flash執行即無需複製步驟,因而只需較少的記憶體,而且唯讀記憶體不再佔程式空間。

本文範例中的專案基於STM32F429 MCU。事實上,用戶可能會發現,開始時,STM32F4系列MCU的週邊初始化不容易掌握。意法半導體開發了一些工具來幫助解決這一問題。STM32CubeMX初始化程式碼產生器(元件編號UM1718)工具包括週邊初始化的每一個細節,在配置週邊時顯示警示與錯誤、並警告硬體衝突。

對小型嵌入式Linux專案來說,STM32F429 MCU內部Flash已足夠使用。重要的是記住嵌入式Linux專案中使用多個二進位映射(啟動程式、Linux核心和根檔案系統):這些都需要Flash磁區邊界對準,以避免在載入某一個影像時導致另一個影像被部份刪除或損壞的風險。

(下一頁繼續:步驟3:在主機上安裝Linux)


1 • 2 Next Page Last Page



投票數:   加入我的最愛
我來評論 - 在嵌入式專案中使用Linux的技巧
評論:  
*  您還能輸入[0]個字
*驗證碼:
 
論壇熱門主題 熱門下載
 •   將邁入40歲的你...存款多少了  •  深入電容觸控技術就從這個問題開始
 •  我有一個數位電源的專利...  •  磷酸鋰鐵電池一問
 •   關於設備商公司的工程師(廠商)薪資前景  •  計算諧振轉換器的同步整流MOSFET功耗損失
 •   Touch sensor & MEMS controller  •  針對智慧電表PLC通訊應用的線路驅動器
 •   下週 深圳 llC 2012 關於PCB免費工具的研討會  •  邏輯閘的應用


EE人生人氣排行
 
返回頁首