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