我们知道,要想在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年! |
|