快速搭建QNX® SDP(Software Development Platform)

爲了把寫好的程序在 QNX Neutrino RTOS 下運行起來,您首先需要的是 QNX 軟件開發平臺 (SDP)。 該平臺包含構建程序所需的工具,例如編譯器和鏈接器,QNX Neutrino 支持的所有 CPU 架構預編譯。下面將幫助您安裝 QNX 軟件開發平臺,以便您可以在 QNX Neutrino 目標板上運行您的程序。

首先在QNX Neutrino RTOS – Embedded OS官網的_Developers_菜單下的Community(Foundry27)你可以找到相應芯片廠家的基礎BSP開發包。

BSP Directory的Texas Instruments DRA71x Jacinto6 Entry BSP for QNX SDP 6.6爲例

Texas Instruments Jacinto 6 Entry DRA71x EVM Board Support Package功能表如下:

解壓Texas Instruments DRA71x Jacinto6 Entry BSP for QNX SDP 6.6.zip後,目錄結構如下:

$ tree -L 3
.
├── Makefile
├── images
│   ├── Makefile
│   └── mkflashimage.sh
├── install
├── manifest
├── prebuilt
│   ├── armle-v7
│   │   ├── lib
│   │   └── usr
│   └── usr
│       └── include
├── readme.txt
├── source.xml
└── src
    ├── Makefile
    ├── hardware
    │   ├── Makefile
    │   ├── deva
    │   ├── devb
    │   ├── devc
    │   ├── devi
    │   ├── devnp
    │   ├── etfs
    │   ├── flash
    │   ├── i2c
    │   ├── ipl
    │   ├── mtouch
    │   ├── spi
    │   ├── startup
    │   └── support
    └── utils
        ├── Makefile
        └── r

25 directories, 9 files

/src

/src 目錄包含 BSP 附帶的所有源代碼。源代碼是組織成子目錄,例如 /hardware、/lib、/utils 等。當BSP 構建完成後,BSP 內的所有源代碼(包括這些中的源代碼子目錄)都會被構建。

/prebuilt

所有BSP 組件預構建並且存儲在/prebuilt 目錄。如果你在構建 BSP完成後,/prebuilt 的目錄內容複製到 BSP 的 /install 目錄。

/install

在構建 BSP 之前 /install 目錄是空的。在構建 BSP 時,/prebuilt 目錄的全部內容都複製到 /install 目錄中。生成 IFS 映像時,/install 目錄是首先被掃描在 BSP 的構建文件中指定的組件。如果生成 IFS 鏡像進程在 /install 目錄中找不到組件,它會掃描 QNX SDP 6.6 主機的組件的/target 目錄。

如果您想通過更改或構建任何 BSP 源代碼來修改 BSP 組件,你必須在構建相關的源代碼時使用 make install 命令。此命令將導致您修改的組件複製到 BSP的 /install 目錄中,覆蓋由BSP提供的預構建的版本。

/images

/images是存放鏡像的位置:

• BSP 的默認構建文件是在BSP 構建後生成

• 任何啓動映像(例如 IFS 映像、IPL 二進制文件等)被生成。

那我們如何正常開發編譯我們目標板的QNX鏡像呢?

你可以安裝QNX SDP 和 QNX Momentics IDE在你的Linux或者Windows主機上,並且部署QNX Neutrino RTOS在目標板上。

在開發主機上運行QNX Momentics Tool Suite,在目標板上運行QNX Neutrino RTOS和你開發好的程序。

安裝QNX SDP,你需要商用的License。你可以從www.qnx.com/products/evaluation/下載評估License,不過評估License只有30天的使用期限。

QNX660 SDP (QNX ® Software Development Platform 6.6)包含一下內容:

我們展開QNX660 SDP 目錄結構如下:

bspserver@ubuntu:~/workspace/SDP_QNX660$ tree -L 3
.
├── host
│   ├── linux
│   │   └── x86
│   └── win32
│       └── x86
├── qnx660-cmd.bat
├── qnx660-env.sh
├── README.md
└── target
    └── qnx6
        ├── accounts
        ├── appinstall
        ├── armle-v7
        ├── doc
        ├── etc
        ├── opt
        ├── usr
        ├── var
        └── x86

16 directories, 3 files


/host

/host/linux/x86 和**/host/win32/x86**分別表示選擇在不同操作系統下的交叉編譯

bspserver@ubuntu:~/workspace/SDP_QNX660/host/linux/x86$ tree -L 2
.
├── etc
│   └── qcc
└── usr
    ├── bin
    ├── include
    ├── lib
    ├── python27
    ├── qde
    └── share


