POSIX能力

VxWorks扩展了POSIX,为了移植,VxWorks提供了额外的POSIX接口作为可选组件。VxWorks实现了POSIX 1003.1(POSIX .1)一些传统接口以及POSIX.1可选功能中的一些实时接口。

POSIX和实时系统

VxWorks提供了很多POSIX兼容的API,但并非全部POSIX API都适合嵌入式和实时系统,或完全兼容VxWorks操作系统。因此,VxWorks在少量情况下强加了以下很小的限制来满足实时系统和VxWorks兼容。

  • 交换内存到磁盘不适合实时系统,VxWorks没有提供这种能力。它提供了POSIX的页锁定功能方便移植到VxWorks。这函数并没有其它用途--在VxWorks中页总是被锁定。
  • VxWorks任务在系统层被调度,进程本身不被调度。因而,POSIX访问函数允许2种植(PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS),VxWorks只实现了系统层范围。

配置VxWorks使用POSIX能力

默认配置并不包含POSIX支持。BUNDLE_POSIX捆绑组件为内核空间提供了通用POSIX的支持。如果要细粒度控制POSIX的支持,可以选择单个的组件。

注意:对于内核空间和用户空间的POSIX支持的组件是不同的。

POSIX的组件配置

下表提供了支持内核空间的POSIX的独立组件

POSIX能力 内核要求的组件 进程要求的VxWorks组件
Standard C Library INCLUDE_ANSI_*组件 Dinkum C 类库(libc)

Asynchornous I/O with

system driver

INCLUDE_POSIX_AIO

INCLUDE_POSIX_AIO_SYSDRV

INCLUDE_PIPES

INCLUDE_POSIX_CLOCKS

INCLUDE_POSIX_TIMERS

Clocks INCLUDE_POSIX_CLOCKS INCLUDE_POSIX_CLOCKS
Diretory and file utilities INCLUDE_POSIX_DIRLIB N/A
ftruncate() INCLUDE_POSIX_FTRUNC N/A
Memory locking INCLUDE_POSIX_MEM N/A
Memory management N/A INLUCE_RTP
Memory-mapped files N/A INCLUDE_POSIX_MAPPED_FILES
Shared Memory objects N/A

INCLUDE_POSIX_MAPPED_FILES

INCLUDE_POSIX_SHM

Message queues INCLUDE_POSIX_MQ INCLUDE_POSIX_MQ
pthreads INCLUDE_POSIX_THREADS

INCLUDE_POSIX_CLOCKS

INCLUDE_POSIX_PTHREAD_SCHEDULE

INCLUDE_PTHREAD_CPUTIME

Process Scheduling API INCLUDE_POSIX_SCHED N/A
Semaphores INCLUDE_POSIX_SEM INCLUDE_POSIX_SEM
Signals INCLUDE_POSIX_SIGNALS N/A
Timers INCLUDE_POSIX_TIMERS INCLUDE_POSIX_TIMERS
Trace N/A INCLUDE_POSIX_TRACE
POSIX_PSE52 support N/A BUNDLE_RTP_POSIX_PSE52

通用POSIX支持

VxWorks提供了大多数POSIX兼容类库。这些类库如下

 功能  类库
 Asynchronous I/O   aioPxLib 
 Buffer manipulation  bLib
 Clock facility  clockLib
 Direcotry handling  dirLib
 Environment handling  C library
 File duplication  iosLib
 File management  fxPxLib and ioLib
 I/O functions  ioLib
 Options handling  getopt
 POSIX message queues   mqPxLib
 POSIX semaphores  semPxLib
 POSIX timers  timerLib
 POSIX threads  pthreadLib
 Standard I/O and some ANSI  C library
 Math  C library
 Memory allocation  memLib and memPartLib
 Network / Socket APIs  network libraries
 String manipulation  C library
 Trace facility  pxTraceLib

注意:风河公司建议不要同时使用POSIX类库和类似功能的本地VxWorks类库。这样做将导致不可预期的行为。

在运行时检查是否支持POSIX

POSIX应用程序可以在运行时使用以下API来判断POSIX支持的状态:

  • sysconf函数返回当前可配置系统变量的值,运行应用程序判断是否支持可选特性及系统限制的精确值。
  • confstr函数返回与可用系统相关的字符串这个版本,confstr只返回系统默认路径的字符串。

uname函数让应用程序获得真正运行的系统信息。VxWorks提供的标识消息是系统名称VxWorks,系统的网络名称,系统的发布版本、机器名称(BSP模块),架构的大小端,内核版本,处理器名称(CPU家族),BSP的修订版本和系统构建日期。

POSIX的头文件

POSIX 1003.1标准定义了一系列头文件作为应用程序开发环境的一部分。用户端的开发环境比内核的开发环境有更多的POSIX头文件,它们的内容也比内核的头文件与POSIX标准更一致。

