研究vxworks下RTP使用多年,现把部分经验分享出来,有问题可以联系我,电话:15522731326,韩 VxWorks操作系统RTP介绍和使用方法 从VxWorks 6.x开始引入 RTP(VxWorks real time process project)模式编程,这种模式的优点是应用程序相互独立,互不影响,而且增加了内核的稳定性,缺点是由于“内核态”与“用户态”的内存拷贝,其执行效率有所降低,随着CPU速度越来越快,这点效率的牺牲已经越来越不重要。相比较于传统的DKM(downloadable kernel module project),RTP适合多个团队独立运作,然后汇总联试,这种模式除了全局函数不能再shell里直接调用外,其对应用程序几乎不做任何约束,原有的DKM工程代码稍作修改即可正常运行。内核变化较大,需要添加较多的组件,内存需要较好的划分,为保持应用程序直接调用函数调试的习惯,需要封装接口供用户使用。 现简单的介绍RTP使用方法,并给出demo代码供参考。 1)新建并编译工程: File->new->VxWorks real time process project,如图1 图1 一路next后,选择如图2所示的编译器 选择Finish后,工程新建完毕。 导入源文件: 这里的源文件名称是fooRtpApp.c,一种较快捷的方式是选中新建的工程,按下F5,源文件会出现在工程中. 右键选择编译,出现如图4,选择Continue继续。 图4 编译完成后,会生成vxe格式的可执行文件,此处为usrAppA.vxe。 2)下载可执行性文件 待板子启动后,使用ftp将vxe文件下载到板子中。步骤如下: 运行->cmd,打开对话窗口,如图所示 依次执行如下命令: a) ftp192.168.0.2 (该ip可在vxWorks启动后,输入命令ifconfig查看) b) bi c) cd /tffs0 d) put filename(完整的文件路径) e) by 执行完上述命令后,即可把可执行程序下载到目标板上,如下图 在串口终端中,输入ifconfig命令查看ip地址;依次输入如下命令查看刚下载到目标板的文件: a) cd “/tffs0” b) ls 上述操作结果如下图所示: 3)运行可执行文件 下载完成后,可以断电重启或者在调试串口中输入命令ctrl+x软重启电路板,待系统启动后应用程序自动运行。 4)调试方法 1)原有的DKM工程,.out文件被加载后其全局函数可以在shell里直接调用,对调试方便的很,但是RTP的实现机制决定了其中的函数不能被调用,所以需要找到一种方法来实现,以达到安全、团队合作,而又方便调试。 函数原型: n “file_name”,”fun_name”,arg1, arg2,arg3, arg4, arg5, arg6 假如usrAppA.vxe里有如下两全局函数: void process_hello(int a,int b,int c); void processB(void); 执行方法如下: n "usrAppA.vxe","process_hello",1,2,3 n "usrAppA.vxe","processB" 这种方式在UP(单核)、多核(SMP)模式下都是安全可用的。 2)如果应用程序存在BUG而导致RTP程序被杀掉,如何能快速定位是哪出了问题?请注意,RTP模式优势来了,此时vxWorks还是活着的,可以输入命令edrShow查看所有的异常,能快速定位是哪一个任务出了问题。 3)内核启动后,输入命令:aff_lrtp,即可手动执行应用程序。这种方式可以把RTP及其任务亲和到某一个核上,当然只是多核跑在SMP时有效,单核模式无所谓,因为只有一个核。 4)查看任务 输入命令ri “filename”可查看该应用程序中任务状态,比如: ri “usrAppA.vxe” 这种方式只查看针对本RTP的任务状态。 5)杀掉RTP进程 delk “filename” ***************************Demo*************************************** 5)Demo 代码如下: #include #include /*#include */ /*user function*/ void process_hello(int a,int b,int c) { int t1=a,t2=b,t3=c; while(1) { printf ("helloworld,^^^^0x%x,0x%x,0x%xn",t1,t2,t3); taskDelay(30); } } void processB(void) { printf ("hello worldn"); } int main ( int argc, /* number of arguments */ char * argv[], /* array of arguments */ char * envp[], /* array of environment strings */ void * auxp /* implementation-specific auxiliary vector */ ) { taskSpawn("hello",150,0,0x60000,process_hello,0,1,2,3,4,5,6,7,8,9); taskSuspend (0); /* stop again tokeep RTP alive */ return 0; } ************************end******************************* Q.Q 383362673
|