打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Utility之APP自启动

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
How to Automate Startup/Shutdown of Oracle Database on Linux [ID 222813.1]
[精华] ORACLE的几种启动方式
【vxworks笔记】vxworks调试常用命令
使用 Dojo 的 Ajax 应用开发进阶教程,第 8 部分: Dijit 开发最佳实践
Servlet对象生命周期以及运行过程
Centos开机启动tomcat
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服