1. POSIX 渊源

可移植操作系统接口,POSIX 标准定义了操作系统(很多时候针对的是类 Unix 操作系统)应该为应用程序提供的接口标准,从而保证了应用程序在源码层次的可移植性,如今主流的 Linux 系统都做到了兼容 POSIX 标准。由此可见,可移植性是 POSIX 的一大特性,如果一个操作系统拟合了POSIX系统,就将可以将自己的 POSIX 应用轻松迁移到其他同样符合POSIX标准的系统平台,并且可以获得大量的 POSIX 应用,丰富自己系统的应用生态。

POSIX 为了提供不同层级的RTOS能力,划定了 PSE51, PSE52, PSE53, PSE54 共四个级别;分别对应了四种操作系统。

1、Minimal Real-time System Profile IEEE Std 1003.13 PSE51,基础 RTOS

2、Real-time Controller Profile IEEE Std 1003.13 PSE52,带有简单的文件系统…等

3、Dedicated Real-time Profile IEEE Std 1003.13 PSE53,拥有网络功能…等

4、Multi-Purpose Real-time Profile IEEE Std 1003.13 PSE54,完整的文件系统,带有 Shell 组件…等

由于标准的制定是随着时间发展而不断更新的,PSE51, 52, 53, 54 的标准也随着 MCU,MPU 芯片产业的发展,不断增强的芯片功能和性能使得这些标准所对应的四种操作系统的界限而越显模糊。在 RT-Thread 中也依靠自身的组件内容,提供了多种标准的部分内容,为不同的 POSIX 应用提供可供在 RTOS 系统上使用的软件。

2. POSIX 在 RT-Thread 中支持情况

RT-Thread 针对 PSE51 的标准规定的头文件及对应接口,提供了大部分接口。除此之外,我们还提供了更加完整的文件系统的接口,以及基于我们 SAL 组件的网络接口。这为 POSIX 的应用迁移打下了基础,可以使得较复杂的 POSIX 应用也可以经过小部分修改就可以在 RT-Thread 上运行。

  • POSIX FILE 相关接口,包含了文件系统的内容,接口比较丰富;标准 I/O 接口,Poll / Select 等较复杂的功能也已经支持

  • Delay 相关接口

  • Clock 相关接口,对拥有 RTC 硬件,或者没有使用 RTC 硬件的设备都有对应的功能实现

  • Timer 相关接口,已经对接到 RT-Thread 的定时器接口,实现对应的函数

  • Pthread 相关接口,在多任务编程中使用很广泛

  • Dynamic 动态模块

  • POSIX 的 标准 IPC 接口 :pipe ,message,semaphore 等函数

通过上面灵活的配置项,开发者可以启用对应的功能来添加该类函数的支持;这对与同样使用功能宏来标识一些函数功能的 POSIX 接口来说十分类似,在该界面可以配置对应的 POSIX 函数支持。

3. POSIX 的实现简介

由于 RT-Thread 作为一个可以兼容多种开发方式的操作系统,针对 ARMCC,ARMCLANG,IARCC,GCC 现阶段占比比较多的开发工具链都做了对应的适配。所以,简单描述一下RT-Thread 在做适配时,针对不同的编译平台所做得操作,以及对应的关系图。

由于在不同的平台开发所使用的编译工具链不一致;所以在实现时,RT-Thread 区分了三个概念:广义的 POSIX狭隘的 POSIX编译器配平层;下面结合关系图,描述一下对应的概念:

  • 广义的 POSIX ,即 POSIX 接口;这里面包含了一些关于 pthread, signal,  IPC 等函数以及 C 库的相关内容;

  • 狭隘的 POSIX,即不是 C 库标准提供以外的 POSIX 函数,例如 pthread 这些内容;

  • 编译器配平层,由 C 库相关提供的函数。由于不同编译平台对该内容的实现参差不齐,因此需要针对不同的编译平台增补这些函数。这也就是 “ 配平 ” 的由来。这块内容较多,且不同的编译工具链所支持的操作不一,因此在 POSIX 代码迁移时需要修改这里来解决对应的编译错误。

4. POSIX 在 RT-Thread 中使用方法

4.1 Pthread 接口

1、在 menuconfig 中打开 pthread ,设定支持得最大 pthread 数目

