云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > VxWorks kernal programmers guide

VxWorks kernal programmers guide

  • 62 次阅读
  • 3 次下载
  • 2025/5/2 23:46:56

所有应用任务的优先级范围是100到255。 Driver Task Priorities

对比于应用任务的优先级,100到255,驱动支持的优先级范围是51到99。 这些任务是关键的;如若当从一个芯片上拷贝数据时支持的任务调用失败,则设备会丢失数据。驱动支持的任务例子包含tNet0,HDLC任务等。

系统任务tNet0的优先级是50,所以用户任务不能指派低于50的任务优先级;否则,网络连接会挂死,和阻碍主机工具的调试功能。

6.4.2 VxWorks传统调度

VxWorks传统调度提供基于优先级的抢占调度策略,和编程初始化轮询调度选项一样。传统的调度也可以参考original或native调度。

传统的调度默认由INCLUDE_VX_TRADITIONAL_SCHEDULER组件提供。

关于POSIX线程调度和定制调度信息,参考9.12 POSIX and VxWorks Scheduling和22. Custom Schedule。

Priority-Based Preemptive Scheduling 一个基于优先级抢占调度,当一个任务的优先级高于目前运行的任务时,CPU被抢占。因此,内核确保CPU总是会分配给已经准备好的最高优先级任务。这意味着若一个任务——优先级比目前运行的任务优先级高——已经准备好运行,内核立即保存任务的上下文,切换到高优先级任务上下文。如,Figure 6-2,t1任务被较高优先级的任务t2抢占,之后被任务t3抢占。当t3完成,继续t2运行。当t2完成运行,t1继续运行。

这种调度策略的缺点是,当多个具有相等优先级任务共享一个处理器时,若一个单个任务不能阻塞,会抢占处理器。因此,其它相同优先级的任务永久得不到机会运行。

轮询调度解决了这个问题(Round-Robin Scheduling)。

Scheduling and the Ready Queue

VxWorks调度维持一个FIFO ready队列机制,这个队列包含所有处于ready状态的每个优先级级别的任务。当当下优先级级别可以访问CPU时,队列前面对应优先级的任务开始执行。

一个任务在ready队列中的位置可能会发生变化,取决于执行的操作,如下: 若一个任务被抢占,调度运行高优先级任务,但是被抢占的任务依然在优先级列表的前面位置。

若一个任务pended,delayed,suspended,或stoped,被从ready队列中移除。之后再次准备好运行,在位于ready队列优先级列表的最后(关于任务状态和导致状态转移的操作,参考6.2.1 Task States and Transitions)。

若一个任务的优先级通过taskPrioritySet( )改变,将会位于新的优先级列表最后。 若一个任务临时基于互斥信号量优先级继承策略启动(SEM_INVERSION_SAFE),在相关优先级上执行完返回到原来的优先级时,处于原来优先级列表后面(关于互斥信号量和优先级继承,参考Priority Inheritance Policy)。

移动任务到优先级列表最后

taskRotate( )函数可以用于从就绪队列中对应优先级队列前面移到最后。如,如下调用移动任务到优先级级别100列表最后:

taskRotate(100); 移动目前正在执行的任务到对应优先级列表最后,使用TASK_PRIORITY_SELF参数。 taskRotate( )函数可以用于切换到轮询模式。允许编程控制就绪队列中相同优先级任务共享CPU,而不是让系统在既定时间间隔内这样做。关于轮询机制更多信息,参考Round-Robin Scheduling。

Round-Robin Scheduling

6.5 任务创建和管理

如下部分概述了基本VxWorks任务函数,可以在taskLib VxWorks库中找到,这些函数为任务创建和控制提供方法,还有获取任务信息。参考相关API。

为了交互使用,你可以用主机工具或内核shell控制VxWorks任务;参考Wind River Workbench by Example指导,Wind River Workbench Host Shell User’s Guide,和VxWorks Kernel Programmer’s Guide: Target Tools。

6.5.1 任务创建和激活

Table 6-2列出的函数用于创建任务。 函数的参数是新任务名(一个ASCII字符串),任务的优先级,一个options字,栈大小,主函数地址,传递个主函数的10个启动参数。

id = taskSpawn ( name, priority, options, stacksize, main, arg1, …arg10 ); 注明一个任务的优先级可以在创建之后改变;参考6.5.9 Task Scheduling Control。

taskSpawn( )函数创建新的任务上下文,包含分配的栈,使用具体参数安装调用主函数的任务环境。新任务从指定函数入口执行。

taskOpen( )函数提供一个类似POSIX 的API,来创建一个任务(使用是否激活参数)