内核环境的头文件

 Header File  Description
 aio.h asynchornous input and output
 assert.h verify program assertion
 ctype.h  character types
 dirent.h  format of directory entries
 errno.h  system error Numbers 
 fcntl.h  file control options
 limits.h  implementation-defined constants
 locate.h  category macros
 math.h  mathematical declarations
 mqueue.h  message queues
 pthread.h  pthreads
 sched.h  execution scheduling
 semaphore.h  semaphores
 setjmp.h  stack environment declarations
 signal.h  signals
 stdio.h  standard buffered input/output
 stdlib.h  standard library dfinitions
 string.h  string operations
 sys/mman.h  memory management declarations
 sys/resource.h   definitions for XSI resource operations 
 sys/stat.h  data returned by the stat() function
 sys/un.h  definitions for UNIX domain socket
 time.h  time types 
 trace.h  trace facility
 unistd.h  standard symbolic constants and types 
 utime.h  access and modification times structure 
 sys/typs.h data types
   

POSIX命名空间

用户模式的RTP进程可用POSIX命名空间。

POSIX Clocks 和 Timers

VxWorks提供了POSIX 1003.1b标准的 Clocks和Timer接口。

POSIX Clocks

POSIX定义了各种软(虚拟)时钟,作为CLOCK_REALTIME时钟,CLOCK_MONOTONIC时钟,处理CPU-time时钟及线程的CPU-time的时钟。这些时钟都使用一个系统硬件时钟。real-time和monotonic时钟是系统级时钟,因此支持内核和进程。CPU-time时钟在VxWorks中不支持。线程CPU-time时钟只支持RTP进程。POSIX线程可以为它的进程使用real-time时钟、monotonic时钟和线程CPU-time时钟。

real-time时钟只能被内核复位。monotonic时钟不能被复位,它表示系统从启动到现在流逝了多少时间。real-time时钟可以被用CLOCK_REALTIME作为clock_id参数使用的POSIX时钟和定时器函数访问。real-time可以在运行时被复位,通过从内核中调用clock_settime函数(不是进程中)。

monotonic时钟可以通过使用CLOCK_MONOTONIC参数作为clock_id来调用clock_gettime函数来访问。monotonic时钟指示了系统从启动到现在使用了多少时间,即,该函数的返回值是系统启动到现在的秒和纳秒数。monotonic不能被复位。因此,应用程序可以依赖于这样的事实:可以对时间间隔的测量,来证明系统没有被clock_settime()篡改。

CLOCK_REALTIEM和CLOCK_MONOTONIC定义在time.h。

POSIX时钟函数

 Routine   Description
 clock_getres()  得到时钟分辨率 (CLOCK_REALTIME和CLOCK_MONOTONIC) 
 clock_setres()  设置时钟分辨率。(废弃,是为了保留向前兼容)
 clock_gettime()   得到当前时间 (CLOCK_REALTIME和CLOCK_MONOTONIC)
 clock_settime() 为CLOCK_REALTIME设置指定时间(不能用于CLOCK_MONOTONIC怕;不支持在内核中的线程CPU-time时钟)

为了包含clockLib类库,配置INCLUDE_POSIX_CLOCKS组件。对于线程CPU-time时钟,使用INCLUDE_POSIX_PTHREAD_SCHEDULER和INCLUDE_POSIX_THREAD_CPUTIME组件。

POSIX定时器

POSIX定时器提供了任务在将来某个时候通知本身的能力。提供了创建,设置和删除定时器的函数。

定时器基于时钟。在内核中,CLOCK_REALTIME和CLOCK_MONOTONIC时钟支持定时器。在进程中,除了这2个,还支持线程CPU-time时钟(CLOCK_THREAD_CPUTIME_ID时钟)。

当定时器触发,默认signal,SIGALRM,被发送给任务。使用sigaction函数来安装signal处理函数。VxWorks的timerLib类库包含了一系列以下函数:timer_open(),timer_close(),tiemr_cancel(),timer_connect()和timer_unlink()。这些函数比使用POSIX定时器更容易、更强大。

 Routine   Description
 timer_create()   使用指定的时钟分配一个定时器基于(CLOCK_REALTIME或CLOCK_MONOTONIC)
 timer_delete()  删除前面创建的定时器
 timer_open()  打开命名的定时器。VxWorks特定的POSIX扩展函数
 timer_close()  关闭命名的定时器。VxWorks的扩展函数
 timer_gettime()   在过期和重新加载之前得到剩余时间。
 timer_getoverun()   返回过期溢出定时器
 timer_settime()  Set the time until the next expiration and arm timer。
 timer_canncel()  取消定时器
 timer_connect()  连接用户函数到定时器信号。
 timer_unlink() 解除命名定时器的连接。
 nanosleep() 挂起当前线程(任务)直到时间间隔用完。
 sleep()  延迟一定数量的时间
 alarm()  为signal提交设置一个报警时钟。

注意:在VxWorks中,不是用"/"开头的命名的定时器是私有的,不能从其它进程访问。以"/"开始命名的定时器是公开的,其它进程可以访问。

POSIX的nanosleep提供了秒或毫秒的睡眠和延迟,而不是VxWorks的taskDelay的tick数,但是两者的进度是一样的,由时钟率决定,只是单位不同而已。

要使用timerLib类库,必须配置INCLUDE_POSIX_TIMERS组件。