2、在用户代码中,即可使用 pthread.h, sche.h 这些 pthread 提供的头文件来编程

1#include <stdint.h>2#include <pthread.h>3#include <stdio.h>4#include <string.h>56#define NUM_THREADS 578static void *a_thread_func(void *num)9{
10    printf("arg = %li\n", (long)num);
11    return num;
12}
13
14int main(void)
15{
16    pthread_t new_th;
17    long i;
18    void *res;
19    int ret;
20
21    for (i = 1; i < NUM_THREADS + 1; i++) {
22        ret = pthread_create(&new_th, NULL, a_thread_func, (void *)i);
23
24        if (ret) {
25            fprintf(stderr, "pthread_create(): %s\n",
26                    strerror(ret));
27            return -1;
28        }
29
30        pthread_join(new_th, &res);
31
32        if ((long)res != i) {
33            printf("Test FAILED: Returned value did not match %li != %li",
34                   (long)res, i);
35            return -1;
36        }
37    }
38    printf("Test PASSED\n");
39    return 0;
40}
4.2 Timer 接口

1、在 menuconfig 中打开 timer 即可

2、在用户代码中,即可使用  这些 timer 提供的头文件来编程

1#include <sys/time.h>2#include <stdio.h>34int main(void)5{6    time_t sec;7    time_t ret;8    time_t timestamp = 1609459200;9    ret = time(&sec);
10
11    if(ret != sec)
12    {
13        return -1;
14    }
15    if(ret != timestamp)
16    {
17        return -1;
18    }
19    return 0;
20}
4.3 Net 接口

1、在 menuconfig 中打开 Enable BSD Socket I/O 就可以使用标准 Socket 进行编程

4.4 Filesystem 接口

1、在 menuconfig 中打开Enable POSIX file system and I/O 配置具体的 POSIX 函数接口

2、按照需求打开需要的功能,例如 设备I/O,AIO,MMAN 之类的功能

4.5 其他接口

其他接口也是一样,开打对应的 menuconfig 选项,即可使用对应头文件,及提供的函数来编程。整个过程不需要 rt-thread 的头文件参与,使编译出的代码运行在 RT-Thread 操作系统之上。

5. 注意事项

5.1 不同编译平台的兼容

在上一节,编译器配平层的存在解决了多组编译工具链不一致造成的问题;同时,也引入了一些在编写代码时需要注意的事项。这些注意事项是为了解决对应的编译错误。因为编译工具链有的允许头文件替换,有的不支持这些问题。RT-Thread 提供了一个相对轻便的解决办法:

为保证跨不同编译器、不同工具链的兼容性,建议用户应用层代码:

  • 使用 <sys/time.h> 代替 <time.h>

  • 使用 <sys/errno.h> 代替 <errno.h>

  • 使用 <sys/signal.h> 代替 <signal.h>

有使用 <time.h> 的引用逻辑的,修改为 <sys/time.h> 的方式来避免编译错误;其他两个也是类似的处理逻辑,拟合不同编译工具链的处理逻辑。

5.2 Net 接口

启用网络功能后,并不是所有的 BSD Socket 接口都支持,在 RT-Thread 中只实现了一部分函数。因此如果对应函数缺失,需要按照代码逻辑替换为基础的 Socket 接口来兼容原逻辑。完整的 BSD Socket 功能将持续优化以解决这个问题。

往期连载情况:

RT-Thread 4.1.0 特性解析之内核

RT-Thread v4.1.0 特性解析之 FAL 探秘

...

关注我们

爱我就给我点在看

点击 阅读原文”进入官网

