i.MX6q+QNX(学习笔记二)

QNX是加拿大黑莓公司的一款商业版的微内核实时操作系统。因此首先要清楚知道QNX的任务调度机制,一种优先级抢占的任务调度机制,在同优先级的情况下又有三种调度机制可供灵活选择:1.FIFO 2.时间片轮询调度 3.适应式调度。除此之外,还需要了解QNX的一个特色:动态时间分区(Adaptive Partitioning).

知道微内核的概念就好理解QNX了:除了Microkernel做内核存在外,其他任何功能模块(包括进程管理)都作为程序存在。

因此QNX启动时,先加载IPL(Initial Program Loader),完成必要的硬件初始化(CPU存储控制器、存储芯片、),然后复制拷贝系统镜像,引导系统启动。

然后QNX进入 startup程序,完成所有硬件初始化配置,如定时器 、时钟频率、中断控制器、缓存控制器等,但不包括配置串口波特率之类的东西。它也不会初始化标准周边设备,例如以太网控制器或EIDE硬件disk控制器——这些都留给驱动稍后启动以后来完成。

startup程序完成系统初始化后,把系统信息存放在系统页,就把控制权交给内核,内核进而启动procnto程序,一个进程管理程序。

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

l        bootstrap script(启动引导脚本)

l        startup script(启动脚本)

l        file list(文件列表)


1.引导脚本

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

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



在这个例子中:

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

3.文件列表
这里就是将所需要的文件打包到Image中,包括共享库,执行文件,图片等,共享库好说,默认的就指定在安装目录中搜索,所以直接在Buildfile中写上所需要的库名称即可,例如所以驱动程序都需要的标准C库 (libc.so):
[html]  view plain  copy
  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库文件:
[html]  view plain  copy
  1. [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文件夹:
[html]  view plain  copy
  1. [search=${QNX_TARGET}/usr]       #指明具体路径  
  2. /usr/share/qt530/lib=lib           

在PC端通过以下两种方法可以确定一个可执行文件(以ping命令为例)所需要的依赖库:
ldd utility
[html]  view plain  copy
  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
[html]  view plain  copy
  1. # objdump -x `which ping` | grep NEEDED  
  2. NEEDED libsocket.so.3  
  3. NEEDED libc.so.3  

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

你可能感兴趣的:(i.MX6q+QNX(学习笔记二))