admin管理员组

文章数量:1630563

Vxworks学习(一)_记录

  • VxWorks简介
    • 一、多任务
      • 1.1 任务状态
      • 1.2 Wind任务调度
      • 1.3 任务控制
        • 1. 任务创建函数:
        • 2. 任务删除
        • 3. 任务控制
        • 4. 任务拓展函数
        • 5. 任务错误errno
        • 6. 任务异常处理
        • 7. 共享代码和重入
  • 二、任务间通信
    • 2.1 互斥办法
    • 2.2 信号量
      • 2.2.1 二进制信号量
      • 2.2.2 互斥信号量
      • 2.2.3 计数信号量
    • 2.3 注意:优先级倒置
    • 2.4 消息队列
    • 2.5 管道
    • 2.6 任务间网络通信
    • 2.7 信号
    • 2.8 看门狗定时器

VxWorks简介

学习Vxworks之前希望读者已经具备计算机网络、操作系统、C/C++、网络通信等基础知识。建议阅读CSAPP,打好基础。
Vxworks为美国风河公司推出的高性能实时操作系统,现已广泛应用于各类大型项目,同时Tplink等公司也应用Vxworks作为某些路由器的操作系统。
实时性在计算机中分为强实时软实时,vx所支持的为强实时,Linux普遍为软实时。
在一个实时操作系统之中,最关注的是每个任务在多长时间内可以完成。简单地说,实时和分时操作系统最大的不同在于 **时限(deadline)**这个概念。它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。软实时系统的时限是一个柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重,例如在网络中仅仅是轻微地降低了系统的吞吐量。
声明本学习记录为笔者的学习记录笔记,其中大量借鉴了多本已出版书籍与网络资料,并会在文章末尾注明出处,同时笔者无虚拟机镜像。

一、多任务

现代实时系统是在多任务和任务间通信的基础上建立起来的。一个多任务的环境允许将实时应用构造成一组独立的任务,每个任务拥有各自的线程和一套系统资源。为了协调任务间的行为,任务间的通信设备允许这些任务通过同步和通信操作协调各自的活动。在VxWorks 操作系统中,任务间通信设备包括信号量、消息队列、管道以及网络套接字等设备。
在实时系统中,处理中断是另一个主要功能,这是因为中断是将外部事件通知系统的重要方式。为了能得到较快的中断响应,VxWorks操作系统里中断服务程序(ISR)在一个专门的上下文中执行,是处于任务的上下文之外。
Vxworks实时内核Wind提供了基本的多任务环境,并提供了相应的调度算法。每个任务均具备自己的上下文,上下文均保存在任务控制块TCB中。其中TCB包括以下内容:
注意Vxworks系统是支持虚拟内存的。

1.1 任务状态

Vxworks任务状态表如下:

1.2 Wind任务调度

Wind内核的默认算法为基于优先级的抢占式调度算法,同时也支持RR调度算法,两种算法均依赖任务优先级。Wind内核中有256种优先级,0-255,0为最高级。函数如下:

1.基于优先级的抢占式任务调度
字面理解,优先级高的任务会掠夺CPU资源进行执行,低的任务将被掠夺。
优点:紧急任务可以立刻执行。
缺点:当多个优先级相同的任务共享一个CPU时,若某个任务永不阻塞,它将独占CPU,其他任务无法执行。任务调度会产生上下文切换,频繁掠夺会导致上下文切换造成的资源浪费。
由此引出轮转调度算法
2.轮转调度算法(RR)
平均使用CPU,相同优先级任务获得相同CPU处理时间,当一个时间片用完,自愿放弃对CPU的使用,进行上下文切换。
==注意:==若在轮转调度中,某个任务被高优先级任务抢占,则保留该任务的时间片剩余时间,在高优先级任务执行完毕后,恢复低优先级任务执行并用完用于时间片。
3.抢占上锁
taskLock()、taskUnlock(),可以禁止内核调度。若某个任务开启了禁止调度,却在执行中被阻塞和挂起,内核有资格执行调度,选择高优先级任务执行,当该任务解除阻塞或挂起时,禁止抢占将再次生效。

注意: 应用程序的优先级应设置在 100-250之间,驱动程序优先级位于 51-99。

1.3 任务控制

1. 任务创建函数:
id = taskSpawn(name, priority, options, stacksize, main, arg1, arg10);
taskInit();
taskActive();
//id 为4个字节 int
//name: 任务名
//stacksize:任务堆栈
//options:任务选项
//main:入口函数地址
//arg10:传给入口函数的启动参数

//示例:
tid = taskSpawn("tMyTask", 90, VX_FP_TASK, 20000, myFunc, 2387, 0, 0
0, 0, 0, 0, 0, 0, 0);

2. 任务删除
exit();//终止任务调用,释放内存
taskDelete();//终止指定任务,释放内存
taskSafe();//保护调用任务免于删除
taskUnsafe();//解除任务删除保护

注意删除任务之前,应先释放该任务所占有的共享资源。也需要注意,若某个任务需要访问临界区,若该任务释放时,同时对其持有的信号量进行删除,这将导致其他任务无法对该临界区进行访问。此时应调用taskSafe()保护该任务被删除。

3. 任务控制

4. 任务拓展函数

5. 任务错误errno

操作系统中的潜在的全局变量errno是已被定义的,可直接与操作系统相连接的应用代码所应用,上下文切换时,errno同时被保存。

6. 任务异常处理

对于操作系统来说,CSAPP讲到异常分为中断、陷阱、异常,同时中断也分为硬件中断与软件中断,通常硬件中断是异步的,即不可预料的;软件中断是同步的,即是可预料的,Debug就是通过陷阱实现的。

7. 共享代码和重入
  1. 代码共享必须是可重入的,多个任务同时调用一个函数不发生

本文标签: 通信VxWorks