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 LibraryINCLUDE_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

ClocksINCLUDE_POSIX_CLOCKSINCLUDE_POSIX_CLOCKS
Diretory and file utilitiesINCLUDE_POSIX_DIRLIBN/A
ftruncate()INCLUDE_POSIX_FTRUNCN/A
Memory lockingINCLUDE_POSIX_MEMN/A
Memory managementN/AINLUCE_RTP
Memory-mapped filesN/AINCLUDE_POSIX_MAPPED_FILES
Shared Memory objectsN/A

INCLUDE_POSIX_MAPPED_FILES

INCLUDE_POSIX_SHM

Message queuesINCLUDE_POSIX_MQINCLUDE_POSIX_MQ
pthreadsINCLUDE_POSIX_THREADS

INCLUDE_POSIX_CLOCKS

INCLUDE_POSIX_PTHREAD_SCHEDULE

INCLUDE_PTHREAD_CPUTIME

Process Scheduling APIINCLUDE_POSIX_SCHEDN/A
SemaphoresINCLUDE_POSIX_SEMINCLUDE_POSIX_SEM
SignalsINCLUDE_POSIX_SIGNALSN/A
TimersINCLUDE_POSIX_TIMERSINCLUDE_POSIX_TIMERS
TraceN/AINCLUDE_POSIX_TRACE
POSIX_PSE52 supportN/ABUNDLE_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.hasynchornous input and output
 assert.hverify 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.hdata 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标准。

 

 

转载于:https://www.cnblogs.com/C-Sharp2/p/5923872.html

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值