VxWorks基本OS介绍

这里我就偷点懒,直接复制粘贴文档了。可能会有一些图片无法显示 ,可以直接管我索要文档。

每一个被切换的程序实体就是“任务”。每一个任务都有其自己的上下文——所谓上下文就是指任务在每一次被核心调度时所需要的CPU环境、系统资源。在上下文的切换过程中,每一个任务的上下文被存在该任务的任务控制块中(TCB)。

 执行的线程,也就是任务程序计数器;

 CPU寄存器的内容和浮点寄存器中的内容;

 动态变量和程序调用所使用的堆栈;

 标准输入输出的I/O分配和错误;

 延时计时器;

 时间片计时器;

 核心控制结构;

 信号处理句柄;

 调试和性能监视值。

wind核心中使用了基于优先级抢占式的任务调度策略,但是用户也可以选择优先级轮转调度策略。

1.优先级抢占策略

通过使用优先级抢占策略,每一个任务都会拥有一个优先级,这样内核就会确信将CPU资源分给了优先级最高的就绪任务。这种方法之所以叫做抢占式的,是指任何运行的任务会被一个变成就绪状态而且优先级更高的任务打断,这时系统会保存当前任务的上下文并立即切换到高优先级的任务上下文,并且开始执行这个任务。在图14.2所示的任务优先级抢占图中给出了优先级抢占的例子,例子中任务t1被优先级较高的任务t2抢占,而更高优先级的任务t3则抢占了t2的执行,当t3执行完后,t2开始继续执行,接下来t1在t2完成之后从被打断处继续执行。

VxWorks的wind内核支持256级优先级,由高到低分别是0到255。任务创建的同时也就同时被赋予了相应的优先级,但是在任务执行的过程中,同样可以通过系统函数taskPrioritySet()设置某一个任务的优先级。

VxWorks系统中,所有应用程序任务的优先级应该在100~250之间;至于驱动程序创建的任务的优先级可以位于51~99之间,系统网络任务tNetTask的优先级默认值为50

2.时间片轮转的调度策略

如果没有时间片轮转任务调度策略,那么当同优先级的一个任务获得了CPU资源之后,它就会一直占用CPU资源直到完成执行,相同优先级的任务就会因为得不到CPU资源而不得不阻塞。解决这个问题就需要循环调度策略。

对于具有相同优先级的任务,时间片轮转调度策略会为每一个任务分配相同的CPU时间片。优先级相同的一组任务都会在相同的时间间隔内被执行,每一个时间片结束,内核就会通过调度算法执行就绪队列中的另一个任务,任何一个任务都不会比其他的任务获得更多的时间片。

当一个高优先级的任务出现时,正在执行的优先级的任务会被打断,它的运行时间计数器会被保存在任务控制块中,一旦高优先级的任务完成执行,被打断的任务将恢复执行,而运行时间计数器会从被打断的位置继续计数,直到分配给这个任务的时间片被消耗掉,或者该任务执行完。图14.3解释了刚才所描述的情况:t1,t2,t3是具有相同优先级的任务,而t2在执行的过程中被优先级更高的任务t4抢占,当t4执行完之后,t2继续使用完了系统分配的时间片。

3.抢占锁

VxWorks同样允许低优先级的任务禁止正在使用的CPU资源被高优先级的任务抢占。注意:taskLock()/taskUnlock()的操作比semGive()/semTake()操作速度要快。主要用于对临界资源的保护,避免系统发生异常。

通常我们都会使用taskSpawn(),这个函数可以方便的创建并且激活任务,taskId = taskSpawn("tRead", 150, 0, 2048, (FUNCPTR)TaskRead, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9);

2.任务的名称和ID

当用户生成一个任务的时候,可以将任意长度的字符串作为任务的名称。而对于每一个新生成的任务,VxWorks都会返回一个ID号来标志这个任务,这个ID号是一个四字节的指针,指向了任务的结构。但是VxWorks提供了一个方便的表示办法,在一个任务中使用0代替任务自身的ID

为了避免任务之间名称的重复,VxWorks有一个名称格式的规定,所有目标机创建的任务名称都以字母t开头,而主机生成的任务都以字母u开头。

