當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]面向嵌入式視頻處理平臺的Linux移植

 0引言

  嵌入式系統(tǒng)開發(fā)已經(jīng)進入32位時代,在當(dāng)前數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)高速發(fā)展的后PC時代,嵌入式系統(tǒng)已經(jīng)廣泛地滲透到科學(xué)研究、工程設(shè)計、軍事技術(shù)等各個方面。

  嵌入式系統(tǒng)通常由硬件和軟件兩個大部分組成。其硬件部分的核心部件就是各類嵌入式微處理器,并配置存儲器、I/O設(shè)備、通信模塊等必要的外設(shè)。目前市場上主流銷售的32位嵌入式處理器有MOTOROLA、MIPS、ARM等系列,其中ARM以其體積小、成本低、功耗低、性能高等特點成為嵌入式系統(tǒng)設(shè)計的首選。

  軟件部分一般由嵌入式操作系統(tǒng)和應(yīng)用軟件組成。嵌入式操作系統(tǒng)是一種支持嵌入式應(yīng)用的操作系統(tǒng)軟件,它負責(zé)全部軟硬件資源的分配和調(diào)度、控制協(xié)調(diào)等活動。從20世紀80年代末開始,陸續(xù)出現(xiàn)了很多典型的嵌入式操作系統(tǒng),如Linux、μC/OS、WindowsCE等,其中使用最廣泛、最受歡迎的是Linux,這是由于其源代碼公開、可移植性好等優(yōu)點。

  1嵌入式視頻處理平臺和Linux系統(tǒng)移植

  本文開發(fā)的嵌入式視頻處理平臺在達芬奇(Da-Vinci)數(shù)字媒體技術(shù)平臺TMS320DM*6上進行的。此平臺是以嵌入式處理器ARM為中心,由存儲器、I/O設(shè)備、通信模塊以及電源等必要的輔助接口組成。它的工作流程如圖1所示。攝像頭將視頻信號傳輸進來后,再通過視頻采集卡轉(zhuǎn)換成數(shù)字信號然后送人TMS320DM*6,經(jīng)過處理后通過視頻輸出接口在LCD(液晶顯示器)上顯示,在此過程中可以由USB口上所接的操縱桿進行控制,以及與存儲設(shè)備進行存取操作。


  此嵌入式視頻處理平臺主要應(yīng)用于視頻和圖像的處理,如進行視頻跟蹤、圖像的編解碼等。

  本文詳細闡述如何在TMS320DM*6平臺上進行Linux系統(tǒng)移植,形成了一個完整的Linux移植體系,為后續(xù)在此平臺上的開發(fā)搭建了一個良好的平臺,其移植流程如圖2所示。


  2交叉編譯環(huán)境的建立

  開發(fā)一個嵌入式Linux系統(tǒng),首先要建立良好的交叉編譯環(huán)境。所謂交叉編譯環(huán)境,是由編譯器、連接器和解釋器組成的綜合開發(fā)環(huán)境。交叉編譯是嵌入式系統(tǒng)開發(fā)過程中的一項重要技術(shù),它的主要特征是某機器中執(zhí)行的程序代碼不是在本機編譯生成,而是由另一臺機器編譯生成。一般把前者稱為目標(biāo)機 (tar-get),后者稱為宿主機(host)。在宿主機上編譯好適合目標(biāo)機運行的代碼后,通過宿主機到目標(biāo)機的調(diào)試通道將代碼下載到目標(biāo)機,然后由運行于宿主機的調(diào)試軟件控制代碼在目標(biāo)機上運行調(diào)試,其交叉編譯開發(fā)模型如圖3所示。


  建立ARM的交叉編譯環(huán)境主要用到的開發(fā)工具有:binutils、gcc、glibc。其中binutils是二進制文件的處理工具,它主要包含了一些輔助開發(fā)工具,例如obj-dump顯示反匯編碼、nm列出符號表、readelf顯示elf文件信息及段信息等。這些工具在嵌入式開發(fā)初期,尤其是移植調(diào)試操作系統(tǒng)時非常有用;gcc是用來編譯內(nèi)核代碼的工具,可以編譯匯編語言和C語言的程序,生成ARM的代碼;glibc是一個提供系統(tǒng)調(diào)用和基本函數(shù)的C語言庫,所有動態(tài)鏈接的程序都要用到它。將這些開發(fā)工具包下載到宿主機上進行編譯、安裝,即可創(chuàng)建ARM的交叉編譯環(huán)境。[!--empirenews.page--]

  3BootLoader的設(shè)計

  BootLoader即引導(dǎo)加載程序,是在操作系統(tǒng)內(nèi)核運行之前運行的一段程序。它建立起操作系統(tǒng)運行的環(huán)境,包括初始化硬件、建立存儲空間映射和傳遞給操作系統(tǒng)一些基本的配置參數(shù)等。因此,Bootloader是非常重要的組成部分,它獨立于操作系統(tǒng),必須由用戶自己設(shè)計,而且其實現(xiàn)高度依賴于硬件。在系統(tǒng)存儲的空間分配結(jié)構(gòu)中BootLoader、內(nèi)核啟動參數(shù)、內(nèi)核映像和根文件系統(tǒng)映像的關(guān)系如圖4所示。


  BootLoader的作用是正確地調(diào)用內(nèi)核來執(zhí)行。系統(tǒng)開機后,執(zhí)行的第1條指令是從Flash的0x00地址開始的,BootLoader 程序就是放在此。由于它是直接操作硬件且依據(jù)硬件環(huán)境不同而代碼不同,所以適合用匯編語言寫,以達到短小精悍執(zhí)行效率高的目的;內(nèi)核從Flash復(fù)制到 SDRAM時,采用C語言實現(xiàn),能實現(xiàn)較復(fù)雜的功能,因此BootLoader的設(shè)計分為兩個階段。用匯編語言實現(xiàn)的放在第1階段,主要完成硬件初始化,設(shè)置SDRAM,然后把Boot-Loader從Flash復(fù)制到SDRAM的起始地址,即2M處,最后內(nèi)存重映射,F(xiàn)lash地址從0x00- 0xlff映射成0x1000000-0x11fff,SDRAM地址0x200000-0xllfff映射成0x00-0xfff,至此控制權(quán)交給了用 C語言實現(xiàn)的loaderkernel()函數(shù),就進入了第2階段。第2階段是用C語言實現(xiàn)的,它主要完成內(nèi)核從Flash到SDRAM的復(fù)制,然后控制權(quán)交給Kernel,流程如圖5所示。這樣設(shè)計代碼會具有很好的可讀性和可移植性。


  本系統(tǒng)BootLoader的第1階段設(shè)計包括:

  a)關(guān)閉看門狗程序,屏蔽所有中斷;

  b)設(shè)置處理器時鐘和工作頻率,TMS320-DM*6中ARM9的工作頻率為300 MHz;

  c)初始化外部寄存器;

  d)初始化堆棧指針;

  e)復(fù)制BootLoader的第2階段到RAM空間中,使用一條跳轉(zhuǎn)語句跳轉(zhuǎn)到第2階段的C程序如入口處。

  第2階段用C語言編寫,具體步驟如下:

  a)設(shè)置通用I/O口參數(shù);

  b)初始化內(nèi)存映射和內(nèi)存管理單元;

  c)初始化mtd設(shè)備;

  d)復(fù)制Flash中的Kernel映像和根文件系統(tǒng)映像到RAM空間中;

  e)跳轉(zhuǎn)到內(nèi)核的第1條指令處,跳轉(zhuǎn)時需要滿足這些條件:R0=0,R1=機器類型ID,R2=啟動參數(shù),同時禁止中斷(IRQ和FIQ),CPU設(shè)置為保護模式,關(guān)閉MMU和數(shù)據(jù)Cache。[!--empirenews.page--]

  這樣,本系統(tǒng)的BootLoader就設(shè)計完成了,下面就可以進行Linux內(nèi)核移植。

  4 Linux內(nèi)核移植

  Linux內(nèi)核主要由5個子系統(tǒng)構(gòu)成:

  a)進程調(diào)度(Process Scheduler):負責(zé)控制進程對CPU的使用。

  b)內(nèi)存管理(Memory Manager):標(biāo)準(zhǔn)Linux的內(nèi)存管理支持虛擬內(nèi)存,進程代碼、數(shù)據(jù)和堆棧的總量可以超過實際內(nèi)存的大小。

  c)虛擬文件系統(tǒng)(Virtual File System):隱藏了不同硬件的具體細節(jié),為所有設(shè)備提供統(tǒng)一的接口。

  d)網(wǎng)絡(luò)接口(Network Interface):負責(zé)支持標(biāo)準(zhǔn)的網(wǎng)絡(luò)通信協(xié)議和各種網(wǎng)絡(luò)硬件設(shè)備。

  e)進程間通信(Inter-Process Communica-tion):支持進程間各種通信機制。

  根據(jù)嵌入式系統(tǒng)的特點,要使嵌入式Linux系統(tǒng)具備一定的功能且保持小型化,應(yīng)包括啟動加載程序、內(nèi)核、初始化進程,以及硬件驅(qū)動程序、文件系統(tǒng)、必要的應(yīng)用程序等。

  不管是哪一款嵌入式處理器,完成移植工作就要修改所有與體系結(jié)構(gòu)有關(guān)的代碼,主要指內(nèi)核人口、處理器初始化、I/O口映射等。具體操作如下:

  (1)修改配置文件

  a)打開根目錄下的Makefile文件,指定目標(biāo)平臺ARCH=arm;指定交叉編譯器CROSS_COMPILE=arm-linux-gcc;

  b)打開/arch/arm目錄下的Makefile文件,添加內(nèi)核起始運行地址,即image.ram應(yīng)下載的位置,該位置一般在RAM區(qū)起始地址偏移0x8000處;

  c)打開/arch/arm/boot目錄下的Makefile文件,指定Bootloader的壓縮內(nèi)核解壓后數(shù)據(jù)的輸出地址。

  (2)編譯Linux內(nèi)核

  在完成上述工作后,開始編譯Linux內(nèi)核,生成目標(biāo)代碼。在內(nèi)核源代碼目錄下依次鍵入以下命令:

  a)make clean:清除以前構(gòu)造內(nèi)核時生成的所有目標(biāo)文件、模塊和臨時文件;

  b)make dep:搜索Linux輸出與源代碼之間的依賴關(guān)系,并以此生成依賴文件;

  c)make menuconfig:調(diào)用菜單式的配置內(nèi)核界面,內(nèi)核配置的選項非常多,根據(jù)自己系統(tǒng)的具體情況選擇合理的配置,在內(nèi)核配置時選上相應(yīng)型號的硬件;

  d)make zImage:編譯內(nèi)核,生成壓縮的Linux內(nèi)核目標(biāo)代碼zImage文件;

  e)make modules:編譯塊模塊驅(qū)動程序,凡是在menuconfig中被選為的都會在這條命令運行時被編譯。

  至此,已編譯好能在本系統(tǒng)上運行的Linux內(nèi)核。

  (3)創(chuàng)建JFFS2文件系統(tǒng)

  文件系統(tǒng)是Linux系統(tǒng)的重要組成部分。本系統(tǒng)使用mkfs.jffs2工具創(chuàng)建JFFS2文件系統(tǒng)。首先建立/bin、/sbin等目錄,然后復(fù)制命令工具到/bin文件夾,復(fù)制系統(tǒng)控制程序到/sbin目錄下,復(fù)制應(yīng)用程序運行時所需的庫到/lib,庫文件可從PC機的交叉編譯工具安裝目錄下復(fù)制。最后鍵人命令:mkfs.jffs2-o jffs2root.jffs2,生成JFFS2根文件系統(tǒng)。

  上述工作完成后,將BootLoader、Linux內(nèi)核、文件系統(tǒng)燒寫到TMS320DM*6的Flash中,這樣就能運行Linux系統(tǒng)了。[!--empirenews.page--]

  5設(shè)備驅(qū)動程序開發(fā)

  5.1 Linux設(shè)備驅(qū)動程序開發(fā)步驟

  Linux系統(tǒng)設(shè)備分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備3種。其設(shè)備驅(qū)動的開發(fā)主要包括:

  a)在驅(qū)動程序源文件中定義file_opera-tions結(jié)構(gòu),并編寫出設(shè)備需要的各個操作函數(shù),對于設(shè)備不需要的操作函數(shù)用NULL初始化,這些操作函數(shù)將被注冊到內(nèi)核中。

  b)定義一個初始化函數(shù),在Linux初始化時會調(diào)用此函數(shù)。此函數(shù)包含:初始化驅(qū)動程序要用到的硬件寄存器;初始化與設(shè)備相關(guān)的參數(shù);注冊設(shè)備;注冊設(shè)備使用的中斷和函數(shù);其他一些初始化工作。

  c)對于驅(qū)動程序的使用,可以進行靜態(tài)編譯,也可以進行動態(tài)編譯。靜態(tài)編譯是指將設(shè)備驅(qū)動程序添加到內(nèi)核中,動態(tài)編譯是指將設(shè)備驅(qū)動程序編譯成驅(qū)動模塊。

  本嵌入式系統(tǒng)主要用于視頻處理,涉及到的外設(shè)主要是顯示設(shè)備和輸入設(shè)備。這里采用的顯示設(shè)備是LCD,而輸入設(shè)備是通過USB接口與系統(tǒng)相連的。

  5.2 LCD顯示驅(qū)動程序開發(fā)

  LCD的設(shè)備驅(qū)動程序?qū)儆谧址O(shè)備的驅(qū)動,應(yīng)按照字符設(shè)備的規(guī)則編寫。在Linux下進行LCD顯示用Framebuffer技術(shù),這是提取圖形的設(shè)備,是用戶進入圖形界面很好的接口。Linux內(nèi)核根據(jù)硬件描述抽象出Framebuffer設(shè)備,供用戶態(tài)的進程直接進行寫屏。可以將 Framebuffer看成是顯示內(nèi)存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,寫操作立即反應(yīng)在屏幕上。 Framebuffer的設(shè)備文件一般存放在/dev這個目錄下,對此設(shè)備文件進行操作即可實現(xiàn)圖像的顯示。

  LCD顯示驅(qū)動程序主要包括:

  a)LCD驅(qū)動的文件結(jié)構(gòu):包括打開設(shè)備文件、設(shè)備文件其它操作、關(guān)閉設(shè)備文件等;

  b)LCD的打開:LCD設(shè)備以讀寫的方式打開;

  c)LCD設(shè)備的硬件初始化:包括注冊LCD設(shè)備、卸載LCD設(shè)備等;

  d)LCD相關(guān)結(jié)構(gòu)的設(shè)置:以獲取顯存起始地址、分別率、色深等;

  e)映射內(nèi)存區(qū)的操作:包括初始化顯存清零等,將攝像頭采集到的圖像數(shù)據(jù)讀至顯存處,以顯示圖像;

  f)LCD控制輸出:包括得到命令、畫水平線、畫垂直線、畫圓等;

  g)LCD的關(guān)閉。

  將上面的內(nèi)容用程序?qū)崿F(xiàn),進行動態(tài)編譯。通過后,將LCD驅(qū)動模塊進行移植加載,一個完整的LCD驅(qū)動就開發(fā)完畢了。

  5.3 USB驅(qū)動程序開發(fā)

  與LCD設(shè)備不同,USB既不屬于字符設(shè)備,也不屬于塊設(shè)備,而是一個新的設(shè)備類別,設(shè)計框架和流程如下:首先,提供一個“.o”的驅(qū)動模塊文件,且在一開始就加載運行。USB驅(qū)動就會根據(jù)其類型向系統(tǒng)注冊。注冊成功后,系統(tǒng)會反饋一個主設(shè)備號,這個主設(shè)備號就是其唯一標(biāo)識。USB驅(qū)動就是根據(jù)主設(shè)備號創(chuàng)建一個放置在/dev目錄下的設(shè)備文件。要訪問此硬件,可用open、read和write等命令訪問相應(yīng)的設(shè)備文件,驅(qū)動就會接收到相應(yīng)的 read或write函數(shù),根據(jù)模塊中相對應(yīng)的函數(shù)進行操作。驅(qū)動流程見圖6。


  USB驅(qū)動的具體設(shè)計過程如下:

  a)USB驅(qū)動的注冊。USB驅(qū)動程序在注冊時會發(fā)送一個命令給函數(shù)register_chrdev,通常在驅(qū)動程序的初始化函數(shù)中。當(dāng)USB 設(shè)備插入時,為了使linux-hotplug(Linux中USB等設(shè)備熱插拔支持)系統(tǒng)自動裝載驅(qū)動程序,需創(chuàng)建 MODULE_DEVICE_TABLE,在此過程中需將USB的主設(shè)備號傳遞給相應(yīng)的函數(shù)。

  b)USB設(shè)備的打開。打開設(shè)備是通過調(diào)用file_operations結(jié)構(gòu)中的函數(shù)open()來完成的。其主要完成的任務(wù)是:檢查設(shè)備相關(guān)錯誤,如果是第一次打開,則初始化硬件設(shè)備;識別次設(shè)備號;使用計數(shù)增1。

  c)USB設(shè)備的釋放。釋放設(shè)備是通過調(diào)用file_operations結(jié)構(gòu)中的函數(shù)release()來完成的。它的作用正好與open()相反,通常要完成這樣的工作:使用計數(shù)減1,如果使用計算為0,則關(guān)閉設(shè)備。

  d)USB設(shè)備的控制信息與數(shù)據(jù)讀寫。USB設(shè)備驅(qū)動程序可以通過文件操作結(jié)構(gòu)中的函數(shù)向應(yīng)用程序提供對硬件進行控制的接口,同時讀寫操作也要通過此函數(shù)來完成。

  e)USB驅(qū)動的注銷。當(dāng)從系統(tǒng)卸載驅(qū)動程序時,需要注銷USB設(shè)備,這樣必須編寫一個注銷函數(shù)unregister_chrdev。

  6結(jié)束語

  本文基于TMS320DM*6平臺實現(xiàn)了Linux移植,包括創(chuàng)建交叉編譯環(huán)境、BootLoader的設(shè)計、Linux內(nèi)核移植以及LCD、 USB設(shè)備驅(qū)動程序開發(fā),為實時視頻處理應(yīng)用開發(fā)創(chuàng)建了一個良好的嵌入式平臺,在此平臺上可進一步進行應(yīng)用程序、GUI及視頻處理算法開發(fā)與測試。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