VxWorks 6.3 编程调试要点(2)

2018-12-17 13:07

VxWorks 6.3 编程调试要点

第一行SYSCALL_GROUP指明是系统调用,SCG_USER0为组名(标红色的地方可以自己命名),2 为组号(只有2-7可用),INCLUDE_USER_SYSCALL为组件定义,如果没有定义则该组的所有函数都不会被包含。 第二到第四行为函数号及函数名称定义 2)

增加系统调用函数定义

user0SysCallFunc0 3 [ int a; int b; char *c; ] user0SysCallFunc1 3 [ int a; int b; char *c; ] user0SysCallFunc2 3 [ int a; int b; char *c; ] 解释:

user0SysCallFunc0为函数名, 3 为参数个数, [ int a; int b; char *c; ] 为参数形式 3)

增加系统调用处理函数

int user0SysCallFunc0Sc(struct user0SysCallFunc0ScArgs *pArgs) { }

int user0SysCallFunc1Sc(struct user0SysCallFunc1ScArgs *pArgs) { }

int user0SysCallFunc2Sc(struct user0SysCallFunc2ScArgs *pArgs) { } 4)

重编译内核代码和用户态代码

到目录:installDir/vxworks-6.x/target/src 及 installDir/vxworks-6.x/target/usr/src执行:

make CPU=cpuType TOOL=toolType 5)

在应用程序运行,示意如下

syscall (12345678, 78654321, (int)&c, 0, 0, 0, 0, 0,SCN_user0SysCallFunc0); SCN_user0SysCallFunc0 为当重新编译时自动产生的宏定义,方便调用

2 .4.3动态的增加系统调用函数

1)

编写系统调用函数的符号表 如:

…… return OK; …… return OK; …… return OK;

仅供内部使用

6

VxWorks 6.3 编程调试要点

_WRS_DATA_ALIGN_BYTES(16) SYSCALL_RTN_TBL_ENTRY testScRtnTbl [] = {

{(FUNCPTR) testFunc0, 1, \ {(FUNCPTR) testFunc1, 1, \ {(FUNCPTR) testFunc2, 1, \ {(FUNCPTR) testFunc3, 1, \ };

_WRS_DATA_ALIGN_BYTES(16)告诉编译器以16字节对齐,目的是为了改善性能 2)

编写系统调用函数 如:

int testFunc0(int a,int b,……) { } …… 3)

注册系统调用函数

如:syscallGroupRegister (2, \

第一个参数为组号,第二个参数为组名,第三个参数为函数个数,第四个参数为系统调用符号表(如果是在shell下调用的话需加&号,如& testScRtnTbl),第五个参数为是否要覆盖已存在的注册项。 4)

在应用程序中运行

如:syscall (arg1, arg2, arg3, arg4, arg5, 0, 0, 0,SYSCALL_NUMBER(2,0)); SYSCALL_NUMBER(2,0)的第一个参数为组号,第二个参数为函数号

2 .5共享数据区域

要点: 1) 2) 3) 4) 5)

需定义 INCLUDE_SHARED_DATA

需使用者额外使用互斥机制来保证数据正确性 共享区域可以包括RAM、FLASH、IO、VME 内核和应用程序之间都可以共享同一数据区域 通过sdCreate 来创建,sdOpen来访问

…….

2 .6动态库

2 .6.1共享库(Shared Libraries)

在应用程序中用,当内核启动时,共享库全部的内容就被加载到特定的RAM中,可以供所有应用程序动态调用。应用程序在编译时只是链接一些必要的信息,代码是在运行时动态定位的。 2 .6.2Plug-ins

类似DLL工作原理,没有调试过。

仅供内部使用

7

VxWorks 6.3 编程调试要点

2 .7多任务

2 .7.1任务变量(Task Variables)

当多个相同的任务需要用到同一全局变量名,而又需要互不干扰该变量的值时需要用

到。

使用时需要先用taskVarAdd 来指明哪个变量在哪个任务中,修改变量的值时用函数

taskVarSet

好像只能在内核态应用

2 .7.2VxWorks task

通过taskSpawn来创建新的任务

2 .7.3POSIX Threads

VxWorks 支持 POSIX Threads。与 VxWorks task相似,如需在应用程序支持,则必须配置内核任务调度为POSIX thread scheduler。通过pthread_create来创建新的任务。 2 .7.4任务调度

支持VxWorks traditional kernel scheduler、POSIX thread scheduler及user-specified kernel scheduler三种调度方式,详细可参考《VxWorks_kernel_programmers_guide_6.3.pdf》

在同一应用程序中不建议既使用VxWorks API又使用POSIX API

2 .8信号量

2 .8.1VxWorks semaphores

与VxWorks5.5一样使用。

2 .8.2POSIX Semaphores

需配置INCLUDE_POSIX_SEM组件,不需要其它编译设置等。分为无名信号量与有名信号量,无名信号量只能在同一应用程序中使用,有名信号量可以在不同的应用程序中使用,但是命名时需在前面加“/”,如 “/semID001”

通过sem_open来创建或打开,sem_wait来获取,sem_post来释放

2 .9消息队列

2 .9.1VxWorks Message Queues

使用比较简单,需注意设置最大的消息数量及消息长度。

使用msgQCreate创建 msgQSend发送,msgQReceive接收,接收发送长度只要不超过设定长度就可。

缺点:不能在不同的应用程序或与内核传递消息

2 .9.2POSIX Message Queues

使用时需要设置最大的消息数量及消息长度

使用mq_open创建 mq_send发送,mq_receive接收,发送长度只要不超过设定长度就可,接收长度必须与设置的消息长度相等,否则接收会返回出错。 可以在不同的应用程序或与内核传递消息

2 .10Sockets

类型有三种:Internet Domain Sockets、Routing Sockets、Local Domain Sockets。可用在

仅供内部使用

8

VxWorks 6.3 编程调试要点

不同操作系统间的、系统内部的各模块的数据交互。

详细应用可参考文档《wr_net_stack_vxworks_6_programmers_guide_3.1.pdf》

2 .11Pipes

通过虚拟设备及I/O系统的操作来实现,任务、应用程序、内核程序都可以往管道里发送消息,也可从管道里接收消息,来实现相互通讯。

管道可以通过pipeDevCreate来建立,需确定消息数目及长度,当管道写满时,再写入时会处于pend状态直到有数据被读取。注:所写入及读取的数据长度不能大于初始化的消息长度。从管道写入数据及读取数据可以用fread、fwrite等 2 .12VxWorks events

可以被用作轻量级的二元信号量(因为不需要事先创建)在任务间或任务与中断处理之间的一些同步操作。它可以发送事件来通知任务信号量已经有效或消息已s经到达消息队列,可以分别用semEvStart和msgQEvStart来注册(注:同一个任务每次只能用semEvStart或msgQEvStart注册,不能同时使用),当消息到达时又没有其它的任务挂在这个消息队列时会发送事件,当信号量空闲可用时也会发送事件。像中断或其它任务也可使用eventSend来发送事件,所有的事件都用eventReceive来接收。事件共有32位编码,BIT25-BIT32系统保留使用,各个位本身不代表任何意义,需要使用者自己定义。 2 .13POSIX Queued Signals

可以通过在内核、应用程序、任务间相互传递信号,并可以带参数。使用与中断处理函数类似,需要注册一个信号处理函数及定义信号Number(共支持63个),该函数的运行或被终止可以通过发送信号来实现。

详细应用见《VxWorks Application Programmer’s Guide 6.3.pdf》 (P225)

2 .14内存管理

VxWorks提供flat式的虚拟内存管理方式,即所有的程序都有不同的虚拟地址空间,不会存在相互重叠的现在,通过多段物理内存地址映射成连续地虚拟内存。

可以配置MMU启用或关闭,如果MMU被关闭的话,则所有的内存空间是不受保护的,即应用程序、内核程序都可以相互访问。有的硬件架构是不支持关闭MMU的,还有如果关闭MMU的话会导致性能的降低。

内存管理组件还提供应用程序、内核程序内存方面出错检测,如内存泄露、内存重复释放等。 2 .15Shell 解析器

目前支持C、command、自定义三种解析器。

当在C解析器下:可用shConfig \来切换到command解析器下。 当在command解析器下:可用set config INTERPRETER=C 来切换到C解析器下。 其中自定义解析器可以参考系统自带的shellInterpDemo.c例子。编译完成后可进行如下操作即可进入自定义解析器:

仅供内部使用

9

VxWorks 6.3 编程调试要点

1) 2) 3)

-> ld < shellInterpDemo.o

-> shellInterpRegister (shellInterpDemoInit) -> shConfig \

该例子的解析器可以支持如下命令:

■ task to create a task ■ list to list the tasks ■ kill to destroy a task

■ dump to dump the memory contents ■ sym to access symbol

■ C to switch back to the C interpreter

3 设计要点

与VxWorks5.5相比,VxWorks6.3增加了许多新的特性功能,如区分内核态、用户态;兼容POSIX的许多特性功能,如线程、消息、信号量、任务调度;可以自定义任务调度策略、Shell解析器等。

这样给开发者带来很大的灵活性,移植POSIX程序的话会变得更加容易。RTPs应用程序的引入可以使系统运行的更加安全,同时维护起来会比较方便,但这是损耗系统效率为代价的。

软件设计越灵活,开发者的设计难度就越高。在设计时需要综合多方面的因素,如:稳定性、效率、容错能力、可移植性、软件自身复杂度等等。

如果软件是从VxWorks5.5直接移植到VxWorks6.3的,软件整体构架可以不做太多的改动,因为VxWorks6.3是兼容底版本的,最主要的是可以节省移植时间。当然也可做一些适当的调整,如果运行在内核态的程序与内核没什么关系的话,那么可以考虑让其工作在用户态。

如果是在VxWorks6.3平台上新开发一些模块,就需要考虑哪些模块适合运行在内核态,哪些模块适合运行在用户态。内核态模块的设计与以前版本基本上是一致的,用户态模块的设计和UNIX相似,每个应用程序都必须有main函数,也就是入口函数。

个人理解:一般与底层硬件操作密切的模块、需直接与系统内核交互的模块、驱动模块比较适合设计成内核态模块,其它的都可以考虑设计成用户态模块,这样做对系统的整体性能可能会有一定的影响,但是提高了安全性,更有层次感,也方便在不同的操作系统平台中移植。用户态模块的公共模块可以设计成共享库模式,这样可以节省系统资源。

仅供内部使用

10

VxWorks 6.3 编程调试要点

参考文档

【1】 【2】 【3】 【4】 【5】 【6】

wr_workbench_vxworks_users_guide_2.5.pdf wr_vx_simulator_users_guide_6.1.pdf

vxworks_application_programmers_guide_6.3.pdf vxworks_kernel_programmers_guide_6.3.pdf vxworks_migration_guide_6.3.pdf

wr_workbench_vxworks_migration_guide_2.5.pdf

仅供内部使用

11


VxWorks 6.3 编程调试要点(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:单元板块制作作业指导书

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: