概述

可移植操作系统接口(POSIX)是由 IEEE Computer Society 制定的一系列标准,用于维护操作系统之间的兼容性。Zephyr 实现了由 IEEE 1003.1-2017 (也称为 POSIX-1.2017)规定的标准 POSIX API 的一个子集。

Zephyr 中的 POSIX 支持

Zephyr 中的 POSIX 支持

备注

本页不介绍 Zephyr 的 POSIX 架构,该架构用于将 Zephyr 作为原生应用运行在宿主操作系统之下,以实现原型设计、测试和诊断目的。

借助 Zephyr 提供的 POSIX 支持,现有的符合 POSIX 的应用可以移植到 Zephyr 内核上运行,从而利用 Zephyr 的特性与功能。此外,为符合 POSIX 而设计的库无需任何更改即可移植到基于 Zephyr 内核的应用中。

POSIX API 是一种日益流行的操作系统抽象层(OSAL),适用于 IoT 和嵌入式应用,Zephyr、AWS:FreeRTOS、TI-RTOS 和 NuttX 中都能看到这一点。

在 Zephyr 中支持 POSIX 的好处包括:

  • 为非嵌入式程序员(尤其是来自 Linux 的程序员)提供熟悉的 API

  • 支持复用(可移植性)基于 POSIX API 的现有库

  • 提供适用于小型(MCU)嵌入式系统的高效 API 子集

POSIX 子配置

虽然 Zephyr 支持运行多个 线程 (可能处于 SMP 配置中),并支持 虚拟内存与 MMU,但 Zephyr 的代码和数据通常共享一个公共地址空间,该地址空间被划分为多个独立的 内存域。Zephyr 内核可执行代码与应用可执行代码通常编译到同一个二进制产物中。从这个角度来看,Zephyr 应用可以视为在单个进程的上下文中运行。

虽然多用途操作系统(OS)提供完整的 POSIX 符合性,但像 Zephyr 这样的实时操作系统(RTOS)通常面向固定用途,硬件资源有限,用户交互也较少。在这类系统中,完整的 POSIX 符合性可能既不切实际,也没有必要。

因此,POSIX 在 IEEE 1003.13-2003 (也称为 POSIX.13-2003)中定义了以下 应用环境配置文件(AEP)。每个 AEP 都会在必需的 POSIX 系统接口 基础上逐步增加更多特性。

POSIX Application Environment Profiles (AEP)

POSIX 应用环境配置文件(AEP)

  • 最小实时系统配置文件(PSE51)

  • 实时控制器系统配置文件(PSE52)

  • 专用实时系统配置文件(PSE53)

  • 多用途实时系统(PSE54)

POSIX.13-2003 AEP 于 2003 年通过“功能单元”正式确定,但该规范现已失效(仅供参考)。尽管如此,其意图仍通过 选项 和 选项组 体现在 POSIX-1.2017 中。

更多信息请参阅 IEEE 1003.1-2017, Section E, Subprofiling Considerations。

Zephyr 中的 POSIX 应用

Zephyr 中的 POSIX 应用与 任何其他应用 一样构建,因此需要常见的 prj.conf、CMakeLists.txt 和源代码。例如,下面的应用使用了 nanosleep() 和 perror() 这两个 POSIX 函数。

Zephyr 中一个简单 POSIX 应用的 prj.conf
 CONFIG_POSIX_API=y
一个使用 Zephyr POSIX API 的简单应用
 #include <stddef.h>
 #include <stdio.h>
 #include <time.h>

 void megasleep(size_t megaseconds)
 {
     struct timespec ts = {
         .tv_sec = megaseconds * 1000000,
         .tv_nsec = 0,
     };

     printf("See you in a while!\n");
     if (nanosleep(&ts, NULL) == -1) {
         perror("nanosleep");
     }
 }

 int main()
 {
     megasleep(42);
     return 0;
 }

有关 POSIX 应用的更多示例,请参阅 POSIX 示例应用。

配置

与 Zephyr 中的大多数特性一样,POSIX 特性 高度可配置,但默认处于禁用状态。用户必须通过 Kconfig 选择显式启用 POSIX 选项。

子配置

启用下面某个 Kconfig 选项,即可快速配置预定义的 POSIX 子配置。

可根据需要通过 Kconfig 启用其他 POSIX 选项和选项组 (例如 CONFIG_POSIX_C_LIB_EXT=y)。进一步的微调可通过 其他 POSIX 相关的 Kconfig 选项 完成。

今后应把子配置、选项和选项组视为在 Zephyr 中配置 POSIX 的首选方式。

旧版

历史上,Zephyr 使用 CONFIG_POSIX_API 来配置一组 POSIX 特性,这组特性负担过重且规模一直在增长。

该选项现已冻结,可认为它等同于以下选项:

不过,CONFIG_POSIX_API 应被视为旧版选项,不应在新 Zephyr 应用中使用。