虽然任务名会在调试和任务控制中带来极大的方便,但是生成任务的时候也可以不指定任务名,这个时候VxWorks系统会为用户生成的任务自动命名。这个功能使循环生成多任务变得更为方便,用户可以通过循环体生成相同处理的很多任务。

taskIdSelf()获取当前任务的ID

一个任务可以通过使用exit()将自己结束。如果希望结束其他任务,可以通过调用taskDelete()实现。当一个任务结束的时候,任何其他的任务都不会得到通知。这时,就应该使用其它的方法来通知相关任务。同时,任务执行所申请的内存也不会在其终止时自动释放。

为了避免任务在未释放资源的时候就被意外的结束,VxWorks提供了一对函数来进行保护,这就是taskSafe()和taskUnsafe()。为了避免任务在未释放资源的时候就被意外的结束,VxWorks提供了一对函数来进行保护,这就是taskSafe()和taskUnsafe()

函数

描述

taskSuspend()

挂起任务

taskResume()

恢复任务

taskRestart()

重启任务

taskDelay()

任务延时(参数为时间片)

nanosleep()

任务延时(参数为纳秒)

 

函数

描述

taskCreateHookAdd()

增加任务创建时调用的函数

taskCreateHookDelete()

删除任务调用时要执行的函数

taskSwitchHookAdd()

增加任务切换时调用的函数

taskSwitchHookDelete()

删除任务切换时要执行的函数

taskDeleteHookAdd()

增加任务删除时调用的函数

taskDeleteHookDelete()

删除任务删除时要执行的函数

任何代码或者数据中的错误都有可能导致硬件的异常状态,那些非法的指令、错误的总线或者地址访问,被零除等等的错误都会产生异常。所有的异常都会被VxWorks的异常处理包所捕获。默认情况下,异常处理会将引起异常的任务挂起,并且保存异常出现时任务的状态,而VxWorks核心和其他的任务都会继续运行。与此同时,关于异常的描述将会传递给Tornado的开发工具,以便用户的调试。

有些被多任务所调用的函数会访问全局或者静态变量。这种情况就是,几个任务都有自身的缓冲区,而他们同时会将这些缓冲区中的值赋给一个相同的全局变量。

为了解决这种情况,VxWorks提供了任务变量的工具,允许将四个字节的变量加入到任务上下文中,于是这些变量就会跟随着任务的切换而切换。这样会给任务切换时间增加几个微秒的时间。

VxWorks中可以使用同一个函数实现体生成多个任务。每个新生成的任务都会带有自己的任务堆栈和上下文。同时每次生成新的任务,都可以为函数传入不同的参数。

1.根任务:tUsrRoot

VxWorks内核引导后第一个创建的任务就是根任务tUsrRoot。这个任务的入口点在安装目录下的target/config/all/usrConfig.c中,这个任务在创建后会初始化大多数的VxWorks工具。他会创建记录任务、异常处理任务、网络任务和一个叫做tRlogind的守护任务。通常的情况下根任务在做完这些初始化之后都会结束并且被系统删除。在根任务中用户可以任意添加必要的初始化代码。

2.日志任务:tLogTask

日志任务(也称记录任务)为VxWorks系统中的其他模块提供了记录系统信息的功能,通过这个任务可以记录系统信息而不需要执行I/O操作。下面的表14-13中列出了用户可以使用的系统记录函数。

logMsg()

输出带有格式的登记信息

3.异常处理任务:tExcTask

异常处理任务执行VxWorks异常处理,这些函数都是在中断中不能执行但又非常重要的。所以这个任务必须在系统中具有最高的优先级,不能被挂起、不能被删除、不能改变优先级。

4.网络任务:tNetTask

网络守护任务处理VxWorks系统中任务级的网络的请求。

5.目标机代理任务:tWdbTask

如果目标机代理设置为运行在任务方式下,系统会生成tWdbTask任务。这个任务负责主机与目标机的通信,所有调试信息都会通过目标机服务器传给这个任务。

6.可选的任务

1)目标机shell任务:tShell

2)远程用户登陆响应任务:tRlogind

3)Telnet用户登陆响应任务:tTelnetd

4)RPC服务任务:tPortmapd

 

对于任务来说,任务间的通信交流是必不可少的。任务间的通信允许相互独立的任务完成协作的工作。为了方便的完成任务的通信,VxWorks为用户提供了相当多而且灵活的通信机制,通过使用这些手段任务可以轻松的完成复杂的通信任务。基本的VxWorks提供了五种通信机制:

 简单的数据共享,共享内存;

 简单的互斥和同步机制,信号量;

 任务间传输消息所使用的消息队列和管道;

 为网络间任务的通信而提供的网络插口(Socket)和远程进程调用;

 用于处理异常的标志。

VxWorks的可选件VxMP中,系统还提供了多CPU之间共享内存、信号量、消息队列、数据库等机制,使多CPU之间协作变得简单方便。

这是最简单的共享内存方式,通过访问相同的数据结构体,任务之间可以轻易的共享数据以及控制信息。由于VxWorks的所有任务都使用单一地址空间,共享数据并不会增加系统的负担,从而使这种方式成为VxWorks中最为简单的数据共享方式。不同的任务都可以直接访问全局变量、队列、环形队列、链表、指针等,如图14.7所示。

访问共享数据

访问共享数据

访问共享数据

共享数据

 

 

任务1

任务2

任务3

任务

内存

 

 

 

 

 

 

 


1.中断锁以及中断延迟

在所有的互斥的方法中,中断锁的作用域最小,功能却最强。中断锁可以使中断处理程序不被打断,使用了中断锁之后任何中断处理或者任务都不会打断中断锁控制中的代码。int lock=intLock();    ./*禁止中断的程序部分*/    intUnlock(lock);

2.优先级锁及其延迟

一个任务使用了优先级锁之后,除了中断之外没有任何任务可以打断这个任务的执行。taskLock();    ./*禁止抢占的程序部分*/    taskUnlock();

1.二进制信号量

2.互斥信号量

3.计数信号量

semFlush()

使所有等待指定信号量的任务获得信号量

当一个信号量创建的时候,就已经为其指定了队列的模式。用户可以指定优先级模式或者先进先出模式。使用基于优先级的信号量,会使高优先级的任务优先获得信号量;使用先进先出模式的信号量,系统将对所有任务一视同仁。

5.互斥

6.同步

7.优先级反转

在互斥信号量中,有选项SEM_INVERSION_SAFE,通过这个选项可以开启优先级继承。

msgQCreat()函数用于创建并初始化一个消息队列,通过这个函数的参数,可以指定消息队列所容纳的消息数目和长度以及消息队列的类型。VxWorks为消息队列提供了两种优先级类别的消息,普通消息(MSG_PRI_NORMAL)和紧急消息(MSG_PRI_URGENT)。

从函数的定义上来看,msgQSend()和msgQReceive()都可以设置超时参数。对于发送消息,超时的含义是,在规定的时间里消息队列没有可用的空间接纳新的消息。而对于接收消息,超时的含义是,在规定的时间里消息队列没有新的消息到达。虽然机理不同,两者同样会引发超时错误。

管道是消息队列的替代品,与消息队列不同的是,管道使用了VxWorks系统的I/O系统。作为一个I/O设备,管道提供了一个消息队列所不能提供的支持,即是对select的支持(select将会在后面介绍到)。通过使用select函数,任务可以同时等待不同的I/O设备的数据。

1.套接字

2.远程进程调用

信号可以异步的改变任务的控制流程。在实际操作中,中断服务程序或者任务向指定的任务发送信号,接收到信号的任务立即挂起当前执行的线程,在下一次调度执行的时候执行指定的信号处理程序。

VxWorks为定时功能提供了看门狗定时器机制。这个机制允许在一定时间延迟之后执行一段特定的函数代码。在系统内部,看门狗定时器是作为系统时钟的一部分来维护的。也就是说相当于系统时钟在给定的时间后会给出中断,而看门狗定时器指定的程序则是挂在这个中断上的中断服务程序,由于挂在系统时钟上可以保证了精确的定时。

void wdogRoutine()

{

       semGive(semId_Task2);//释放执行任务所需的信号量

       semGive(semId_Task1);

       wdStart(wdogID, sysClkRateGet(),(FUNCPTR)wdogRoutine,0);

}