/qcc 選擇對應ARM處理器和x86處理器的編譯語言規則Choose your language

bspserver@ubuntu:~/workspace/SDP_QNX660/host/linux/x86/etc/qcc$ tree -L 3
.
├── default
└── gcc
    ├── 4.7.3
    │   ├── default
    │   ├── gcc_ntoarmv7le++.conf
    │   ├── gcc_ntoarmv7le.conf
    │   ├── gcc_ntoarmv7le_cpp++.conf
    │   ├── gcc_ntoarmv7le_cpp.conf
    │   ├── gcc_ntoarmv7le_cpp-ne++.conf
    │   ├── gcc_ntoarmv7le_cpp-ne.conf
    │   ├── gcc_ntoarmv7le_gpp++.conf
    │   ├── gcc_ntoarmv7le_gpp.conf
    │   ├── gcc_ntox86.conf
    │   ├── gcc_ntox86++.conf
    │   ├── gcc_ntox86_cpp++.conf
    │   ├── gcc_ntox86_cpp.conf
    │   ├── gcc_ntox86_cpp-ne++.conf
    │   ├── gcc_ntox86_cpp-ne.conf
    │   ├── gcc_ntox86_gpp++.conf
    │   └── gcc_ntox86_gpp.conf
    └── default

2 directories, 19 files


**qnx660-env.sh**表示支持Choose Command line,意思表示支持命令行編譯。查看內容如下:

bspserver@ubuntu:~/workspace/SDP_QNX660$ cat qnx660-env.sh 
# This script is sets environment variables requires to use this version of QNX Software Development Platform 6.6
# from the command line. To use the script, you have to "source" it into your shell,
# source qnx660-env.sh
# if source command is not available use "." (dot) command instead
#
QNX660="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
QNX_TARGET=$QNX660/target/qnx6
QNX_HOST=$QNX660/host/linux/x86
QNX_CONFIGURATION=/etc/qnx
MAKEFLAGS=-I$QNX660/target/qnx6/usr/include
PATH=$QNX660/host/linux/x86/usr/bin:/etc/qnx/bin:$QNX660/jre/bin:$PATH
cp $QNX660/target/qnx6/usr/include/mk/qconf-linux.mk $QNX660/target/qnx6/usr/include/qconfig.mk

其實qnx660-env.sh做了一下腳本環境變量的配置,便於執行命令行編譯的時候能直接編譯。

/qde表示Choose 3rd part tools支持的IDE Workbench是eclipse

bspserver@ubuntu:~/workspace/SDP_QNX660/host/linux/x86/usr/qde$ tree -L 2
.
└── eclipse
    ├── artifacts.xml
    ├── configuration
    ├── dropins
    ├── epl-v10.html
    ├── features
    ├── icon.xpm
    ├── libcairo-swt.so
    ├── notice.html
    ├── p2
    ├── plugins
    ├── qde
    └── qde.ini


/user 你可以理解支持命令行編譯,該目錄爲交叉編譯工具鏈的目錄,目錄架構類似於Linux GCC的目錄架構。

你可以對比一下QNX交叉編譯鏈的目錄和Linux GCC交叉編譯鏈的目錄。

QNX交叉編譯鏈的目錄:

