[i.MX6Q][QNX Neutrino 6.6.0]调试笔记------Buildfile

利用QNX的模块性和和可裁剪性,其嵌入过程一般是:

构建Buildfile -> 编译buildfile生成系统映象文件 -> 启动目标系统 ->嵌入式系统软件设计。


其中的关键是构建Buildfile。通常一个嵌入式系统需要一个可启动的操作系统映象文件(OS Image)。对于基于QNX的嵌入式一个应用系统,就是根据所选择的CPU类型以及应用程序所需要的操作系统模块来定制嵌入式系统。构建Buildfile的过程就是配置操作系统映象的过程。简单来说Buildfile是一个产生映象文件所需遵守的一组规则、准则。Buildfile由三部分组成,其结构如下:

l        bootstrap script(启动引导脚本)

l        startup script(启动脚本)

l        file list(文件列表)


1.引导脚本

不同的CPU其启动的方式不同,相应的启动引导程序也就不同。启动引导脚本bootstrap script的作用就是配置和CPU相适应的微内核。一个典型的引导脚本如下:


      
      
      
      
  1. [image=0x10800000]
  2. [virtual=armle-v7,raw +compress] .bootstrap = {
  3. startup-imx6x-smart-device -v -W
  4. PATH=/proc/boot procnto-smp-instr -ae
  5. }



在这个例子中:

image=0x10800000——–>Imaged的加载地址;

virtual=armle-v7      ——–>CPU类型

raw                          ——–>产生Image的格式,我这里最后生成的就是 ifs-mx6q-sabresmart.raw

+compress            ——–>Image是否压缩

.bootstrap               ——–>固定名称,说明是一个启动脚本

startup-imx6x-smart-device——–>启动startup程序

PATH=/proc/boot     ——–>确定了PATH环境变量

procnto-smp-instr   ——–>微内核和进程管理器,包括QNX 6 微内核,进程管理,内存管理以及路径名管理,每个利用mkifs工具的可启动映象都必须具有procnto。

需要注意的是在bootstrap中,第一个可执行程序必须是startup-*,而最后一个必须是procnto!


2.启动脚本

启动脚本是系统启动后第一个执行的脚本,名称是.script,在启动脚本中我们也可以定义自己的脚本。一个典型的启动脚本如下:


    
    
    
    
  1. +script] .script = {
  2. # Initialise the console
  3. procmgr_symlink ../../proc/bootbc.so.3 /usrb/ldqnx.so.2
  4. TZ=EDT5EST
  5. display_msg Welcome to QNX Neutrino 6.6.0 on the i.mx6 Smart-Device (ARM Cortex-A9 MPCore)
  6. # Start some common servers
  7. pipe &
  8. slogger &
  9. #######################################################################
  10. ## WatchDog utility
  11. ## If startup is given ‘-W’ parameter then the ‘wdtkick’ utility MUST
  12. ## be uncommented below.
  13. #######################################################################
  14. display_msg Starting watchdog…
  15. wdtkick
  16. #UART1 (/devr1)
  17. devc-sermx1 -e -F -S -c80000000 0x02020000,58
  18. waitfor /devr1 4
  19. reopen /devr1
  20. display_msg ” “
  21. # Start the main shell
  22. [+session] ksh /proc/boot/.console.sh &
  23. }
在上面脚本中启动一些服务和驱动,在这里可以加载我们自己的应用程序,最后还启动了一个控制脚本,这控制脚本就是启动更多的服务和进程,例如屏幕,网卡,媒体播放等等

3.文件列表
这里就是将所需要的文件打包到Image中,包括共享库,执行文件,图片等,共享库好说,默认的就指定在安装目录中搜索,所以直接在Buildfile中写上所需要的库名称即可,例如所以驱动程序都需要的标准C库 (libc.so):

    
    
    
    
  1. # include the C shared library
  2. libc.so #直接写一个名字可以了
  3. # create a symlink called ldqnx.so.2 to it
  4. [type=link] /usr/lib/ldqnx.so.2=/proc/boot/libc.so #建立一个链接

有时候我们需要打包自己的库文件或可执行程序,这样就需要指明文件的具体路径,例如自己写的lvds库文件:

[search=../install/armle-v7/usrb/graphics/iMX6X] /usrb/graphics/iMX6X/bwfdcfg-imx6x-lvds.so=libwfdcfg-imx6x-lvds.so
    
    
    
    
[search=]指明文件的具体路径

如果拷贝一个文件夹,例如QT的环境lib/qml/plugins,试了几次,需要把文件夹拷贝到SDK的安装目录下才能打包,例如拷贝QT的lib文件夹:

    
    
    
    
  1. [search=${QNX_TARGET}/usr] #指明具体路径
  2. /usr/share/qt530/lib=lib

在PC端通过以下两种方法可以确定一个可执行文件(以ping命令为例)所需要的依赖库:
ldd utility

    
    
    
    
  1. # ldd `which ping`
  2. /usr/bin/ping:
  3. libsocket.so.3 => /lib/libsocket.so.3 (0xb8200000)
  4. libc.so.3 => /usr/lib/ldqnx.so.2 (0xb0300000)

objdump utility

    
    
    
    
  1. # objdump -x `which ping` | grep NEEDED
  2. NEEDED libsocket.so.3
  3. NEEDED libc.so.3