VxWorks提供了intConnect()函数实现这个功能,通过这个函数可以将用户函数与中断相关联。事实中的中断处理程序并不是简简单单的C函数,在函数intConnect()中不仅保存当前寄存器状态以及其中正在执行的代码,而且为被调用函数的参数建立了一个堆栈入口,最后调用连接在中断上的函数。中断处理完成后,从被调用的函数返回时,intConnect()函数恢复寄存器和堆栈,并退出中断。

所有中断程序都使用相同的中断堆栈。这个堆栈是由系统启动时根据指定的配置参数来定位和初始化的。为了能在最糟糕的情况下处理中断嵌套。必须分配足够大的中断堆栈空间。

在开发过程中,使用checkStack()函数可以观察如何关闭中断堆栈以及中断服务程序如何逐渐地占用堆栈空间。

虽然中断服务程序可以连接到普通的C函数,在编写这个被调用的C函数时,还是有很多限制。在这个被调用的函数中,不能执行过多的I/O操作、不可以获取信号量、不可以分配内存。像printf()、malloc()、semTake()函数都是不可以使用的,但是可以使用semGive()、logMsg()、msgQSend()以及bcopy()函数。

同时为了给中断服务程序提供输出功能,VxWorks中提供了logLib,这个库中的函数允许系统任务打印文本信息,它是中断服务程序中最常用的输出手段。在上一节例子中的logMsg()函数就是这个库中的。

对于中断服务程序来说,挂起是不可能的,因为中断服务程序是没有可挂起的上下文,系统也就没有安全可靠的资源来处理异常。基于这个理由,VxWorks使用了另一种方法替代任务的挂起,那就是在系统低端内存的特定区域存储引发错误的异常的描述,同时执行系统重启。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】彻底理解cookie,session,token

转自:https://zhuanlan.zhihu.com/p/63061864 彻底理解cookie,session,token 发展史 1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏…

四年级信息技术认识计算机,四年级信息技术第三课信息工具知多少

一、教学目标:1、了解信息工具有哪些;2、认识电脑的组成;了解计算机硬件和软件的概念;3、学习开机、关机的步骤。4、建立对计算机的感性认识,培养学生学习、使用计算机的兴趣。二、教学重点:知道电脑是信息…

坐标系统概念