或得到一个已有任务的句柄。也为创建一个任务提供一个公共对象,所有进程和内核可见(参考6.5.3 Inter-Process Communication With Public Tasks)。taskOpen( )函数是最通用目的的任务创建函数。

taskSpawn( )函数体现了分配,初始化,激活的每一步步骤。初始化和激活函数由函数taskCreate( )和taskActivate( )提供。然而,风河推荐当你需要控制分配和激活时使用这些函数。

taskInit( )和taskInitExcStk( )区别是taskInit( )函数允许指明执行栈地址,而taskInitExcStk( )函数允许指明执行和异常栈地址。

任务静态实例化

Table 6-2列出的创建函数执行一个动态,两步操作,在运行时位任务对象分配内存,之后初始化对象。任务(和其它VxWorks对象)也可以静态实例化——这意味着在编译时为对象分配内存——之后在运行时实例化对象。

关于静态实例化更多信息,参考4.6 Static Instantiation of Kernel Objects。关于任务静态实例化更多信息,参考4.6.4 Static Instantiation of Tasks。 6.5.2 任务名称和ID

若使用taskOpen( )函数创建,一个任务可以显式命名(使用一个任意长度的ASCII字符串)。使用taskSpawn( )函数,不必须命名,这种情况下,使用一个空指针代替name参数,导致自动产生一个唯一任务名。名字格式为,tN,N是一个十进制数,没创建一个,N递增。不管任务如何创建,当任务发起时,都会返回一个任务ID。

为了避免命名冲突,VxWorks使用命名前缀约定,所有的从目标启动的内核任务都必须使用字母t前缀,所有从主机启动的任务使用u前缀。另外,一个实时进程初始化任务名是一个可执行文件名(更少的扩展),使用前缀字母i。

一个必须用一个反斜杠命名的任务是系统范围内都可以访问的公共对象(不仅仅是在创建的内存上下文中——进程或内核)。更多信息,参考6.5.3 Inter-Process Communication With Public Tasks。

大多数VxWorks任务函数使用一个任务ID作为指定任务的参数。VxWorks使用一个规范:一个为0的任务ID总表示调用任务,任务ID是一个4字节的任务数据结构。

Task Naming Rules

任务命名时要遵循如下任务命名规则:

? 公共任务名必须唯一,且必须以反斜杠开始(如,/tMyTask)。注明公共任务是整

个系统可见的——所有的进程和内核。更多关于公共任务的信息,参考6.5.3 Inter-Process Communication With Public Tasks。

? 私有任务名应该唯一。VxWorks不要求私有任务名唯一,但是最好使用唯一命名,避免用户混淆。(私有任务仅创建的实体内可见——内核或进程)

为了利用主机开发工具的优势,任务名不应该和全局函数或变量名冲突。 Task Name and ID Routines

Table 6-3列出了taskLib函数,管理任务IDs和名称。

6.5.3 进程间使用公共任务通讯

VxWorks任务可以创建为私有对象,仅可以在创建任务的内存空间中访问(内核或进程);或公共对象,在整个系统中都可以访问。任务创建为私有或公共对象,取决于任务命名方式。公共对象任务名必须以一个反斜杠开始。更多信息,参考6.5.2 Task Names and IDs。

创建一个任务为公共对象,运行其他任务从本进程外部发送信号或事件来和本任务交互。(使用taskKill( )和eventSend( )函数)

更详细的信息,参考7.10 Inter-Process Communication With Public Objects和the taskOpen entry in the VxWorks Kernel API Reference。

6.5.4 7.10 Inter-Process Communication With Public Objects, p.144Task Creation Options

当启动一个任务时,你可以传递一个或多个选项参数,如Table 6-4。结果取决于在指定选项上执行一个逻辑或操作。

搜索更多关于: VxWorks kernal programmers gui 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

所有应用任务的优先级范围是100到255。 Driver Task Priorities 对比于应用任务的优先级,100到255,驱动支持的优先级范围是51到99。 这些任务是关键的;如若当从一个芯片上拷贝数据时支持的任务调用失败,则设备会丢失数据。驱动支持的任务例子包含tNet0,HDLC任务等。 系统任务tNet0的优先级是50,所以用户任务不能指派低于50的任务优先级;否则,网络连接会挂死,和阻碍主机工具的调试功能。 6.4.2 VxWorks传统调度 VxWorks传统调度提供基于优先级的抢占调度策略,和编程初始化轮询调度选项一样。传统的调度也可以参考original或native调度。 传统的调度默认由INCLUDE_VX_TRADITIONAL_SCHEDULER组件提供。 关于POSI

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com