目錄php
1 簡介html
2 安裝步驟linux
2.1 準備目標內核shell
2.2 配置和創建目標內核架構
2.3 創建用戶空間的支持框架
2.3.1 特徵衝突解決dom
2.3.2 通用配置項ide
2.3.3 特定體系結構的配置項工具
2.3.4 交叉編譯開發工具
3 典型的安裝過程
3.1 x86_32/64 爲下構建
3.2 PowerPC 體系結構下構建
3.3 Blackfin 下構建
3.4 ARM下構建
4 測試安裝
4.1 測試內核
4.2 測試用戶空間的支持
該文檔的最新版的能夠點此得到。
有任何問題、糾正和改進,請寫信給這個地址(xenomai@xenomai.org)。
1 簡介
從2.1版開始,Xenomai遵循着一個分裂源模型,解耦從用戶空間庫訪問內核空間的支持。
爲此,內核和用戶空間的Xenomai組件分別能夠在ksrc/和src/子目錄下得到。
ksrc/子目錄提供了內核空間的支持,被看作是Linux內核的一個內建擴展,並無更多的做爲單獨樹模塊的一個集合。這種作法的直接好處是具備了將Xenomai實時子系統靜態構建到目標內核的能力,或者是做爲早期版本的可加載模塊。所以,一般的Linux內核配置過程一般用於定義的Xenomai內核組件的各類設置。「準備目標內核」和「配置和構建內核」章節說明了這種內核空間支持的安裝過程。
src/子目錄包含由Xenomai框架提供的各類用戶空間庫和命令。這個目錄的構架能夠不用內核的支持,即便後者在構建系統裏沒有。「構建用戶空間支持」這一節說明了用戶空間支持的安裝過程。
若是你在使用基於Debian的發行版,也能夠安裝,甚至把Xenomai構建成爲一組Debian軟件包。要進一步瞭解細節,請看本頁。
2 安裝步驟
2.1 準備目標內核
Xenomai提供一個實時子系統無縫集成到Linux,所以第一步是將它構建爲目標內核的一部分。爲此,scripts/prepare-kernel.sh是一個shell腳本適當的設定了目標內核。語法形式以下:
$ scripts/prepare-kernel.sh --linux=<linux-srctree> [--adeos=<adeos-patch>] [--arch=<target-arch>] --linux 指定目標內核源碼樹的路徑。這種內核樹配置與否沒有什麼區別,是兩種有效的方式。 --adeos 指定Adeos補丁的路徑應用到對應的內核樹。Xenomai合適的補丁能夠在ksrc/arch<target-arch>/patches下得到。若是Adeos已經修補則這個參數能夠省略,不然腳本會建議一個合適的補丁。不管如何,每當一個先前的補丁被探測到,腳本將不會再次嘗試應用它。 --arch 告訴腳本目標體系結構。若是未註明,構建系統的架構將會被檢測到並會做爲一個默認合理的建議。 |
例如,下面的命令將會準備位於/usr/src/linux-2.6.23-ipipe爲了包含Xenomai支持的Linux樹:
$ cd xenomai-2.4 $ scripts/prepare-kernel.sh --linux=/usr/src/linux-2.6.23-ipipe |
注意:這個腳本將會從它在的Xenomai源碼樹中推斷Xenomai內核代碼。也就是說,若是/usr/src/scripts/prepare-kernel.sh 被執行了,則Xenomai的內核支持將會從/usr/src/xenomai-2.4/ksrc並勢必會綁到目標內核。
2.2 配置和創建目標內核
一旦目標內核被準備完畢,內核應該按照其一般的配置過程被配置。全部的Xenomai配置選項均可以在「Real-time subsystem」(實時子系統)的頂層菜單中得到。
有不少重要的內核配置選項,有些在TROUBLESHOOTING指導手冊中提到,其餘的在"Typeical installation procedures"的您正在使用的體系結構中提到。
一旦被配置,內核必須像往常同樣被構建。
若是你想要幾個不一樣的配置/構建,你能夠經過對每一個調用增長O=../build-<target>用一樣的資源。請查看「PowerPC體系結構下構建」的例子。
爲了能交叉編譯Linux內核,在make命令的時候傳遞給ARCH和CROSS_COMPLIE變量值。查看「PowerPC體系結構下構建」、「Blackfin的構建」、「ARM下的構建」和「NIOS II下的構建」章節。
2.3 構建用戶空間的支持
提供了一個常規的autoconf腳原本準備構建用戶空間的支持。如下列出的選項能夠傳遞給這個腳本。那些選項只會影響做爲Xenomai的用戶空間支持的庫的編譯,不管如何,他們永遠不會影響基於內核的支持。
2.3.1 功能衝突解決
因爲內核和用戶空降強烈的解耦和,Xenomai須要確認全部在配置是選擇的用戶空間的選項將會符合在運行時從目標內核得到實際的支持。例如,X86中在用戶空間啓動對TSC的支持,可是內核以禁用CONFIG_X86_TSC的形式編譯,這一點若是你沒有捕獲,則確定會致使運行時的問題。由於Xenomai和應用不容許他們的定時使用高精度的時鐘。此外,大部分的這類問題不能在編譯階段探測到,由於目標和主機相比一般有不一樣的功能(特色),即便他們是相同的架構(例如 386vs686)。
爲了解決潛在的問題,每一個Xenomai體系結構的接口定義了一組測試一致性的接關鍵特色,每當用戶空間的應用綁定本身到內核空間實時接口的時候。在這種狀況下沒有被解決的衝突將會被報告而且執行會馬上中止。
在兩邊須要完美匹配的選項在下面的列表中被標記爲「strong」,其餘的被標記爲「weak」。Xenomai處理耐受性差別的方法取決於逐案基礎和所考慮的選項。當不適用時,綁定的類型仍然是不肯定的。
例如,UP和啓用SMP的內核能夠不聞不問地運行Up或啓動SMP的用戶空間的應用程序,由於SMP選項的比綁定是弱的。另外一方面,基於x86的應用連接針對編譯時開啓x86-tsc選項的Xenomai庫來講,必須運行以CONFIG_X86_TSC設置構建的內核上,由於x86-tsc選項是強綁定。
2.3.2 通用配置選項
名稱 | 描述 | [綁定,]默認 |
--prefix | 安裝目錄 | /usr/xenomai |
--enable-debug | 開啓調試標誌(-g) | disable |
--enable-smp | 開始SMP支持 | weak, enabled |
--with-atomic-ops= | 在Xenomai庫中選擇採用哪一個原子訪問操做的實現: --with-atomic-ops= builtins選擇GCC內建的,例如_sync*()服務。 --with-atomic-ops=ad-hoc 選擇ad hocXenomai實現 當這個開關沒有被指定,系統將會依據目標體系就夠作一個保守的選擇。 除非GCC工具鏈過期(也就是,不提供這些操做)或算壞了, --with-atomic-ops=builtins必須被使用。 |
arch-dependent |
2.3.3 特定體系結構的配置選項
名稱 | 描述 | [綁定,]默認 |
--enable-x86-sep | 未解決系統調用啓用x86 SEP指令,你還須要NPTL | strong,enabled |
--enable-x86-tsc | 爲了計時開啓x86 TSC,你必須擁有TSC。 | strong,enabled |
--enable-arm-tsc | 開啓ARM TSC仿真 | weak,kuser |
--enable-arm-quirks | 爲特定的ARM片上系統開啓quirks,當前支持sa1100和xscale3 | weak,disabled |
2.3.4 交叉編譯
爲了交叉編譯Xenomai用戶控件的支持,你須要給配置腳本傳遞一個--host和--build選項。--host選項容許爲體系結構選擇要構建的庫和程序。--build選項容許選擇編譯的工具要運行的體系結構,即,系統運行配置腳本。
因爲交叉編譯須要特定的工具,這些工具一般以宿主機的體系結構名字爲前綴;例如一個PowerPC體系結構的編譯器會被命名爲powerpc-405-linux-gnu-gcc。
當把選項--host=powerpc-405-linux-gnu-gcc傳遞給配置文件的時候,配置文件將會自動的使用powerpc-405-linux-gnu-gcc做爲全部編譯工具名字的一個前綴而且會從這個前綴中推斷宿主機體系結構的名字。若是配置文件不能從交叉編譯工具前綴中推斷出宿主機體系結構的名字,你須要手工的去傳遞全部編譯工具的名字。查看「PowerPC結構下構建」和「Blackfin下構建」章節,使用CC和LD變量的例子,或者「ARM下構建」使用--host參數的例子。
製做一個GNU交叉編譯器最簡單的方法可能包括使用crosstool-ng,在此處能夠得到。
若是你想避免構建本身的交叉編譯器,你或許可使用ELDK。它包含了GNU 交叉開發工具,例如;編譯器、binutils、gdb等等。而且一些預構建的目標工具盒庫須要提供一些目標系統的功能。點擊此處瞭解詳情。
其餘一些預構建的工具鏈:
3 典型的安裝過程
如下章節中使用的例子遵循如下約定:
$linux_tree
目標內核源文件的路徑
$xenomai_root
Xenomai源文件的路徑
$build_root
一個乾淨的構建目錄
$staging_dir
在將安裝文件移動到他們最終的爲以前暫時存儲它們的目錄;當使用交叉編譯安裝時,它一般是從目標根目錄到本地構建主機的一個NFS掛載點,做爲在宿主機上運行make DESTDIR=$staging_dir install的結果當即用安裝的程序和庫更新目標系統。
3.1 x86_32/64位下構建
從Linux 2.6.24 x86_32和x86_64樹合併了。所以,爲2.6.24或之後的版本構建Xenomai幾乎相同,不論是32/64位問題。然而,你必須注意的是沒法將使用x86_32編譯的xenomai庫運行在使用x86_64編譯的內核上。
假設你想構建本地x86_64系統(從x86_64表示出的x86_32交叉構建選項在括號中),你將會運行:
$ $xenomai_root/scripts/prepare-kernel.sh --arch=x86 \ --adeos=$xenomai_root/ksrc/arch/x86/patches/adeos-ipipe-2.6.29.4-x86-X.Y-ZZ.patch \ --linux=$linux_tree $ cd $linux_tree $ make [ARCH=i386] xconfig/gconfig/menuconfig |
...配置內核(同時點擊此處查看建議設置)
啓用Xenomai選項,那麼安裝須要:
$ make [ARCH=i386] bzImage modules $ mkdir $build_root && cd $build_root $ $xenomai_root/configure --enable-x96-sep \ [--host=i686-linux CFLAGS=「-m32 -O2」 LDFLAGS="-m32"] $ make install |
如今,咱們來討論你真地想爲一個基於奔騰 x86 32位平臺運行一個傳統2.6.23內核構建Xenomai,使用本地主機的工具鏈;典型的步驟以下:
$ $xenomai_root/scripts/prepare-kernel.sh --arch=i386 \ --adeos=$xenomai_root/ksrc/arch/x86/patches/adeos-ipipe-2.6.23-i386-X.Y-ZZ.patch \ --linux=$linux_tree $ cd $linux_tree $ make xconfig/gconfig/menuconfig |
...配置內核(同時點擊此處查看建議設置)
啓用Xenomai選項,那麼安裝須要:
$ make bzImage modules $ mkdir $build_root && cd $build_root $ $xenomai_root/configure --enable-x86-sep $ make install |
相似的,對於一個64位平臺的傳統內核,你將會使用:
$ $xenomai_root/scripts/prepare-kernel.sh --arch=x86_64 \ --adeos=$xenomai_root/ksrc/arch/x86/patches/adeos-ipipe-2.6.23-x86_64-X.Y-ZZ.patch \ --linux=$linux_tree $ cd $linux_tree $ make xconfig/gconfig/menuconfig |
...配置內核(同時點擊此處查看建議設置)
啓用Xenomai選項,那麼安裝須要:
$ make bzImage modules $ mkdir $build_root && cd $build_root $ $xenomai_root/configure $ make install |
一旦編譯完成,/usr/xenomai就會包含用你構建調用Xenomai內核空間實時支持的應用程序的用戶空間的庫和頭文件。
剩下的例子說明了怎樣爲不一樣的體系結構交叉編譯Xenomai。固然,爲了構建Xenomai你首先須要爲目標系統安裝適當的交叉編譯工具鏈。
3.2 PowerPC體系結構下構建
PowerPC有一個傳統的arch/ppc分支,和一個新的,當前arch/powerpc樹。Xenomai對二者都支持,可是使用arch/powerpc是絕對 推薦的。爲幫助準備腳本選擇正確的一個,你必須指定--arch=powerpc(當前)或--arch=ppc(傳統)。接下來的工做就很簡單了:
一個典型的交叉編譯安裝,爲了爲運行最近2.6.29.4內核的lite5200構建Xenomai,咱們使用DENX's ELDK交叉編譯器:
$ $xenomai_root/scripts/prepare-kernel.sh --arch=powerpc \ --adeos=$xenomai_root/ksrc/arch/powerpc/patches/adeos-ipipe-2.6.29.4-powerpc-2.6-00.patch ←- \ --linux=$linux_tree $ cd $linux_tree $ make ARCH=powerpc CROSS_COMPILE=ppc_6xx- xconfig/gconfig/menuconfig |
...選擇內核和Xenomai選項,保存配置
$ make ARCH=powerpc CROSS_COMPILE=ppc_6xx- uImage modules |
...手工安裝u-boot鏡像和模塊到適當的位置
$ cd $build_root $ $xenomai_root/configure --host=powerpc-unknown-linux-gnu \ CC=ppc_6xx-gcc AR=ppc_6xx-ar LD=ppc_6xx-ld $ make DESTDIR=$staging_dir install |
另一個交叉編譯安裝,爲了爲運行最近2.6.29.4內核的powerpc64 PA-Semi板子構建Xenomai:
$ $xenomai_root/scripts/prepare-kernel.sh --arch=powerpc \ --adeos=$xenomai_root/ksrc/arch/powerpc/patches/adeos-ipipe-2.6.29.4-powerpc-2.6-00.patch ←- \ --linux=$linux_tree $ cd $linux_tree $ make ARCH=powerpc CROSS_COMPILE=powerpc64-linux- xconfig/gconfig/menuconfig |
...選擇內核和Xenomai選項,保存配置
$ make ARCH=powerpc CROSS_COMPILE=powerpc64-linux- |
...手工安裝vmlinux鏡像和模塊到適當的位置
$ cd $build_root $ $xenomai_root/configure --host=powerpc64-linux \ CC=powerpc64-linux-gcc AR=powerpc64-linux-ar LD=powerpc64-linux-ld $ make DESTDIR=$staging_dir install |
另外一個交叉編譯安裝,此次是爲一個基於PowerPC-405的運行傳統arch/ppc 2.6.14內核的 系統構建Xenomai(咱們確實最近也在支持這個平臺):
$ $xenomai_root/scripts/prepare-kernel.sh --arch=ppc \ --adeos=$xenomai_root/ksrc/arch/powerpc/patches/adeos-ipipe-2.6.14-ppc-1.5-*.patch \ --linux=$linux_tree $ mkdir -p $build_root/linux $ cd $linux_tree $ make ARCH=ppc CROSS_COMPILE=ppc_4xx- O=$build_root/linux xconfig/gconfig/menuconfig |
...選擇內核和Xenomai選項,保存配置
$ make ARCH=ppc CROSS_COMPILE=ppc_4xx- O=$build_root/linux bzImage modules |
...手動安裝內核鏡像、系統映射和模塊到適當的地方
$ make $build_root/xenomai && cd $build_root/xenomai $ $xenomai_root/configure --build=i686-pc-linux-gnu --host=ppc-unknown-linux-gnu \ CC=ppc_4xx-gcc LD=ppc_4xx-ld $ make DESTDIR=$staging_dir install |
3.3 Blackfin下構建
Blackfin是一個沒有MMU,DSP類型的體系結構,運行uClinux。
$ $xenomai_root/scripts/prepare-kernel.sh --arch=blackfin \ --adeos=$xenomai_root/ksrc/arch/blackfin/patches/adeos-ipipe-bf53x-*.patch \ --linux=$linux_tree $ cd $linux_tree $ make ARCH=blackfin CROSS_COMPILE=bfin-uclinux- xconfig/gconfig/menuconfig |
...選擇內核和Xenomai選項,接下來編譯:
$ make linux p_w_picpath |
...根據須要安裝
$ cp p_w_picpaths/linux /tftpboot/... |
...構建用戶空間的支持
$ mkdir $build_root && cd $build_root $ $xenomai_root/configure --host=blackfin-unknown-linux-gnu \ CC=bfin-linux-uclibc-gcc AR=bfin-linux-uclibc-ar LD=bfin-linux-uclibc-ld $ make DESTDIR=$staging_dir install |
要是想看看爲Blackfin體系結構配置和構建Xenomai的描述,點擊此處查看。
注意:
在這個體系架構上Xenomai使用了FDPIC共享庫格式。若是在運行測試用例的時候產生問題,請嘗試重作最後的兩步,並傳遞--disabled-shared選項給「配置」腳本。
3.4 ARM下構建
使用CodeSourcery的名爲arm-none-linux-gnueabi-gcc工具鏈爲CSB637板子(基於AT91RM9200)編譯,典型的編譯以下:
$ $xenomai_root/scripts/prepare-kernel.sh --arch=arm \ --adeos=$xenomai_root/ksrc/arch/arm/patches/adeos-ipipe-2.6.20-arm-* \ --linux=$linux_tree $ cd $linux_tree $ mkdir -p $build_root/linux $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- O=$build_root/linux \ csb637_defconfig $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- O=$build_root/linux \ bzImage modules |
...手動安裝內核鏡像、系統映射和模塊到適當的地方
$ mkdir $build_root/xenomai && cd $build_root/xenomai $ $xenomai_root/configure CFLAGS="-march=armv4t" LDFLAGS="-march=armv4t" \ --build=i686-pc-linux-gnu --host=arm-none-linux-gnueabi- $ make DESTDIR=$staging_dir install |
重要:
與先前的相反,Xenomai無需傳遞任何arm體系架構下的特定標誌,或FPU標誌給gcc,因此,用戶須要傳遞上例所表示的CFLAGS和LDFLAGS變量,AT91RM9200是基於ARM920T核心,實現armv4架構。下面的表格總結了CFLAGS和在先前版本中自動傳遞的可是如今須要顯示的去配置的選項,對於支持的片上系統:
SOC | CFLAGS | configure options |
at91rm9200 | -march=armv4t -msoft-float | |
at91sam9x | -march=armv5 -msoft-float | |
imx1 | -march=armv4t -msoft-float | |
imx21 | -march=armv5 -msoft-float | |
imx31 | -march=armv6 -mfpu=vfp | |
imx51/imx53 | -march=armv7-a -mfpu=vfp3 | |
imx6q | -march=armv7-a -mfpu=vfp3 | |
ixp4xx | -march=armv5 -msoft-float | --enable-arm-tsc=ixp4xx |
omap3 | -march=armv7-a -mfpu=vfp3 | |
omap4 | -march=armv7-a -mfpu=vfp3 | |
orion | -march=armv5 -mfpu=vfp | |
pxa | -march=armv5 -msoft-float | |
pxa3xx | -march=armv5 -msoft-float | --enable-arm-quirks=xscale3 |
s3c24xx | -march=armv4t -msoft-float | |
sa1100 | -march=armv4t -msoft-float | --enable-arm-quirks=sa1100 |
爲一個老的體系架構版本構建是可能的(v6替代v7,或者v4替代v5),若是你的工具鏈不支持目標體系架構,惟一的限制在是否啓用了SMP,體系架構不能小於v6。
4 安裝測試
4.1 測試內核
爲了測試Xenomai的安裝,首先你要嘗試啓動打過補丁的內核。內核啓動信息必須打印以下信息:
I-pipe: head domain Xenomai registered. Xenomai: hal/<arch> started. Xenomai: scheduling class idle registered. Xenomai: scheduling class rt registered. Xenomai: real-time nucleus v2.6.1 (Light Years Away) loaded. Xenomai: debug mode enabled. Xenomai: starting native API services. Xenomai: starting POSIX services. Xenomai: starting RTDM services. |
<arch>是你使用的體系架構。若是內核啓動失敗或者日誌信息暗示了一個錯誤狀狀態,請看故障檢測指南。
4.2 測試用戶空間支持
爲了測試Xenomai用戶空間的支持,啓動延遲測試:
$ xeno latency |
延遲測試應該每秒顯示最小、最大和平均延遲值的信息,例如:
# xeno latency -T 25
== Sampling period: 100 us
== Test mode: periodic user-mode task
== All results in microseconds
warming up...
RTT| 00:00:01 (periodic user-mode task, 100 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD| 1.615| 1.923| 9.846| 0| 0| 1.615| 9.846
RTD| 1.615| 1.923| 9.692| 0| 0| 1.615| 9.846
RTD| 1.538| 1.923| 10.230| 0| 0| 1.538| 10.230
RTD| 1.615| 1.923| 10.384| 0| 0| 1.538| 10.384
RTD| 1.615| 1.923| 11.230| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 9.923| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 9.923| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 11.076| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 10.538| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 11.076| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 10.615| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 10.076| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 9.923| 0| 0| 1.538| 11.230
RTD| 1.538| 1.923| 10.538| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 10.923| 0| 0| 1.538| 11.230
RTD| 1.538| 1.923| 10.153| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 9.615| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 10.769| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 9.153| 0| 0| 1.538| 11.230
RTD| 1.538| 1.923| 10.307| 0| 0| 1.538| 11.230
RTD| 1.615| 1.923| 9.538| 0| 0| 1.538| 11.230
RTT| 00:00:22 (periodic user-mode task, 100 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD| 1.615| 1.923| 11.384| 0| 0| 1.538| 11.384
RTD| 1.615| 1.923| 10.076| 0| 0| 1.538| 11.384
RTD| 1.538| 1.923| 9.538| 0| 0| 1.538| 11.384
-----|-------------|-----------|-------------|-----------|--------|-------------------------
RTS| 1.538| 1.923| 11.384| 0| 0| 00:00:25/00:00:25
#
若是延遲測試顯示錯誤信息、卡死或者顯示非指望的值,請查看故障檢測指南。若是延遲測試成功,你應該嘗試在有負載的狀況下運行一個延遲測試來測試你的系統,xeno-test腳本容許你這麼作。更多信息請查閱xeno-test(1)手冊。
備註:剛在51cto開博,csdn博客地址爲:http://blog.csdn.net/ucan23/article/details/16827267