我们知道,要想在VxWorks里启动应用程序(APP/Application/Task+RTP),常见的方法是使用taskSpawn()/rtpSpawn()来创建并激活相应的Task/RTP。那我们的第一条taskSpawn()/rtpSpawn()应该放在哪呢?也就是如何让VxWorks系统自动启动APP呢?
只要找到VxWorks系统启动时执行的最后一个函数,让这个函数来调用我们自己的APP就可以了。
打开工程目录里的prjConfig.c文件,可以看到VxWorks的第一个Task tRootTask的入口函数usrRoot()。而usrRoot()调用的最后一个函数是usrAppInit()
然后在工程里可以找到文件usrAppInit.c
从注释里可以看出来了,我们的APP可以从这里开始。
写个小程序试试,例如printf()
启动VxWorks,看看效果
可以看到APP的printf()执行了,不过它是运行在tRootTask的上下文里的。这样不好,一来它的优先级太高;二来出了问题后,影响太大。所以我们的APP应该由usrAppInit()中的taskSpawn()来启动,例如
这样就可以了
usrRoot()之所以会调用usrAppInit(),是因为包含了组件INCLUDE_USER_APPL
可以看到还有几个组件与startup相关,有兴趣的话,我们试试其它组件
INCLUDE_RTP_APPL_USER
可以看到,包含了这个组件后,工程里多出来一个与usrAppInit()类似的usrRtpAppInit()。从注释来看,它是用来启动RTP的。不过它俩默认都是空函数,没什么本质区别的。也就是说,在usrRtpAppInit()里来启动Kernel Task也是没问题的。
INCLUDE_STARTUP_SCRIPT
这个组件在另一个目录里,包含之后,usrRoot()会在调用usrShell()之前解析并执行bootrom的startup script参数
我们写一个script文件来试试这个功能:
新建一个文件,为了方便编辑,可以把文件后缀写作txt,在文件中添加几行可以在VxWorks的Kernel Shell里执行的语句。我们之前定义了一个函数test(),这次也调用它
把这个文件存放到VxWorks文件的目录里
修改bootrom的startup script参数
启动VxWorks
可以看到,在Kernel Shell的提示符“->”出现之前,VxWorks解析并执行了test.txt中的语句。而且这些语句是在Kernel Shell的上下文里执行的。因此,最好也使用taskSpawn()来创建自己的Task环境。
INCLUDE_RTP_APPL_INIT_BOOTLINE
包含这个组件后,usrRoot()会在usrAppInit()之后再调用一个函数usrRtpAppInitBootline()。
这个函数的作用也是解析startup script,不过它解析的不是script里的文件,而是直接用使用startup script指定的RTP文件。格式是: #RTP文件1^参数1^参数2…#RTP文件2…
即符号#之后是RTP的文件名,符号^之后是RTP的入参。有几个RTP就用几个#,有几个参数就用几个^
我们来试一下,首先创建一个RTP工程,简单写几句代码
新建一个ROMFS工程,用于存放RTP工程编译后的rtp_test.vxe,然后把ROMFS工程放到VxWorks的Image工程里
修改bootrom的startup script参数,可以保留之前的script文件,不过要放到第一个#之前。并给RTP传递两个参数:x和y
这次script文件test.txt的内容如下
启动VxWorks,看看得到了什么
VxWorks在打印Kernel Shell提示符“->”之前执行了test.txt里的语句;在打印“->”之后,又启动了startup script里指定的RTP。
这就是INCLUDE_RTP_APPL_INIT_BOOTLINE的作用:执行bootrom参数startup script中符号#之后的RTP
INCLUDE_RTP_APPL_INIT_CMD_SHELL_SCRIPT
这个组件也是在VxWorks启动Kernel Shell之后来启动RTP的。不过它的输入是由参数RTP_APPL_CMD_SCRIPT_FILE来指定的文件,而且它解析文件时,用的是VxWorks6特有的Command Interpreter。
例如我们在VxWorks镜像文件的目录里新建一个rtp.txt文件,并把这个文件名赋值给参数RTP_APPL_CMD_SCRIPT_FILE
文件里放一条Command Interpreter能识别的语句
为了看的更清晰,我们先把bootrom的参数startup script清空
然后启动VxWorks
可以看到,组件INCLUDE_RTP_APPL_INIT_CMD_SHELL_SCRIPT的作用就是使用Command Interpreter来解析RTP_APPL_CMD_SCRIPT_FILE指定的文件
INCLUDE_RTP_APPL_INIT_STRING
这个组件的作用类似于前文中的INCLUDE_RTP_APPL_INIT_BOOTLINE,解析的格式也是一样的。不过它的输入不是bootrom的startup script参数,而是自己的参数RTP_APPL_INIT_STRING。
我们修改一下这个参数试试,同样为了看的清晰,我们把上个例子中的RTP_APPL_CMD_SCRIPT_FILE置为空,并把RTP的参数改为a和b
启动VxWorks
总结一下
1、3用于启动Task,2、4-6用于启动RTP。
1、2在代码中;3、4在引导参数中;5、6在组件参数中。
1、2使用C语法;3使用Shell命令,类似于C语法;4、6使用符号#和^;5使用专用于RTP的Command命令。
这正是:
应用程序自启动,多个位置灵活可用。
编码或组件参数,引导阶段也可指定。
我是泰山,专注VX14年!
联系客服