RT-Thread 4.1.0 特性解析之LIBC与POSIX相关推荐

  1. Kubernetes v1.0特性解析

    kubernetes1.0刚刚发布,开源社区400多位贡献者一年的努力,多达14000多次的代码提交,最终达到了之前预计的milestone, 并意味着这个开源容器编排系统可以正式在生产环境使用,必将 ...

  2. GreenDao3.0新特性解析(配置、注解、加密)

    Greendao3.0release与7月6日发布,其中最主要的三大改变就是:1.换包名 2.实体注解 3.加密支持的优化 本文里面会遇到一些代码示例,就摘了官方文档和demo里的例子了,因为他们的例 ...

  3. 墨天轮访谈 | SelectDB 衣国垒:Apache Doris(incubating)1.0版本特性解析与未来规划

    分享嘉宾:衣国垒 Apache Doris Committer.SelectDB 联合创始人&CTO 整理:墨天轮社区 导读 大家好,我是来自Apache Doris社区的衣国垒,也是Sele ...

  4. 关于uIP的移植以及部分特性解析和勘误

    关于uIP的移植以及部分特性解析和勘误 关于嵌入式网络的领域,uIP是一个值得去学习的轻量级协议栈,在我的理解里,uIP具有如下特点. 1.封装性好 封装性好体现在uIP它能做到的网络协议栈的底层所做 ...

  5. 关于uIP移植以及部分特性解析和勘误

    关于uIP的移植以及部分特性解析和勘误 原文:http://www.cnblogs.com/CodeHXH/archive/2012/01/19/2327426.html 关于嵌入式网络的领域,uIP ...

  6. 1024 程序员节专题论坛来袭,权威解读 MindSpore、CANN 5.0 特性和 HCIA MDC 开发者认证...

    "授人以鱼不如授人以渔",一句古话中蕴含的发展真理,我们将其套用到如今炽手可热的 AI 领域之上会发现无比适用.2018 年,华为提出了普惠 AI 的概念,降低 AI 开发门槛,让 ...

  7. 【转】Silverlight 3 Beta 新特性解析(7)- Child Window和Shader Effect篇

    前提条件: 阅读本文之前请确认你已经安装了如下软件 Visual Studio 2008 (Express) SP1 Silverlight 3 Tools For Visual Studio Mic ...

  8. 数据结构特性解析 (四)LinkedList

    描述 LinkedList应该也是开发中比较常用的数据结构了,其基于链表数据结构实现,添加和删除效率相对比较高,而随机访问效率偏低 特点 1.LinkedList是双向不循环链表 通过查看链节点类: ...

  9. 数据结构特性解析 (二) ArrayList

    前言 ArrayList可能是Java中使用次数最多的数据结构了,因此了解其特性比较重要 描述 ArrayList是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长. 并且Ar ...

最新文章

  1. oracle删sequ_oracle删除指定用户下的表与Sequence | 学步园
  2. 运行webpack-dev-srerver 端口占用错误及解决办法
  3. 一文读懂JDK7,8,JD9的HashMap,HashTable,ConcurrentHashMap及他们的区别
  4. vector、map 内存释放
  5. 结构化日志:出错时你最想要的好朋友
  6. scrapy中自定义过滤规则以及start_urls不进过滤器的问题
  7. 突破验证,安装Media Player11.
  8. python和pandas有什么关系_python pandas效率到底如何?
  9. CRC全套~~~ 转载
  10. scapy获取ip_如何使用scapy从数据包中读取整个ip层和tcp层?
  11. Android应用自动更新功能代码实现
  12. 分析咪蒙1013篇文章,300多万字,她凭什么会火?
  13. 第四周-C语言 圆柱体表面积计算
  14. wp缩略图php,wordpress缩略图彻底解决方法,自动获取第一张图片缩略图
  15. Flutter开发:Another exception was thrown:Unable to load asset:…的解决方法
  16. 【Asan】工欲善其事必先利其器——AddressSanitizer
  17. 重新安装Windows应用商店
  18. pyecharts 画地图(热力图)(世界地图,省市地图,区县地图)
  19. 追踪算法MUSTer体验
  20. 7種解決方案修復請將磁片插入磁碟機

热门文章

  1. css 根据手机屏幕适应页面高度
  2. 学人工智能有前途吗?AI发展前景怎么样?
  3. 用 Dev-C++ 编写简单的走迷宫小游戏
  4. 跟小博老师一起学JSP ——EL表达式
  5. 一个nginx使用同一端口不同域名代理到不同网站
  6. MySQL 用户管理 - 添加用户、授权、删除用户
  7. java百度天气接口解析_Java调用天气接口(百度天气)解析返回的JSON数据
  8. 淘宝网前台应用性能优化实践
  9. Markdown教程--Markdown代码
  10. 如何将图片存进SQL数据库中以及从数据库读取照片(解决办法)