首页 VxWorks-6.3-编程调试要点

VxWorks-6.3-编程调试要点

举报
开通vip

VxWorks-6.3-编程调试要点精选文档可编辑日期:2007-03-05日期://日期://杭州ECI通讯文档编号产品版本密级V1.0公开产品名称:VxWorks6.3编程调试要点共页VxWorks6.3编程调试要点(仅供内部使用)文档作者:周礼兵开发/测试经理:项目经理:杭州ECI精选文档可编辑版权所有不得复制精选文档可编辑目录TOC\o"1-5"\h\z录3系统特点4编程调试52.1应用程序的运行52.1.1Shell下运行52.1.2自启动运行62.1.3通过workbench运行62.2内核模块的运行62....

VxWorks-6.3-编程调试要点
精选文档可编辑日期:2007-03-05日期://日期://杭州ECI通讯文档编号产品版本密级V1.0公开产品名称:VxWorks6.3编程调试要点共页VxWorks6.3编程调试要点(仅供内部使用)文档作者:周礼兵开发/测试经理:项目经理:杭州ECI精选文档可编辑版权所有不得复制精选文档可编辑目录TOC\o"1-5"\h\z录3系统特点4编程调试52.1应用程序的运行52.1.1Shell下运行52.1.2自启动运行62.1.3通过workbench运行62.2内核模块的运行62.3ROMFS62.4应用程序的系统调用72.4.1系统调用的一些约束72.4.2静态的增加系统调用函数82.4.3动态的增加系统调用函数92.5共享数据区域102.6动态库112.6.1共享库(SharedLibraries)112.6.2Plug-ins112.7多任务112.7.1任务变量(TaskVariables)112.7.2VxWorkstask112.7.3POSIXThreads112.7.4任务调度112.8信号量122.8.1VxWorkssemaphores122.8.2POSIXSemaphores122.9消息队列122.9.1VxWorksMessageQueues122.9.2POSIXMessageQueues122.10Sockets122.11Pipes122.12VxWorksevents132.13POSIXQueuedSignals132.14内存管理132.15Shell解析器133设计要点14HYPERLINK\l"bookmark8"\o"CurrentDocument"参考文档15VxWorks6.3编程调试要点关键词:内核态、用户态、消息、信号、信号量、管道、任务、线程缩略语说明:RTP(real-timeprocess)、POSIX(PortableOperatingSystemUNIX)、MMU(MemoryManagementUnit)系统特点VxWorks6.3除了兼容以前低版本(如:VxWorks5.5)内核外,增加一些其它的功能。其中最明显的是引入了用户态的应用程序及POSIX的一些特性功能(如线程、线程调度、互斥锁、信号量、消息等),这样就有内核态和用户态之分。内核模块是运行在内核态的,应用程序是运行在用户态的。这里所指的应用程序就是VxWorksRTPs(real-timeprocesses),与Unix、Linux的应用程序有相似性,它在用户态下运行,当被加载到内存运行时,每个RTP都会被分配不同的虚拟的地址空间,包括代码段、数据段、及堆栈等。当启用MMU时,各应用程序之间及与内核之间是不能随意互相访问的(注:如果是simulate内核的调试的话,MMU组件是不支持区分超级用户和普通用户的,应用程序可以访问内核的内存空间,这样子的话,内核的任务有可能被应用程序的任务破坏),如果需要进行数据传递,则可通过消息、管道、信号、共享内存、SOCKET等。应用程序还可通过系统调用来提升操作权限,如操作内核或配置硬件资源等。应用程序间可以动态的调用共享库的函数来执行,但要注意共享库的函数可重入性。引用POSIX的一些特性功能主要为了方面从POSIX中移植程序及增强系统功能。编程调试本文的大部分调试过程是通过windriverworkbench2.5开发环境进行的,该环境与以前的Tornado5.5虽然有一定的差别,但基本原理是相似的。具体应用可以参考文档《wr_workbench_vxworks_users_guide_2.5.pdf》。.1应用程序的运行2.1.1Shell下运行?使用C解析器:如:rtpSp"host:c:/myInstallDir/vxworks-6.1/target/usr/root/PPC32diab/bin/myVxApp.vxefirstsecondthird"对应的可以用kill()或者rtpDelete()来终止运行。提示符:->一般为C解析器可用shConfig"INTERPRETER=Cmd"来切换到command解析器下?使用shellcommand解析器:如:rtpexechost:c:/myInstallDir/vxworks-6.1/target/usr/root/PPC32diab/bin/myVxApp.vxefirstsecondthird对应的可以用rtpdelete、kill、rtpdshell命令来终止运行,如果运行在前台的话,还可用CTRL+C来终止运行。(后台运行可在rtpexec命令后或应用程序名后加&)。如:rtpexec精选文档可编辑精选文档可编辑host:c:/myInstallDir/vxworks-6.1/target/usr/root/PPC32diab/bin/myVxApp.vxefirstsecondthird&提示符:[vxWorks]#一般为C解析器可用setconfigINTERPRETER=C来切换到C解析器下2.1.2自启动运行?通过脚本运行,需在RTPStartupFacility定义如:在NAME为RTP_APPL_CMD_SCRIPT_FILE的Value栏里加入"/romfs/VxScript”(目的是为了执行romfs里的脚本VxScript)VxScript脚本内容示意:rtpSp"/romfs/RtpTest1.vxe"rtpSp"/romfs/RtpTest2.vxe"?通过字符串解析运行,需在RTPStartupFacility定义如:在NAME为RTP_APPL_INIT_STRING的Value栏里加入"#/romfs/RtpTest1.vxe#/romfs/RtpTest2.vxe"(目的是为了执行romfs里的应用程序RtpTest1.vxe及RTPTest2.vxe#号为多个应用程序的分隔符)2.1.3通过workbench运行可以通过workbench连接到目标板上,然后选中已编译好的vxe文件点击右键选择RunRTPonTarget就s可以运行了。2.2内核模块的运行与VxWorks5.5类似。2.3ROMFSVxWorks的一种只读文件系统,一般是用作把应用程序、脚本文件、共享库等打包在ROMFS里并连同内核一起编译成VxWorksImage文件。当内核运行时,通过devs命令看到设备描述符/romfs。可以通过read或fread来读取内容。创建ROMFS可以通过workbench来创建,把ROMFS工程当作是内核Image工程的子工程。也可通过命令行手动配置,如:cdc:\myInstallDir\vxworks-6.1\target\proj\wrSbc8260_diabmkdirromfscopyc:\allMyVxApps\myVxApp.vxeromfsmakeTOOL=diab如果不想在内核工程目录下创建romfs目录,可以在其它地方创建,但在make内核时,必须指明romfs的目录,如:makeTOOL=diabROMFS_DIR="c:\allMyVxApps"2.4应用程序的系统调用VxWorks6.3的内核态和用户态有不同的指令集及MMU设置,应用程序是运行在用户态的。只要MMU打开的时候,它是不能直接调用系统函数或数据结构。为了解决这种情况,系统调用可以为应用程序提供一种优先级比较高的操作,如操作内核或配置硬件资源等。所有可用的系统调用函数(包括自定义的系统调用函数)都可以通过syscall.h来查询。2.4.1系统调用的一些约束可自定义的组号为2到7,每一系统调用组最多可有64个函数函数参数最多只支持8个32位的参数(32位体系结构的CPU),如果是64位的参数则需要按两个32参数来计算,不支持浮点或中断向量类型的参数,如果多于8个参数则需通过结构来定义参数。函数返回值为32位(32位体系结构的CPU),如果是64位的话则需通过get64BitValue来获取。系统调用处理函数的命名必须和系统调用函数命名一致,然后追加Sc,例如系统调用函数名为user0SysCallFunc0,则系统调用处理函数必须命名为user0SysCallFunc0Sc系统调用处理函数的参数只能为一个指向某种结构类型的指针,必须把系统函数的所有参数定义成结构,且结构命名为系统调用处理函数名+Args,如:structuser0SysCallFunc0Sc{inta;intb;char*c;}建议在系统调用处理函数中使用scMemValidate函数来验证应用程序传递过来参数的可访问性,如指针所指向的内容是否可访问。2.4.2静态的增加系统调用函数增加系统调用组在文件syscallUsrNum.def(在目录VxWorks6.3\share\h里,如果没有则需要在此目录新建一个)里增加,内容示意如下:SYSCALL_GROUPSCG_USER02INCLUDE_USER_SYSCALL0user0SysCallFunc0user0SysCallFunc1user0SysCallFunc2解释:第一行SYSCALL_GROUP指明是系统调用,SCG_USER0为组名(标红色的地方可以自己命名),2为组号(只有2-7可用),INCLUDE_USER_SYSCALL为组件定义,如果没有定义则该组的所有函数都不会被包含。第二到第四行为函数号及函数名称定义增加系统调用函数定义user0SysCallFunc03[inta;intb;char*c;]user0SysCallFunc13[inta;intb;char*c;]user0SysCallFunc23[inta;intb;char*c;]解释:user0SysCallFunc0为函数名,3为参数个数,[inta;intb;char*c;]为参数形式增加系统调用处理函数intuser0SysCallFunc0Sc(structuser0SysCallFunc0ScArgs*pArgs){returnOK;}intuser0SysCallFunc1Sc(structuser0SysCallFunc1ScArgs*pArgs){returnOK;}intuser0SysCallFunc2Sc(structuser0SysCallFunc2ScArgs*pArgs){returnOK;}重编译内核代码和用户态代码到目录:installDir/vxworks-6.x/target/src及installDir/vxworks-6.x/target/usr/src执行:makeCPU=cpuTypeTOOL=toolType在应用程序运行,示意如下syscall(12345678,78654321,(int)&c,0,0,0,0,0,SCN_user0SysCallFunc0);SCN_user0SysCallFunc0为当重新编译时自动产生的宏定义,方便调用2.4.3动态的增加系统调用函数编写系统调用函数的符号表如:_WRS_DATA_ALIGN_BYTES(16)SYSCALL_RTN_TBL_ENTRYtestScRtnTbl[]={{(FUNCPTR)testFunc0,1,"testFunc0",0},/*routine0*/{(FUNCPTR)testFunc1,1,"testFunc1",1},/*routine1*/{(FUNCPTR)testFunc2,1,"testFunc2",2},/*routine2*/{(FUNCPTR)testFunc3,1,"testFunc2",3}/*routine3*/};_WRS_DATA_ALIGN_BYTES(16)告诉编译器以16字节对齐,目的是为了改善性能编写系统调用函数如:inttestFuncO(inta,intb,){注册系统调用函数如:syscallGroupRegister(2,"testGroup",4,testScRtnTbl,0);第一个参数为组号,第二个参数为组名,第三个参数为函数个数,第四个参数为系统调用符号表(如果是在shell下调用的话需加&号,如&testScRtnTbl),第五个参数为是否要覆盖已存在的注册项。在应用程序中运行如:syscall(arg1,arg2,arg3,arg4,arg5,0,0,0,SYSCALL_NUMBER(2,0));SYSCALL_NUMBER(2,0)的第一个参数为组号,第二个参数为函数号2.5共享数据区域要点:需定义INCLUDE_SHARED_DATA需使用者额外使用互斥机制来保证数据正确性共享区域可以包括RAM、FLASH、IO、VME内核和应用程序之间都可以共享同一数据区域通过sdCreate来创建,sdOpen来访问2.6动态库2.6.1共享库(SharedLibraries)在应用程序中用,当内核启动时,共享库全部的内容就被加载到特定的RAM中,可以供所有应用程序动态调用。应用程序在编译时只是链接一些必要的信息,代码是在运行时动态定位的。2.6.2Plug-ins类似DLL工作原理,没有调试过。2.7多任务2.7.1任务变量(TaskVariables)当多个相同的任务需要用到同一全局变量名,而又需要互不干扰该变量的值时需要用到。使用时需要先用taskVarAdd来指明哪个变量在哪个任务中,修改变量的值时用函数taskVarSet好像只能在内核态应用2.7.2VxWorkstask通过taskSpawn来创建新的任务2.7.3POSIXThreadsVxWorks支持POSIXThreads。与VxWorkstask相似,如需在应用程序支持,则必须配置内核任务调度为POSIXthreadscheduler。通过pthread_create来创建新的任务。2.7.4任务调度支持VxWorkstraditionalkernelscheduler、POSIXthreadscheduler及user-specifiedkernelscheduler三种调度方式,详细可参考《VxWorks_kernel_programmers_guide_6.3.pdf》在同一应用程序中不建议既使用VxWorksAPI又使用POSIXAPI2.8信号量2.8.1VxWorkssemaphores与VxWorks5.5一样使用。2.8.2POSIXSemaphores需配置INCLUDE_POSIX_SEM组件,不需要其它编译设置等。分为无名信号量与有名信号量,无名信号量只能在同一应用程序中使用,有名信号量可以在不同的应用程序中使用,但是命名时需在前面加“/”,如“/semID001”通过sem_open来创建或打开,sem_wait来获取,sem_post来释放2.9消息队列2.9.1VxWorksMessageQueues使用比较简单,需注意设置最大的消息数量及消息长度。使用msgQCreate创建msgQSend发送,msgQReceive接收,接收发送长度只要不超过设定长度就可。缺点:不能在不同的应用程序或与内核传递消息2.9.2POSIXMessageQueues使用时需要设置最大的消息数量及消息长度使用mq_open创建mq_send发送,mq_receive接收,发送长度只要不超过设定长度就可,接收长度必须与设置的消息长度相等,否则接收会返回出错。可以在不同的应用程序或与内核传递消息2.10Sockets类型有三种:InternetDomainSockets、RoutingSockets、LocalDomainSockets可用在不同操作系统间的、系统内部的各模块的数据交互。详细应用可参考文档《wr_net_stack_vxworks_6_programmers_guide_3.1.pdf》2.11Pipes通过虚拟设备及I/O系统的操作来实现,任务、应用程序、内核程序都可以往管道里发送消息,也可从管道里接收消息,来实现相互通讯。管道可以通过pipeDevCreate来建立,需确定消息数目及长度,当管道写满时,再写入时会处于pend状态直到有数据被读取。注:所写入及读取的数据长度不能大于初始化的消息长度。从管道写入数据及读取数据可以用fread、fwrite等2.12VxWorksevents可以被用作轻量级的二元信号量(因为不需要事先创建)在任务间或任务与中断处理之间的一些同步操作。它可以发送事件来通知任务信号量已经有效或消息已s经到达消息队列,可以分别用semEvStart和msgQEvStart来注册(注:同一个任务每次只能用semEvStart或msgQEvStart注册,不能同时使用),当消息到达时又没有其它的任务挂在这个消息队列时会发送事件,当信号量空闲可用时也会发送事件。像中断或其它任务也可使用eventSend来发送事件,所有的事件都用eventReceive来接收。事件共有32位编码,BIT25-BIT32系统保留使用,各个位本身不代表任何意义,需要使用者自己定义。2.13POSIXQueuedSignals可以通过在内核、应用程序、任务间相互传递信号,并可以带参数。使用与中断处理函数类似,需要注册一个信号处理函数及定义信号Number(共支持63个),该函数的运行或被终止可以通过发送信号来实现。详细应用见《VxWorksApplicationProgrammer’sGu6i.d3e.pdf》(P225)2.14内存管理VxWorks提供flat式的虚拟内存管理方式,即所有的程序都有不同的虚拟地址空间,不会存在相互重叠的现在,通过多段物理内存地址映射成连续地虚拟内存。可以配置MMU启用或关闭,如果MMU被关闭的话,则所有的内存空间是不受保护的,即应用程序、内核程序都可以相互访问。有的硬件架构是不支持关闭MMU的,还有如果关闭MMU的话会导致性能的降低。内存管理组件还提供应用程序、内核程序内存方面出错检测,如内存泄露、内存重复释放等。2.15Shell解析器目前支持C、command、自定义三种解析器。当在C解析器下:可用shConfig"INTERPRETER=Cmd"来切换到command解析器下。当在command解析器下:可用setconfigINTERPRETER=C来切换到C解析器下。其中自定义解析器可以参考系统自带的shellInterpDemo.c例子。编译完成后可进行如下操作即可进入自定义解析器:->ldshellInterpRegister(shellInterpDemoInit)->shConfig"INTERPRETER=DEMO"该例子的解析器可以支持如下命令:tasktocreateatasklisttolistthetaskskilltodestroyataskdumptodumpthememorycontentssymtoaccesssymbolCtoswitchbacktotheCinterpreter3设计要点与VxWorks5.5相比,VxWorks6.3增加了许多新的特性功能,如区分内核态、用户态;兼容POSIX的许多特性功能,如线程、消息、信号量、任务调度;可以自定义任务调度策略、Shell解析器等。这样给开发者带来很大的灵活性,移植POSIX程序的话会变得更加容易。RTPs应用程序的引入可以使系统运行的更加安全,同时维护起来会比较方便,但这是损耗系统效率为代价的。软件设计越灵活,开发者的设计难度就越高。在设计时需要综合多方面的因素,如:稳定性、效率、容错能力、可移植性、软件自身复杂度等等。如果软件是从VxWorks5.5直接移植到VxWorks6.3的,软件整体构架可以不做太多的改动,因为VxWorks6.3是兼容底版本的,最主要的是可以节省移植时间。当然也可做一些适当的调整,如果运行在内核态的程序与内核没什么关系的话,那么可以考虑让其工作在用户态。如果是在VxWorks6.3平台上新开发一些模块,就需要考虑哪些模块适合运行在内核态,哪些模块适合运行在用户态。内核态模块的设计与以前版本基本上是一致的,用户态模块的设计和UNIX相似,每个应用程序都必须有main函数,也就是入口函数。个人理解:一般与底层硬件操作密切的模块、需直接与系统内核交互的模块、驱动模块比较适合设计成内核态模块,其它的都可以考虑设计成用户态模块,这样做对系统的整体性能可能会有一定的影响,但是提高了安全性,更有层次感,也方便在不同的操作系统平台中移植。用户态模块的公共模块可以设计成共享库模式,这样可以节省系统资源。参考文档【1】wr_workbench_vxworks_users_guide_2.5.pdf【2】wr_vx_simulator_users_guide_6.1.pdf【3】vxworks_application_programmers_guide_6.3.pdf【4】vxworks_kernel_programmers_guide_6.3.pdf【5】vxworks_migration_guide_6.3.pdf【6】wr_workbench_vxworks_migration_guide_2.5.pdf
本文档为【VxWorks-6.3-编程调试要点】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
dkcapt
有丰富的船舶驾驶经验,精通航海学
格式:doc
大小:39KB
软件:Word
页数:17
分类:
上传时间:2022-09-06
浏览量:0