贴一个简单的Buildfile,就启动一个LCD驱动,然后运行一个OpenGL的测试程序


    
    
    
    
  1. [image=0x10800000]
  2. [virtual=armle-v7,raw +compress] .bootstrap = {
  3. startup-imx6x-smart-device -v -W
  4. PATH=/proc/boot procnto-smp-instr -ae
  5. }
  6. [+script] .script = {
  7. # Initialise the console
  8. procmgr_symlink ../../proc/boot/libc.so.3 /usr/lib/ldqnx.so.2
  9. TZ=EDT5EST
  10. display_msg Welcome to QNX Neutrino 6.6.0 on the i.mx6 Smart-Device (ARM Cortex-A9 MPCore)
  11. # Start some common servers
  12. pipe &
  13. slogger &
  14. display_msg Starting watchdog…
  15. wdtkick
  16. #UART1 (/dev/ser1)
  17. devc-sermx1 -e -F -S -c80000000 0x02020000,58
  18. waitfor /dev/ser1 4
  19. reopen /dev/ser1
  20. #######################################################################
  21. ## SD memory card driver
  22. #######################################################################
  23. display_msg Starting SD3 memory card driver…
  24. devb-sdmmc-mx6_generic cam pnp,verbose blk rw,cache=2M sdio addr=0x02198000,irq=56,bs=cd_base=0x0209c000:cd_pin=6:cd_irq=98 disk name=sd3
  25. waitfor /dev/sd30 3
  26. # Start the main shell
  27. [+session] ksh /proc/boot/.console.sh &
  28. }
  29. # Redirect console messages
  30. [type=link] /bin/sh=/proc/boot/ksh
  31. [type=link] /dev/console=/dev/ser1
  32. # Shared libraries
  33. libc.so
  34. libm.so.2
  35. libcpp.so.4
  36. libcam.so
  37. io-blk.so
  38. libpps.so.1
  39. libcsm.so.1
  40. libtracelog.so.1
  41. libdisputil.so.2
  42. ###########################################################################
  43. ## Graphics support - screen
  44. ###########################################################################
  45. libWFD.so.1
  46. libinputevents.so.1
  47. libkalman.so.1
  48. libGAL-gc320v0.so.1
  49. screen-gc320v0.so
  50. /usr/lib/graphics/iMX6X/libWFDimx6x.so=graphics/iMX6X/libWFDimx6x.so
  51. /usr/lib/graphics/iMX6X/libGalcore-3dvg.so=graphics/iMX6X/libGalcore-3dvg.so
  52. /usr/lib/graphics/iMX6X/libimx6xCSCgamma-generic.so=graphics/iMX6X/libimx6xCSCgamma-generic.so
  53. [search=../install/armle-v7/usr/lib/graphics/iMX6X] /usr/lib/graphics/iMX6X/libwfdcfg-imx6x-lvds.so=libwfdcfg-imx6x-lvds.so
  54. [search=../install/armle-v7/usr/lib/graphics/iMX6X] /usr/lib/graphics/iMX6X/graphics.conf=graphics.conf
  55. ###########################################################################
  56. ## Graphics support - apps
  57. ###########################################################################
  58. libEGL.so.1
  59. libscreen.so.1
  60. /usr/lib/graphics/iMX6X/libGLESv1_CM.so.1=libGLESv1_CM.so.1
  61. /usr/lib/graphics/iMX6X/libGLESv2.so.1=libGLESv2.so.1
  62. /usr/lib/graphics/iMX6X/libEGL_viv.so=graphics/iMX6X/libEGL_viv.so
  63. /usr/lib/graphics/iMX6X/libGLES_CM_viv.so=graphics/iMX6X/libGLES_CM_viv.so
  64. /usr/lib/graphics/iMX6X/libGLESv2_viv.so=graphics/iMX6X/libGLESv2_viv.so
  65. /usr/lib/graphics/iMX6X/libGLSLC.so=graphics/iMX6X/libGLSLC.so
  66. # Executables
  67. [data=c]
  68. devc-sermx1
  69. ###########################################################################
  70. ## Screen executables
  71. ###########################################################################
  72. /sbin/screen=screen #LCD的启动程序
  73. /usr/bin/gles2-gears=gles2-gears #OpenGL测试程序
  74. ###########################################################################
  75. ## uncomment for WatchDog utility
  76. ###########################################################################
  77. wdtkick
  78. ###########################################################################
  79. ## Set environment and start the main shell
  80. ###########################################################################
  81. [perms=0744] .console.sh={
  82. echo setting env variables.
  83. export SYSNAME=nto
  84. export TERM=qansi
  85. export HOME=/
  86. export PATH=:/bin:/usr/bin:/sbin:/usr/sbin:/proc/boot
  87. export LD_LIBRARY_PATH=:/lib:/usr/lib:/usr/lib/graphics/iMX6X:/lib/dll:/proc/boot
  88. export GRAPHICS_ROOT=/usr/lib/graphics/iMX6X
  89. #start appsmedia-sample if it exists
  90. appsmediaScript=/proc/boot/.start-appsmedia-sample
  91. if [ -e “$appsmediaScript" ]; then
  92. #appsmedia-sample uses dhclinet instead of dhcp.client
  93. . "$appsmediaScript”
  94. else
  95. dhcp.client &
  96. echo Starting Screen Graphics…
  97. screen
  98. echo done.
  99. gles2-gears& #最后运行OpenGL的测试程序,可以看到屏幕上有三个齿轮在旋转
  100. fi
  101. }
  102. ###########################################################################
  103. ## general commands
  104. ###########################################################################
  105. cp
  106. ls
  107. cat
  108. pipe
  109. pidin
  110. slogger
  111. sloginfo
  112. slay
  113. ln
  114. rm
  115. mv
  116. sleep



        

你可能感兴趣的:([i.MX6Q][QNX Neutrino 6.6.0]调试笔记------Buildfile)