作者:江帆 3推荐一:需要用到的几个基本概念-------- 球面坐标系 1. 几个常涉及到的名词的中英文对照:地形面(Topography);大地水准面(Geoid);参考椭球面(Referen…

VxWorks概念

VxWorks操作系统的集成环境叫Tornado。Tornado集成环境提供了高效明晰的图形化的实时应用开发平台,它包括一套完整的面向嵌入式系统的开发和调测工具。Tornado环境采用主机-目标机交*开发模型,应用程序在主机的Windows环境下编译链接生成可执…

【转】c#数字图像处理(一)Bitmap类、 Bitmapdata类和 Graphics类

转自:https://www.cnblogs.com/dearzhoubi/p/8553763.html Bitmap类、 Bitmapdata类和 Graphics类是C#图像处理中最重要的3个类,如果要用C# 进行图像处理,就一定要掌握它们。 1.1 Bitmap类 Bitmap对象封装了GDI中的一个位图,此位图由图形图像及其属性的像素数据组成…

单片机与PC机一样都是计算机,51单片机与PC机通信资料

《51单片机与PC机通信资料》由会员分享,可在线阅读,更多相关《51单片机与PC机通信资料(14页珍藏版)》请在人人文库网上搜索。1、专业综合实习报告专 业: 电子信息工程 年 级: 2013级 指导教师: 学 生: 目录…

VB6:通过ADO访问Oracle存储过程返回的结果集

微软的MDAC中oledb for oracle 驱动——对过程参数:估计:位置绑定 该驱动最新支持到Oracle8i的水平,且不再更新了使用该驱动。只能使用ODBC的存储过程调用方式: "{call procename (?,?,....)}"只能支持返回一个记录集…

【转】c#数字图像处理(二)彩色图像灰度化,灰度图像二值化

转自:https://www.cnblogs.com/dearzhoubi/p/8571652.html 为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上得到验证的算法,很容易移 植到彩色图像上。 24位彩色图像每个像素用3个字节表示,每个字节对应着R、G、B分量的亮度(红、绿…

400呼叫中心服务器,400电话呼叫中心服务新模式

呼叫中心模式也很多种,但是以400电话呼叫中心的新服务模式受到了各行各业的关注。现在企业为了提升自己的形象以及办事效率,纷纷办理400电话,对于400电话呼叫中心这一模式也开始积极采用。采用400电话呼叫中心模式也是有其道理的,…

ASP.NET开发安全问题

ASP.NET开发安全问题 前言:之所以想到要写ASP.NET安全问题的文章,是有感于自己的一些经历。想当初自己学习ASP.NET的时候,到处找有关安全方面的文章,当时发现很多文章指示蜻蜓点水的告诉我怎么用,如安全的主要问题有哪…

互斥信号量和二进制信号量

互斥信号量和二进制信号量的区别 互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。 二进制信号量,一个任务申请成功后,可以由另一个任务释放。 二进制信号量实现任务互斥&am…

【转】c#数字图像处理(三)灰度直方图

转自:https://www.cnblogs.com/dearzhoubi/p/8621804.html 灰度直方图是灰度的函数,描述的是图像中具有该灰度级的像素的个数。如果用直角坐标系来表示,则它的横坐标是灰度级,纵坐标是该灰度出现的概率(像素的个数)。 using System; using System.Collections.Gener…

电梯门禁系统服务器一般在哪,别被吓住了,电梯门禁(梯控)安装其实并不难...

电梯门禁又称梯控,主要用于对电梯的出入权限进入控制,只有授权卡在读卡器刷过后,才能到达指定楼层。梯控的使用越来越普遍了,很多人觉得梯控很神秘,很高不可攀,其实说到底它不过是门禁的一种,只…

调用Microsoft.Jet.OLEDB.4.0需要MDAC2.7支持

asp.net进行Excel导入时需要调用Microsoft.Jet.OLEDB.4.0 strConn "ProviderMicrosoft.Jet.OLEDB.4.0;Data Source" AimFile ";Extended PropertiesExcel 8.0;"; 需要MDAC (Microsoft Data Access Components) 2.7 或更高版本才能支持. 转载于:https://…

获得系统中某个进程的cpu使用率

列举所有进程的CPU占用率) typedef struct _THREAD_INFO { LARGE_INTEGER CreateTime; DWORD dwUnknown1; DWORD dwStartAddress; DWORD StartEIP; DWORD dwOwnerPID; DWORD dwThreadId; DWORD dwC…

【转】c#数字图像处理(四)线性点运算

转自:https://www.cnblogs.com/dearzhoubi/p/8622325.html 灰度图像的点运算可分为线性点运算和非线性点运算两种。 4.1线性点运算定义 线性点运算就是输出灰度级与输入灰度级呈线性关系的点运算。在这种情况下,灰度变换函数的形式为: g(x, y)pf(x,y)L 其中 f(x,…

工作人员做好项目协调服务器,项目团队协作做好三件事

原标题: 项目团队协作做好三件事大家也许在小时候就听过三个和尚的故事:当庙里有一个和尚时,他一切自己做主,做得很自在;当庙里有两个和尚时,他们通过协商可以自觉地进行分工合作,同样做的不错;可当庙里来了…

给vc6插上翅膀

最重要的当然是VC助手了。。我比较喜欢低版本的Visual.Assist.v6.0.0.1079.zip,环保类型的 但无奈我的vs2005也想使用这个插件,所以我选择了VisualAssistXv10,目前装的是Visual.Assist.X.10.4.1626.0 以前还用过一些版本很奇怪的,…

vxworks 调式

1,boot操作相关 串口命令行重启回车进入boot: 查看boot版本:v 更新: c 升级设备: w 运行: g 2, 代码: 2.1添加命令行: DEFUN, install_element 2.2 VxWorks使用 i:查看任务; memShow:查看内存情况; tt&#…

【转】[程序集清单定义与程序集引用不匹配]分析及解决

转自:https://www.cnblogs.com/shuangzimuchangzhu/p/8572817.html 什么是程序集清单(Assembly Manifest)? 我们知道,在.net中。程序是以程序集为单位进行打包的,通常一个.exe文件或一个.dll文件就是一个程序集。程序集一般包含了以下几个部…