<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 高手進階2.6內(nèi)核的Linux嵌入式系統(tǒng)應用

          高手進階2.6內(nèi)核的Linux嵌入式系統(tǒng)應用

          作者: 時間:2013-04-06 來源:網(wǎng)絡 收藏

          1.6 面向應用

          嵌入式應用有用戶定制的特點,硬件設計都針對特定應用開發(fā),這給系統(tǒng)帶來對非標準化設計支持的問題(如IRQ的管理)。為了更好地實現(xiàn),可以采用部件化的操作系統(tǒng)。2.6采用的子系統(tǒng)架構(gòu)將功能模塊化,可以定制而對其他部分影響最小。同時2.6提供了多種新技術的支持以實現(xiàn)各種應用開發(fā),如Advanced Sound Architecture(ALSA)和Video4Linux等,對多媒體信息處理更加方便;對USB2.0的支持,提供更高速的傳輸,增加藍牙無線接口、音頻數(shù)據(jù)鏈接和面向鏈接的數(shù)據(jù)傳輸L2CAP,滿足短距離的無線連接的需要;而且在中還可以配置成無輸入和顯示的純粹無用戶接口系統(tǒng)。

          2 應用研究

          開發(fā)板上移植嵌入式Linux 2.6.11.7內(nèi)核系統(tǒng),應用于構(gòu)建H.264多媒體系統(tǒng)。

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

          在RedHat9的主機上進行內(nèi)核移植開發(fā),首先需要建立交叉編譯環(huán)境。由于中采用了一些新的特性和指令,需要采用較新的工具集,采用binutils-2.15、gcc-3.4.2、glibc-2.2.5、linux-2.6.8、glibc-linuxthreads-2.2.5來建立交叉編譯工具鏈,建立之后將工具鏈路徑加入系統(tǒng)路徑$PATH中。

          2.2 內(nèi)核修改

          Linux 2.6.11.7內(nèi)核加入了對芯片的支持,不再需要任何補丁文件。修改內(nèi)核源碼中Makefile的交叉編譯選項ARCH=arm,CROSS_COMPILE=arm-linux-。針對硬件配置,需要在arch/arm/mach-s3c2410/devs.c或者smdk2410.c中添加FLASH的分區(qū)信息s3c_nand_info,如表1。

          表1 NAND FLASH分區(qū)表 分區(qū)名 起始地址 大 小 Vivi 0x00000000 0x00020000 Param 0x00020000 0x00010000 Kernel 0x00030000 0x001c0000 Root 0x00200000 0x00200000 Usr 0x00400000 0x03c00000

          然后在s3c_device_nand中增加.dev={.platform_data= s3c_nand_info},在arch/arm/mach-s3c2410/mach-smdk2410.c中的__initdata部分增加s3c_device_nand,使內(nèi)核在啟動時初始化NAND FLASH信息。

          2.3 內(nèi)核編譯加載

          對內(nèi)核進行適當?shù)呐渲檬且粋€量體裁衣的過程。由于會根據(jù)本地系統(tǒng)配置進行初始設置,可以導入內(nèi)核源碼默認s3c2410的配置文件,方便加載內(nèi)核基本配置,然后再選擇所需選項。對MTD配置選擇支持MTD設備驅(qū)動以及NAND FLASH驅(qū)動;選擇支持要用到的各類文件系統(tǒng)(DEVFS、TMPFS、CRAMFS、YAFFS、EXT2、NFS)以及網(wǎng)絡設備和協(xié)議,本系統(tǒng)加載了網(wǎng)絡芯片CS8900以及USB支持;在H.264多媒體系統(tǒng)中還需要加載Frame buffer以支持LCD顯示功能。使用交叉編譯工具編譯內(nèi)核源碼后, 會在arch/arm/boot/下生成名為zImage的內(nèi)核映像,在Boot loader的命令提示模式下使用下載命令完成內(nèi)核加載到開發(fā)板的存儲設備FLASH中。編譯過程(相對以前版本的編譯過程,2.6內(nèi)核編譯有所簡化):

          make mrproper

          make menuconfig(字符界面,或者用make xconfig圖形界面,但需要Qt庫的支持,而make gconfig則需要GTK庫的支持)

          make

          make bzImage

          2.4 文件系統(tǒng)

          Linux采用文件系統(tǒng)組織系統(tǒng)中的文件和設備,為設備和用戶程序提供統(tǒng)一接口。Linux 支持多種文件系統(tǒng),本系統(tǒng)使用CRAMFS格式的只讀根文件系統(tǒng),而將FLASH中的USER區(qū)使用支持可讀寫的YA FFS文件系統(tǒng)格式,方便添加自己的應用程序。

          在根文件系統(tǒng)中,為保護系統(tǒng)的基本設置不被更改,采用CRAMFS格式。采用DEVFS來實現(xiàn)基本設備的建立掛載,同時使用BusyBox也是一個縮小根文件系統(tǒng)的辦法,提供了系統(tǒng)的基本指令;還需要建立一些必備的目錄,添加所需配置文件,如fstab、inittab等;還有一個重要的工作就是添加系統(tǒng)應用必備的動態(tài)函數(shù)庫。使用生成工具mkcramfs 將整個根文件目錄里的內(nèi)容制作成映像文件。

          mkcramfs rootfs rootfs.ramfs

          YAFFS文件系統(tǒng)格式的支持需要將驅(qū)動加入到內(nèi)核代碼樹下fs/yaffs/,修改內(nèi)核配置文件,就可以在內(nèi)核編譯中加載對該文件系統(tǒng)的支持。使用mkyaffs工具將NAND FLASH分區(qū)格式化為YAFFS分區(qū),將mkyaffsimage生成的應用程序鏡像燒寫進YAFFS分區(qū),在啟動時通過寫入fstab自動加載YAFFS分區(qū)即可。

          2.5 網(wǎng)絡設備驅(qū)動

          系統(tǒng)中采用CS8900A的10M網(wǎng)絡芯片,它使用的nGCS3和IRQ_EINT9,相應修改linux/arch/arm/mach-s3c2410/irq.c,并在mach-smdk2410.c的smdk2410_iodesc>中增加{SMDK2410_ETH_IO,S3C2410_CS2, SZ_1M, MT_DEVICE},內(nèi)核源碼中加入芯片的驅(qū)動程序drivers/net/arm/cs8900.h和cs8900.c,并且配置網(wǎng)絡設備驅(qū)動的Makefile和Kconfig文件,加入CS8900A的配置選項,這樣可以在內(nèi)核編譯時加載網(wǎng)絡設備的驅(qū)動。

          在Linux2.6應用的同時,也要看到其與以前版本內(nèi)核比較存在的一些問題。在內(nèi)核的編譯時間、內(nèi)核鏡像大小、內(nèi)核占用RAM空間大小、系統(tǒng)啟動時間相對Linux2.4而言都存在不同程度的不足,但在硬件條件日益進步的現(xiàn)今可以接受,而且一部分也是由于功能加強必然帶來的。雖然Linux并非一個真正的實時操作系統(tǒng),但2.6內(nèi)核的改進能夠滿足大部分的應用需求,所以Linux2.6內(nèi)核將會在嵌入式系統(tǒng)領域大展身手。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();