bspserver@ubuntu:~/workspace/SDP_QNX660/host/linux/x86/usr/bin$ tree -L 1
......
├── arm-unknown-nto-qnx6.6.0eabi-addr2line -> arm-unknown-nto-qnx6.6.0eabi-addr2line-2.24
├── arm-unknown-nto-qnx6.6.0eabi-ar -> arm-unknown-nto-qnx6.6.0eabi-ar-2.24
├── arm-unknown-nto-qnx6.6.0eabi-as -> arm-unknown-nto-qnx6.6.0eabi-as-2.24
├── arm-unknown-nto-qnx6.6.0eabi-c++ -> arm-unknown-nto-qnx6.6.0eabi-c++-4.7.3
├── arm-unknown-nto-qnx6.6.0eabi-c++filt -> arm-unknown-nto-qnx6.6.0eabi-c++filt-2.24
├── arm-unknown-nto-qnx6.6.0eabi-cpp -> arm-unknown-nto-qnx6.6.0eabi-cpp-4.7.3
├── arm-unknown-nto-qnx6.6.0eabi-elfedit -> arm-unknown-nto-qnx6.6.0eabi-elfedit-2.24
├── arm-unknown-nto-qnx6.6.0eabi-g++ -> arm-unknown-nto-qnx6.6.0eabi-g++-4.7.3
├── arm-unknown-nto-qnx6.6.0eabi-gcc -> arm-unknown-nto-qnx6.6.0eabi-gcc-4.7.3
├── arm-unknown-nto-qnx6.6.0eabi-gcc-ar -> arm-unknown-nto-qnx6.6.0eabi-gcc-ar-4.7.3
├── arm-unknown-nto-qnx6.6.0eabi-gcc-nm -> arm-unknown-nto-qnx6.6.0eabi-gcc-nm-4.7.3
├── arm-unknown-nto-qnx6.6.0eabi-gcc-ranlib -> arm-unknown-nto-qnx6.6.0eabi-gcc-ranlib-4.7.3
├── arm-unknown-nto-qnx6.6.0eabi-gcov -> arm-unknown-nto-qnx6.6.0eabi-gcov-4.7.3
├── arm-unknown-nto-qnx6.6.0eabi-gprof -> arm-unknown-nto-qnx6.6.0eabi-gprof-2.24
├── arm-unknown-nto-qnx6.6.0eabi-ld -> arm-unknown-nto-qnx6.6.0eabi-ld-2.24
├── arm-unknown-nto-qnx6.6.0eabi-ld.bfd -> arm-unknown-nto-qnx6.6.0eabi-ld.bfd-2.24
├── arm-unknown-nto-qnx6.6.0eabi-nm -> arm-unknown-nto-qnx6.6.0eabi-nm-2.24
├── arm-unknown-nto-qnx6.6.0eabi-objcopy -> arm-unknown-nto-qnx6.6.0eabi-objcopy-2.24
├── arm-unknown-nto-qnx6.6.0eabi-objdump -> arm-unknown-nto-qnx6.6.0eabi-objdump-2.24
├── arm-unknown-nto-qnx6.6.0eabi-ranlib -> arm-unknown-nto-qnx6.6.0eabi-ranlib-2.24
├── arm-unknown-nto-qnx6.6.0eabi-readelf -> arm-unknown-nto-qnx6.6.0eabi-readelf-2.24
├── arm-unknown-nto-qnx6.6.0eabi-size -> arm-unknown-nto-qnx6.6.0eabi-size-2.24
├── arm-unknown-nto-qnx6.6.0eabi-strings -> arm-unknown-nto-qnx6.6.0eabi-strings-2.24
├── arm-unknown-nto-qnx6.6.0eabi-strip -> arm-unknown-nto-qnx6.6.0eabi-strip-2.24
......

Linux GCC交叉編譯鏈的目錄

$ tree -L 1
.......
├── arm-none-eabi-addr2line.exe
├── arm-none-eabi-ar.exe
├── arm-none-eabi-as.exe
├── arm-none-eabi-c++.exe
├── arm-none-eabi-c++filt.exe
├── arm-none-eabi-cpp.exe
├── arm-none-eabi-dwp.exe
├── arm-none-eabi-elfedit.exe
├── arm-none-eabi-g++.exe
├── arm-none-eabi-gcc-10.1.0.exe
├── arm-none-eabi-gcc-ar.exe
├── arm-none-eabi-gcc-nm.exe
├── arm-none-eabi-gcc-ranlib.exe
├── arm-none-eabi-gcc.exe
├── arm-none-eabi-gcov-dump.exe
├── arm-none-eabi-gcov-tool.exe
├── arm-none-eabi-gcov.exe
├── arm-none-eabi-gnat.exe
├── arm-none-eabi-gnatbind.exe
├── arm-none-eabi-gnatchop.exe
├── arm-none-eabi-gnatclean.exe
├── arm-none-eabi-gnatfind.exe
├── arm-none-eabi-gnatkr.exe
├── arm-none-eabi-gnatlink.exe
├── arm-none-eabi-gnatls.exe
├── arm-none-eabi-gnatmake.exe
├── arm-none-eabi-gnatname.exe
├── arm-none-eabi-gnatprep.exe
├── arm-none-eabi-gnatxref.exe
├── arm-none-eabi-gprof.exe
├── arm-none-eabi-ld.bfd.exe
├── arm-none-eabi-ld.exe
├── arm-none-eabi-ld.gold.exe
├── arm-none-eabi-lto-dump.exe
├── arm-none-eabi-nm.exe
├── arm-none-eabi-objcopy.exe
├── arm-none-eabi-objdump.exe
├── arm-none-eabi-ranlib.exe
├── arm-none-eabi-readelf.exe
├── arm-none-eabi-size.exe
├── arm-none-eabi-strings.exe
├── arm-none-eabi-strip.exe
.......

/target/qnx6

/target/qnx6/armle-v7和**/target/qnx6/x86**表示Choose Your target是ARM和x86。

bspserver@ubuntu:~/workspace/SDP_QNX660/target$ tree -L 2
.
└── qnx6
    ├── armle-v7
    └── x86

/target/qnx6 你可以把它理解爲類似於Linux下利用buildroot構建的根文件系統(rootfs)。這個buildroot的操作QNX廠家已經按購買好的組件包生成好提供給我們。

bspserver@ubuntu:~/workspace/SDP_QNX660/target$ tree -L 2
.
└── qnx6
    ├── accounts
    ├── appinstall
    ├── armle-v7
    ├── doc
    ├── etc
    ├── opt
    ├── usr
    ├── var
    └── x86

10 directories, 0 files
bspserver@ubuntu:~/workspace/SDP_QNX660/target/qnx6/armle-v7$ tree -L 1
.
├── bin
├── boot
├── freescale
├── lib
├── libexec
├── qt5
├── qt5-5.2
├── qtcar
├── sbin
├── ti
└── usr


解壓後BSP zip壓縮包後,進入該壓縮包的根目錄,可以使用make命令來進行編譯:

  • make all 進行所有的操作,包括install、links,還有編譯鏈接目標image;
  • make prebuilt 將/prebuilt目錄下的文件內容,拷貝到/install目錄下;
  • make install 執行該命令後,首先觸發make prebuilt操作,然後進入/src目錄,再執行兩步:1)make hinstall,將/src目錄中的公共頭文件拷貝到/install目錄下;2)make install去把/src目錄中的文件進行編譯,並將編譯後的結果放置到/install目錄中,此外也會拷貝src/hardware/startup/boards/下的構建文件,並重命名爲board.build,board指的是開發板;
  • make links 從install/cpu/boot/build/board.build到images/board.build創建符號鏈接,其中cpu指的是處理器類型,board指開發板;
  • make images 進入images目錄中,並執行該路徑中的Makefile文件,根據make links目標期間的構建文件生成一個IFS(Image File System)文件;
  • 直接執行make的話,相當於make all。

也可以單獨通過命令行編譯自己寫的一箇中間件程序效果如下:

bspserver@ubuntu:~/workspace/Upgrade_HAL$ ./build.sh 
-- The C compiler identification is QCC 4.7.3
-- The CXX compiler identification is QCC 4.7.3
-- Check for working C compiler: /home/bspserver/workspace/SDP_QNX660/host/linux/x86/usr/bin/cc
-- Check for working C compiler: /home/bspserver/workspace/SDP_QNX660/host/linux/x86/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /home/bspserver/workspace/SDP_QNX660/host/linux/x86/usr/bin/CC
-- Check for working CXX compiler: /home/bspserver/workspace/SDP_QNX660/host/linux/x86/usr/bin/CC -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/bspserver/workspace/Upgrade_HAL/trunk/build
Scanning dependencies of target upgrade_hal_test
[ 16%] Building C object CMakeFiles/upgrade_hal_test.dir/example/main.c.o
[ 33%] Linking C executable upgrade_hal_test
[ 33%] Built target upgrade_hal_test
Scanning dependencies of target upgradehal
[ 50%] Building C object CMakeFiles/upgradehal.dir/modules/upgrade_hal.c.o
[ 66%] Building C object CMakeFiles/upgradehal.dir/modules/upgrade_ctrl/upgrade_ctrl.c.o
[ 83%] Building C object CMakeFiles/upgradehal.dir/modules/upgrade_ctrl/upgrade_ipc.c.o
[100%] Linking C shared library libupgradehal.so
[100%] Built target upgradehal
cp /home/bspserver/workspace/Upgrade_HAL/trunk/build/libupgradehal.so /home/bspserver/workspace/Upgrade_HAL/output/target/qnx6/armle-v7/usr/lib/hw
cp /home/bspserver/workspace/Upgrade_HAL/trunk/include/upgrade_hal.h /home/bspserver/workspace/Upgrade_HAL/output/target/qnx6/usr/include/hardware
cp /home/bspserver/workspace/Upgrade_HAL/trunk/example/main.c /home/bspserver/workspace/Upgrade_HAL/output/example

參考文獻:

Five Seven Steps to Developing a QNX Neutrino Program

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章