POSIX异步I/O (AIO)

POSIX异步I/O函数由aioPxLib类库提供。VxWorks的AIO实现满足POSIX 1003.1标准。

VxWorks 6.9 内核编程指导之读书笔记 -- POSIX的更多相关文章

  1. VxWorks 6.9 内核编程指导之读书笔记 -- ISRs和Watchdog Timer

    中断服务程序 ISR 硬件中断处理是实时系统的关键,因为它是外部时间通知系统的方式. ISR亦称为中断处理函数,是对中断的正确响应.可以使用任何ISR连接到任何没有被VxWorks使用的中断上.当关联 ...

  2. VxWorks 6.9 内核编程指导之读书笔记 -- Singnals

    Signals 信号是操作系统用于异常处理和异步控制流的关键.在很多方面,信号相当于软件方面的硬件中的中断.操作系统产生的信号包括总线错误和浮点处理异常.信号也提供了API来管理和产生信号.在应用程序 ...

  3. VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)

    #1 什么是内核应用程序? #2 开发内核应用程序注意事项 什么是内核应用程序? 内核应用程序不同于RTP程序,它允许在内核态,与操作系统使用相同的地址空间.因此,它与操作系统会相互干扰.它可以编译成 ...

  4. VxWorks 6.9 内核编程指导之读书笔记 -- 多任务

    概述 VxWork系统任务 任务调度 任务创建和管理 任务的错误状态 任务异常处理 共享代码和重入 概述 现代实时操作系统是基于多任务和任务间通信的概念的.多任务环境运行一个实时进程RTP可以被作为一 ...

  5. VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Small-Footprint Configuration

    什么是Small-footprint? Small-footprint常见关键配置? 如何配置Small-footprint? 什么是Small-footprint? Small-footprint配 ...

  6. VxWorks 6.9 内核编程指导之读书笔记 -- 多任务(二)

    VxWorks的系统任务 VxWorks在引导时启动的系统任务依赖于配置,有些总是运行.任务集与VxWorks的基本配置相关,很少的任务常用于可选的组件. 注意:别挂起.删除或改变任何系统任务的优先级 ...

  7. VxWorks 6.9 内核编程指导之读书笔记 -- C++开发

    5.1 介绍 针对C++的VxWorks配置 C++头文件 使用C++启动任务 C和C++之前调用代码 C++编译器说明 在信号处理和ISR中使用C++ 下载C++编写的内核模块 C++编译器的不同 ...

  8. VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Kernel application (二)

    #1 内核对象的静态实例化 内核对象的静态实例化 任务的静态实例化 VX_TASK宏用来在编译时声明一个任务对象.该宏带有2个参数:任务名和栈大小.不像taskSpawn函数,任务名称可以是NULL. ...

  9. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

随机推荐

  1. 点击次数(thinkphp)

    protected function addHit($tbName, $id) { //定义变量:作为一个查询条件 $where = array( 'deleted' => 0, 'hidden ...

  2. 用python写makefile

    温馨提示:阅读本文的同学最好能了解makefile和python的编写规则. 不懂的同学能够先保存在收藏夹.以便日后查看. 事实上之前我一直非常懒,我不想了解makefile规则.由于在linux下开 ...

  3. android设置动态壁纸 (Wallpaper) 介绍

    当进入改壁纸的设置页面 但是还没有设置时 09-21 07:55:05.575: INFO/System.out(1337): service onCreate09-21 07:55:05.614: ...

  4. The sound of silence引发的关于互联网以及教育的利弊思考

    “茫茫人海里,人群跟著人群,我们无时无刻不感到孤寂.停下来让我们好好沟通吧,否则人类的关系将日形恶化,沦为新世纪科技的牺牲品” ------- Simon 说实话,我第一次看<毕业生>应该 ...

  5. zoj 3627 Treasure Hunt II (贪心)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:zoj-3627 题意 直线上有n个城市, 第i个城市和i+1个城市是相邻的.  每个城市都有vi的金币.   ...

  6. 开机就提示“请安装TCP/IP协议,error=10106”的解决的方法

    一.问题描写叙述: 今天开机时提示"请安装TCP/IP协议,error=10106",现象是popo,qq等登录不了,IE浏览器等连不了网,使用ping命令ping其它机器和路由器 ...

  7. C++基础之预处理命令

    目录 概述——对预处理命令的理解 预处理命令的处理时间 C++中主要的预处理命令 宏定义 “文件包含”处理 选择编译 概述 使用C++的预处理命令可以提高程序的可维护性,有利于程序员以更加方便和快捷的 ...

  8. MySQL Order By实现原理分析和Filesort优化

    http://blog.csdn.net/hguisu/article/category/796963

  9. 终端I/O之规范模式

    规范模式很简单:发一个读请求,输入完一行后,终端驱动程序即刻返回.下列几个条件都会造成读返回: 所要求的字节数已经读到时,读返回.无需读一个完整的行.如果都了部分行,也不会丢失任何信息,下一次读从前一 ...

  10. 非常详细的 Docker 学习笔记

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...