由于实习需要,最近在学习VxWorks,久闻该操作系统大名,一直被其深厚的内力震撼着从未敢去了解,直到最近。
操作系统Vxworks本身的优点特点等详细信息不多说了,这里讲讲几天来我学习的感受和一些入门经验。(我也是初学者,刚刚接触了一周)
不说操作系统内容,这里只说说开发环境:tornado、VmWare等
大家都知道,windriver的Vxworks不是开源的,不是免费的,所以源代码看不到,至少我还没找到。
tornado就是VxWorks的IDE,在该软件下可以进行系统级的仿真。
tornado在网上有很多下载链接,但是注意版本对应的目标机,有tornado for arm,tornado for pentium,等等,我们在PC机上开发的话应该选择tornado for pentium。版本一般都是tornado 2.2的。软件安装方法在网上也有大量的资料,其中要输入什么序列号还是什么ID号的时候也是在网上搜到的,不难。
tornado里集成了很多实用的插件工具,方便开发。
其中目前接触的最多的就两个:target server和Vxsim
target server是做什么用的呢?可以说,他就相当于下载器,是链接PC主机端和实际目标端的桥梁。在target server里可以设置目标机的IP地址和一些其他文件、操作选项,就可以将我们在tornado中编译好的可执行文件下载到目标机中了。
Vxsim是tornado自带的一个系统仿真软件,方便开发时因缺少目标机等而造成的无法看到程序运行结果的一个插件。
我们有PC机,有虚拟机,其实完全可以虚拟出一个目标机嘛,目标机上跑vxworks,不一样能实现主机-目标机结构吗!聪明!
在vxworks开发网http://www.vxdev.com/index.htm里有一篇如何安装vxworks到虚拟机的文章http://www.vxdev.com/html/44/624.htm,非常不错,还配有链接,将相关下载文件都贴了进去,力荐。解压密码就是www.vxdev.com
当一切都配置好后还是不知道哪跟哪,怎么回事,这时候就要缕一缕了:
tornado------vxsim-------target server------vmware------ftp server,这么多东东,这都哪跟哪啊?有点乱。。。
好吧,我承认我也乱过,但是仔细缕一缕,就知道都什么关系了。
首先,tornado,是集成开发环境,里面包含了我们开发vxworks时要编辑、编译的功能,这个没问题吧,跟vs是一样的。我们在tornado里建立工程,写好代码,编译,成功,就有了.out的可执行文件。到此打住,再看Vxsim。
vxsim是干什么的呢?它相对于我们说的虚拟机上跑vxworks是独立的,vxsim是一个windriver公司为了方便用户验证上面编译出来的可执行文件的是否能正确执行,执行出什么样的效果来而做的仿真软件。编译出来的可执行文件通过在工程上右击点下载,就可以启动并下载到vxsim中,打开windSh,里面敲入要执行的函数名,就可以看到代码的执行效果了。
再来说说这个target server,它可是在开发中最重要的工具了,在第一步里我们编译生成了可执行文件,比如a.out,我们想下载这个程序到目标机上去,怎么办呢?通过网络下载,target server就是干这个网络连接的!在tornado的tools菜单栏里打开target server项,有个配置,在配置里要添加目标机的ip地址的。(目标机的ip地址是什么,就看上面给的连接文章了http://www.vxdev.com/html/44/624.htm)。还有里面重要的一项是target server properties里选择back end 的时候,available back配置成wdbrpc。具体都是什么意思,我也懒得解释,在网上一堆资料,查吧!再就是核心文件符号表,这个很重要,要将target server properties里选择core file and symbols的时候,将编译生成的vxworks核心文件添加进去(该核心文件的生成办法就是将http://www.vxdev.com/html/44/624.htm中提到的vmWare上vxworks的BSP包在工程中编译,就会在相应的工程目录中有一个名为vxworks的文件,它就是核心文件)。之后点击launch就可以启动与目标机的连接了!连接好之后做什么?等会,不急,我说了一条再说一条。后文会说的。配置好了的target server 就是一个目标机了。
再来说说这个vmware,本来我们做vxworks就是想把这个系统跑在嵌入式板子上的,但是如果我们没有板子,或者没有板子对应的BSP,又着急学着开发这个系统,所以就用了这个vmware先跑着再说。这可是个好东西,把我们在嵌入式板子上要做的大部分功能都囊括了。怎么配置这个虚拟机,还是这篇文章:http://www.vxdev.com/html/44/624.htm。
最后说说这个ftp server。这个FTP就是用来下载VxWorks映象的,为了便于观察引导程序是否从FTP上下载了VxWorks映像,要打开FTP Server的日志功能,也就是说我们的虚拟机上跑的vxworks,实际上是PC端提供的一个VxWorks映像文件,该映像文件通过ftp server下载到虚拟机中,虚拟机里跑的只是个启动引导,真正的内核是PC端提供的映像文件。所以,我们不启动tornado只启动ftp server和虚拟机就可以让vxworks系统在虚拟机上运行起来,只是这时的vxworks系统中只运行了系统任务,还没有应用程序任务。
应用程序任务怎么才能在虚拟机上的vxworks中跑起来呢?这就是target server的事了。
好了,捋清了各个部分的关系,我们就可以用一个小例子来看看他们之间是怎么协调工作的了。
首先,我们打开tornado,新建一个工程,编译链要选择pentiumGNU,添加代码,代码功能呢很简单,就是两个任务,一个是根任务A,它的功能就是建立另一个任务B。任务B呢是又根任务A建立的,它的功能就是打印输出一行字:hello,virtual Vxworks!
/*----------------------------------------------------- VxWorks应用程序学习例程 文件名 :02multiTasks.c 说明 :VxWorks应用程序之多任务编程 代码来源 :嵌入式实时操作系统VxWorks及其开发环境Tornado 日期 :2011-08-27 备注 :本例程只是个简单的用例,用以测试在虚拟机上安装了VxWorks, 通过Tornado中的target Server工具进行主机与目标机之间的调试通信 ------------------------------------------------------*/ #include "vxWorks.h" #include "stdio.h" #define TSKPRIO 90 /*任务优先级*/ #define TSKSTACKSIZE 2000 /*任务堆栈大小*/ void pInfo(void); /*=================================================== 【任务】函数名 :void tRoot(void) 功能 :根任务,用于创建子任务 参数 :无 通信量 :无 日期 :2011-08-27 ====================================================*/ void tRoot(void) { int tskId; printf("\n\n\t\t\ttRoot task is RUNNING!\n\n"); tskId=taskSpawn("tskPInfo",TSKPRIO,0x100,TSKSTACKSIZE,pInfo,0,0,0,0,0,0,0,0,0,0); printf("tskPInfo task has been created completed!\n"); } /*=================================================== 【任务】函数名 :void pInfo(void) 功能 :打印一句话,测试任务创建成功 参数 :无 通信量 :无 日期 :2011-08-27 ====================================================*/ void pInfo(void) { printf("Hello,Virtual Pentuim,my tskID is %d\n",taskIdSelf()); }
代码编写好后编译,编译成功了之后呢,就该把程序下载到虚拟机里了,这时候就要我们进行如下操作了:
1、打开ftp server:(开始-->所有程序-->tornado2.2--->ftp server)
2、打开虚拟机,启动vxworks
3、打开tornado 的tools--->target server-->configure target server,配置好后点击launch,在windows的任务栏最右下角看到一个红色的靶盘图标,双击打开就能看到连接状态是否成功。
4、在tornado的launch toolbar中有个下拉箭头的选择格式为“IP@计算机名”的目标机,例如我的目标机为192.168.202.88@PC-200911032001。这样就相当于选择了目标机地址。
5、之后点击->i 图标,即launch shell,打开命令行终端。
6、之后按shift+F6,选择要下载的编译好的可执行文件“工程名.out”,确定,就可以下载到目标机(即虚拟机)中去了。
7、在shell终端中输入我们代码中的根任务函数名tRoot,回车,就可以看到在shell里运行的根任务结果,但是子任务的运行结果呢?别急,子任务运行结果在虚拟机里呢!看看吧!至于为什么会是这样,我也不知道,正在寻找答案。。。
在WindSh里面:
-> tRoot
tRoot task is RUNNING!
tskPInfo task has been created completed!
value = 42 = 0x2a = '*'
->
在虚拟机上的vxworks里面: