VxWorks kernal programmers guide 联系客服

发布时间 : 星期六 文章VxWorks kernal programmers guide更新完毕开始阅读73f45dfea0116c175f0e48a7

Munching 必须在编译之后,下载之前执行。 Munching例子

对于每个工具链,如下例子编译一个C++应用源文件,hello.cpp,依赖.o文件运行munch,编译产生ctdt.c文件,用ctdt.o文件链接应用产生一个可下载模块,hello.out。 使用风河工具链 1 编译源文件:

$ dcc -tPPC604FH:vxworks61 -Xlocal-data-area-static-only -XO \\

-IinstallDir/vxworks-6.x/target/h -DCPU=PPC32 -DTOOL_FAMILY=diab -DTOOL=diab \\ -D_WRS_KERNEL -c hello.cpp

2.munch对象文件:

$ ddump -Ng hello.o | tclsh \\

installDir/vxworks-6.x/host/resource/hutils/tcl/munch.tcl -c ppc > ctdt.c

3.编译munch输出:

$ dcc -tPPC604FH:vxworks61 -Xlocal-data-area-static-only -XO \\

-IinstallDir/vxworks-6.x/target/h -DCPU=PPC32 -DTOOL_FAMILY=diab -DTOOL=diab \\ -D_WRS_KERNEL -c ctdt.c

4.用munched对象文件链接最初对象文件创建一个可下载模块: $ dld -tPPC604FH:vxworks61 -X -r4 -o hello.out hello.o ctdt.o 注明:-r4选项销毁任何保护在输入文件中的COMDAT部分。 使用GUN工具链 1. 编译源代码:

ccppc -mcpu=604 -mstrict-align -O2 -fno-builtin \\ -IinstallDir/vxworks-6.x/target/h \\

-DCPU=PPC604 -DTOOL_FAMILY=gnu -DTOOL=gnu -c hello.cpp

2.munch一个对象文件:

nmppc hello.o | wtxtcl installDir/vxworks-6.x/host/src/hutils/munch.tcl \\ -c ppc > ctdt.c

3.编译munch输出:

ccppc -mcpu=604 -mstrict-align -fdollars-in-identifiers -O2 \\ -fno-builtin -IinstallDir/vxworks-6.x/target/h \\ -DCPU=PPC604 -DTOOL_FAMILY=gnu -DTOOL=gnu -c ctdt.c

4使用munched对象文件链接最初的对象文件创建一个可下载模块:

ccppc -r -nostdlib -Wl,-X \\

-T installDir/vxworks-6.x/target/h/tool/gnu/ldscripts/link.OUT \\ -o hello.out hello.o ctdt.o

注明:VxWorks内核对象模块loader不直接支持linkonce部分。取代的是,在加载之前linkonce部分必须被混合或销毁到标准的text和data部分。GNU -T选项销毁任何包含在输入文件中的linkonce部分。

使用一个通用Makefile规则

若你使用VxWorks makefiel定义,你可以写一个兼容GUN和风河编译器工具链的makefile

CPU = PPC604 TOOL = gnu

TGT_DIR = $(WIND_BASE)/target include $(TGT_DIR)/h/make/defs.bsp

default : hello.out %.o : %.cpp

$(CXX) $(C++FLAGS) -c $< %.out : %.o

$(NM) $*.o | $(MUNCH) > ctdt.c

$(CC) $(CFLAGS) $(OPTION_DOLLAR_SYMBOLS) -c ctdt.c $(LD_PARTIAL) $(LD_PARTIAL_LAST_FLAGS) -o $@ $*.o ctdt.o

Munching,下载,链接之后,静态构造和析构被调用。这个步骤描述如下。

5.5.3 交互调用构造和析构函数

5.6 C++编译器区别

5.6.1

5.6.2

模板实例化 运行时类型信息

5.7 名称空间 5.8 C++ Demo例子

6 任务和多任务

6.1 介绍

现代实时系统基于多任务和任务间通讯的补充概念。一个多任务环境允许一个实时应用用一组独立的任务构建,每个任务由自己的执行线程和系统资源组。任务是VxWorks中调度的基本单元。内核或进程中所有的任务都隶属于同一个调度(不能调度VxWorks进程)。

关于VxWorks对POSIX线程支持的更多信息,参考9. POSIX Facilities。

注明:本章提供了VxWorks内核中存在的设备信息。关于实时进程相关的设备信息,参考VxWorks Application Programmer’s Guide相关章节。

6.2 关于任务和多任务

VxWorks任务是操作系统自身代码执行的基本单元,和作为一个进程执行的应用程序中一样。在其它操心系统下,通常使用线程。(更多信息,参考VxWorks支持的POSIX线程,参考9.10 POSIX Threads)

多任务是为应用控制和操作多个,分散的实时事件而提供的基本机制。VxWorks实时内核提供基本的多任务环节。对于一个单处理器系统,表象是多个任务在并发执行,其实内

核是基于调度策略来执行的。

每个任务由自身的上下文,指内核用于每次任务查看的调度运行需要的CPU环境和系统资源。对于一个上下文切换,一个任务的上下文保存在任务控制块中(TCB)。

一个任务的上下文包括:

? 一个执行的线程;也就是说任务的程序计数器 ? 一个任务的虚拟内存上下文(若支持进程) ? CPU寄存器和协处理器寄存器(可选) ? 动态变量和函数调用栈

? 标准输入、标准输出,标准错误的I/O指派 ? 一个延迟定时器 ? 一个时间片定时器 ? 内核控制结构 ? 信号处理

? 任务私有环境(环境变量)错误状态(errno) ? 调试和性能监控值

若VxWorks没有配置支持进程(INCLUDE_RTP),一个任务的上下文不包括虚拟内存上下文。所有的任务只能在一个但一个通用地址空间运行(内核)。

然而,若VxWorks配置了进程支持——不管进程是否激活——一个内核任务的上下文必须包含自身的虚拟内存上下文,因为系统有潜在操作除内核之外其它虚拟内存上下文的可能性。也就是说,系统中的任务可能运行在不同的虚拟内存上下文中(内核和一个或多个进程)。

关于虚拟内存上下文更多信息,参考15. Memory Management。

注:POSIX标准包括一个线程的概念,和任务相似,但是有其它功能,详细,参考9.10 POSIX Threads。

6.2.1 任务状态和转换

内核为系统中的每一个任务维持目前的状态。一个任务从一个状态改变为另外一个状态做为应用特定函数调用的行为结果(如,尝试使用目前不存在的信号量)和使用开发工具如调试器。

最高优先级的任务是目前执行的处于ready状态的任务。当用创建任务,立即进入ready状态。关于ready状态更多信息,参考Scheduling and the Ready Queue。

当使用VX_TASK_NOACTIVATE选项参数,用taskCreate( )创建任务,或taskOpen( ),实例化后的任务处于suspended状态。要通过taskActivate( )激活,导致任务进入ready状态。激活阶段是非常快的,及时使能应用创建并激活任务。

Tasks States and State Symbols 描述了任务状态和你使用开发工具看到的state symbols。 注明任务状态是附加的;一个任务可能在一个时刻处于多个状态。转换可能会发生在其中一个状态。如一个任务从挂起态到挂起和停止态转换。且之后改变为非挂起态,之后变化为停止态。

STOP状态用于调试工具,程序运行到一个断点位置时。也用于错误检测和报告工具()。展