77范文网 - 专业文章范例文档资料分享平台

VX编程手册(2)

来源:网络收集 时间:2019-04-15 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

VxWorks编程手册

图1-2——优先级的抢占 wind内核有256个优先级级别,从0到255,优先级0最高,255最低。当创建任务式,需要设置其优先级,当任务在运行时,可以调用函数taskPrioritySet( )来改变优先级。

1.3.2轮询模式

抢占式的优先级模式可以通过增加轮询式进行扩充。轮询模式是所有具有相同优先级的ready任务平均分配CPU。如果不用轮询式,当多个具有相同优先级的任务共享CPU时,某个任务由于没有被阻塞可能独占整个CPU,因此其他等优先级的任务没有机会运行。 通过时间分片的方式,轮询模式可以实现为具有相同优先级的任务公平的分配CPU。每个任务(一个优先级组)运行一定的时间或时间片,然后另一个任务执行相同的时间。轮询模式可以通过调用函数kernelTimeSlice( )来触发,它的一个参数是时间片,再将处理器交给另一个等优先级任务之前的运行时间。 详细说来,每个任务都有一个运行时间计数器对应,每个时钟加1。当指定的时间片间隔完成时,计数器清0,当前任务被放到等优先级任务队列的最后,新的任务被执行,计数器被初始化为零。 如果一个任务在运行时被告优先级的任务抢占,那么运行时间计数器被保存,当此任务再次被运行时,时间计数被恢复。图1-3显示了具有相同优先级的任务t1、t2和t3的调度程序。

图1-3——轮询模式

任务2被任务4抢占,当任务4完成时,任务2从中断点恢复。

第 6 页 共 35 页

VxWorks编程手册

1.3.2抢占锁(Preemption Locks )

wind调度程序可以调用函数taskLock( )和taskUnlock( )来取消和使能每个任务的抢占模式。当调用函数taskLock( )取消某个任务的调度程序时,这个任务不会被抢占。然而,如果此任务已被阻塞或悬挂,调度程序就选择高优先级的适合的任务运行。当被锁定的任务解锁,并再次运行时,抢占模式再次被取消。(When the preemption-locked task unblocks and begins running again, preemption is again disabled.)

注意,抢占锁阻止任务内容被切换,但不能锁定中断处理。抢占锁也能用来实现互斥操作。

1.4任务控制

下面粗略浏览一下VxWorks的任务程序,在VxWorks的库taskLib中可以找到。这个程序提供了任务创建和控制的方法。

任务创建:

下表的函数用来创建任务: Call taskSpawn( ) taskCreate( ) taskActivate( ) Description 生成(创建和激活)一个新任务 创建一个新任务,但不激活它。 激活一个已经创建的任务 函数taskSpawn( )的参数有:新建任务名(ASCII字符串)、优先级、选项字、堆栈大小、主程序地址及10个参数(作为启动参数传给主函数): id = taskSpawn ( name, priority, options, stacksize, main, arg1, …arg10 );

此函数生成任务内容,包括分配堆栈、配置任务环境,新任务在制定程序的入口开始执行。另外,此函数包括底层的创建和激活步骤(taskCreate( )和 taskActivate( ))。

任务名称和IDs: 当创建任务时,你可以制定任意长度的ASCII字符串作为任务名称。VxWorks返回任务Ids,ID是4字节长度,多数VxWorks任务都把任务ID作为任务的唯一标示。VxWorks用0任务ID表示正在调用的任务。VxWorks不需要任务名称是唯一的,但是推荐使用唯一任务名,以免混淆。而且,为了更好的利用Tornado开发环境,任务名称不应与全局函数和变量名称发生冲突。为了避免名字冲突,VxWorks是用约定前缀pdt开头。你可能不想为你的任务命名,如果它是NULL,taskSpawn( )函数的name参数就用指针替代,VxWorks为其分配唯一的名称,形式为pdtN,N为十进制整数。 通常,任务名可以转化为对应的任务Ids,以简化任务间的交互。 taskLib中的例程管理任务IDs和任务名称: 函数: Call taskName( ) taskNameToId( ) taskIdSelf( ) taskIdVerify( ) Description 得到任务id对应的任务名称 得到任务名称对应的任务id 得到调用任务的id(正在运行的) 验证一个指定任务是否存在 第 7 页 共 35 页

