VxWorks 6.9 内核编程指导之读书笔记 -- POSIX

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标准。

上一篇:程序调试手段之gdb, vxworks shell


下一篇:VxWorks 6.9 内核编程指导之读书笔记 -- ISRs和Watchdog Timer