VxWorks编程手册

下表的函数也用于任务名称和任务Ids: Description 找到与名称字符串和类型相匹配的对象 得到对象名称 设置对象名称 显示已知名称的对象的相关信息 Routine objNameToId( ) objNameGet( ) objNameSet( ) objNameShow( ) objNameToId( ) 函数是VxWorks的缺省函数,为了包括objNameShow( )函数,配置INCLUDE_OBJECT_NAME_SHOW组件。

任务和对象的所有权: 同其他的wind对象一样,任务也有所有者。但是同其他对象相比,任务的缺省所有者是任务所生成的保护域(protection domain)。在创建任务时,可以指定参数,以使这些任务成为他们所创建的其他对象的所有者,但是,与其他对象不同,任务的所有者不可以被改变。 使用函数objOwnerGet( )可以得到对象拥有者的id。函数objShowAll( )可以用来得到对象所有权的层次关系。

任务选项:

当生成任务时,可以根据需要,执行与操作,来指明选项参数,如下表所示(如果任务执行浮点操作,VX_FP_TASK选项必须被设置): 选项 VX_USER_MODE VX_SUPERVISOR_MODE VX_UNBREAKABLE VX_FP_TASK VX_PRIVATE_ENV VX_NO_STACK_FILL VX_STDIO_INHERIT 值(hex) 描述 0x0000 0x0001 0x0002 0x0008 0x0080 0x0100 0x0200 在用户模式下执行,这是所有任务的缺省模式(除了内河任务), 等同于VX_SUPERVISOR_MODE选项设置为not。 在超级用户模式下运行。这是内核任务的缺省模式。 不允许在调试时对任务设置断点 执行浮点计算 包括私有环境支持,见envLib. 调用函数checkStack() 时努允许填充0xee 当任务用此选项创建时,任务继承VX_STDIO_INHERIT选项以及标准I/O文件描述符。当不使用此选项时,被创建的任务使用标准I/O文件描述符,可以用函数pdStdIoSet( )来改变。 被任务创建的对象直接由此任务所有,而不是任务的主保护域。例外是任务本身,他一直都由保护域所有。 取消任务的堆栈溢出保护 VX_TASK_OBJ_OWNER 0x0400 VX_NO_STACK_OVERFLOW 0x0800 例子:

为了创建浮点操作的任务,如下:

tid = taskSpawn (\2387, 0, 0, 0, 0, 0, 0, 0, 0, 0);

第 8 页 共 35 页

VxWorks编程手册

任务选项值可以在任务创建之后进行检测和修改,可以使用如下函数(目前,只有VX_UNBREAKABLE、VX_TASK_OBJ_OWNER和VX_STDIO_INHERIT选项可以被改变): 函数 taskOptionsGet( ) taskOptionsSet( ) 描述 检测任务参数 设置任务选项

任务信息:

任务的信息可以通过调用下列函数得到,任务的状态信息是动态的,信息可能不是当前的,除非此任务是在休眠状态: 函数 taskIdListGet( ) taskInfoGet( ) taskPriorityGet( ) taskRegsGet( ) taskRegsSet( ) taskIsSuspended( ) taskIsReady( ) taskTcb( ) 描述 将所有活动状态的任务id填写到个数组中 得到一个任务的信息 检查任务的优先级 检查一个任务的寄存器(但是不能被当前任务使用) 设置一个任务的寄存器(但是不能被当前任务使用) 检查一个任务是否在悬挂状态(suspended.) 检查一个任务是否准备运行就绪 得到一个任务的控制块的指针,此函数只用于内核保护域。 任务的删除、资源回收和安全删除: 任务可以从系统中动态删除,下列函数用于对任务的删除: 函数 exit( ) taskDelete( ) taskSafe() taskUnsafe( ) 描述 结束正在运行任务,释放内存* 结束制定的任务,释放内存* 保护当前任务,防止被删除 取消taskSafe( )操作,即能够删除当前任务 说明:*当任务结束时,此任务所分配的内存并不释放;但是,当主保护域删除时,内存才被释放。

警告:不要在不恰当的时候删除任务。在应用程序删除一个任务时,此任务应该释放所有资源。 当入口函数(创建任务时指定的)返回时,意味着已经隐式的调用了函数exit( )。一个任务可以调用函数taskDelete( )来杀死本身或其他任务。因此,一个任务可以通过调用exit(),或调用taskDelete( )函数,或在入口函数中返回,来删除任务本身。 当一个任务被删除时,其他任务不会知道,函数taskSafe( ) 和taskUnsafe( )防止任务的意外删除。taskSafe( )函数防止一个任务被其他任务删除,例子: 当一个任务获得信号量,并正访问某些数据结构,当执行到某个关键域,此任务被删除了,那么数据结构可能处于一种混乱状态,信号量也没有被任务释放,关键的资源对其他任务是不可用的。

第 9 页 共 35 页

VxWorks编程手册

当一个任务试图删除另一个被保护的任务时会处于阻塞状态,当另一个任务完成操作后会调用taskUnsafe( )函数解除保护,那么此任务就可以被删除了。为了支持嵌入式的安全删除,一个计数器纪录taskSafe( )和taskUnsafe( )函数被调用的次数,只有当计数器为0时(即unsafes和safes次数一样多),才允许删除。保护操作只用于当前任务。 下面是一个例子: taskSafe ();

semTake (semId, WAIT_FOREVER); /* Block until semaphore available */ .

. critical region .

semGive (semId); /* Release semaphore */ taskUnsafe ();

如上例所示,安全删除通常与互斥量成对出现。

任务控制: 任务控制函数如下: 函数 taskSuspend( ) taskResume( ) taskRestart( ) taskDelay( ) nanosleep( ) 描述 Suspend a task. Resume a task. Restart a task. Delay a task; delay units are ticks, resolution in ticks. Delay a task; delay units are nanoseconds, resolution in ticks. VxWorks调试工具需要程序悬挂、恢复任务,用来冻结任务的状态以便检测。 当任务在执行过程中可能遇到灾难性的徐徐错误,因此任务必须能够重新启动。taskRestart( )函数的重启机制是重新创建任务,其参数与第一次创建任务的参数相同。 Delay操作是任务能够休眠一段时间,常用来检测(polling)应用程序,例如,让任务休眠半个时钟周期:taskDelay (sysClkRateGet ( ) / 2); sysClkRateGet( )函数返回系统时钟的速率,每秒的ticks数。你也可以用nanosleep()函数(POSIX)实现同样的功能,只是时间单位不同,nanosleep()函数以秒为单位。Delay操作的另一个影响是此任务被排到同优先级任务序列之后。因此,你能把CPU给另一个同优先级任务,只要你延迟0个ticks: taskDelay (NO_WAIT); /* allow other tasks of same priority to run */ 0延迟只能用于taskDelay( )函数; nanosleep( )函数会出错。

1.5任务扩展

VxWorks提供一些钩子函数,可以在任务创建、任务切换及任务删除时调用。(任何被钩子函数调用的用户程序必须是在内核域),当调用钩子函数时,应注意一点:

1、 Task switch hook routines must not assume any VM context is current other than the

kernel context (as with ISRs).

2、 Task switch and swap hooks must not rely on knowledge of the current task or invoke

any function that relies on this information; for example, taskIdSelf( ). 3、 A switch or swap hook must not rely on the TASK_ID_VERIFY(pOldTcb) mechanism

to determine if the delete hook, if any, has already executed for the self-destructing task

第 10 页 共 35 页

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VX编程手册(2)在线全文阅读。

VX编程手册(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/599177.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: