RT-Thread 4.1.0 特性解析之LIBC与POSIX

2023-05-16

1. POSIX 渊源

0e29a5d72daa5af524efb1dd15dadf5e.png

可移植操作系统接口,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 组件…等

821c4f49ff6d7c549915447e0f405c3e.png

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

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

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

5d37be47ae63c33d31e150a376b4e9e8.png

  • 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 在做适配时,针对不同的编译平台所做得操作,以及对应的关系图。

d18abf70e2c01dfcb3c138889aa155d8.png

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

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

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

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

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

4.1 Pthread 接口

7a2303001b41aa2396960a57ef5b6d45.png

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>
 5
 6#define NUM_THREADS 5
 7
 8static 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 接口

cdf196e7cb1ee6cc399e4750ccf0a1b3.png

1、在 menuconfig 中打开 timer 即可

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

1#include <sys/time.h>
 2#include <stdio.h>
 3
 4int 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 探秘

...

6c6b2add7fb61dcbd61fbd4a76a1ad6d.png

关注我们

65e9f6bf2c2d4373a8bbe473158a239a.png

f9acc444e6a45037690f0fedb23084fc.gif

爱我就给我点在看15dbaa5591fc9d1019b3e5f7a2ded33f.gif

f8d683751220e4655de720af451f08c0.gif点击 阅读原文”进入官网

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread 4.1.0 特性解析之LIBC与POSIX 的相关文章

  • 理解互斥量和信号量

    互斥量 Mutex 互斥量表现互斥现象的数据结构 xff0c 也被当作二元信号灯 一个互斥基本上是一个多任务敏感的二元信号 xff0c 它能用作同步多任务的行为 xff0c 它常用作保护从中断来的临界段代码并且在共享同步使用的资源 Mute
  • 单链表逆序与排序

    xfeff xfeff xfeff xfeff xfeff xfeff include lt stdio h gt include lt stdlib h gt include lt string h gt typedef struct d
  • ubuntu apt-get update 失败解决。

    当运行apt get update后出现如下错误时 xff1a E Some index files failed to download they have been ignored or old ones used instead 可以
  • 深入理解句柄表

    涉及到句柄表的有以下这些概念 xff1a HANDLE TABLE HANDLE TABLE结构体中的TableCode变量 实际上啊 xff0c TableCode是指向句柄表项第一个句柄表项的指针 xff08 NULL句柄表项 xff0
  • LQR控制律设计

    LQR全称为Linear Quadratic Regulator xff0c 即线性二次型调节器 xff08 一 xff09 有限时域最优调节器设计 设线性系统 被控对象的离散化状态方程为 xff1a 初始条件 给定二次型性能指标函数 xf
  • 路径跟踪之LQR控制算法

    xff08 一 xff09 车辆建模 两自由度车辆模型为 xff1a 考虑恒定不变 xff0c 则上述模型可以看作一个输入为 状态变量为的控制系统 xff0c 可以表示为 xff1a 对于参考轨迹 xff0c 可以表示为 xff1a 将 x
  • Arrays.sort简单排序实例

    Arrays sort 方法实例 xff1a 用于对整形数组及字符串数组进行排序 这里写代码片 import java util ArrayList import java util Arrays import java util Coll
  • git rebase 成功之后如何撤销

    git rebase 过程中可以使用git abort continue来进行操作 xff0c 成功之后如何撤销呢 xff1f 首先执行git reflog查看本地记录 可知本次rebase之前的id 为 xff1a 02a3260 HEA
  • STM32---BOOT0和BOOT1

    文章目录 前言一 思维导图二 注意事项1 针对BOOT0和BOOT1的不同接线方式 xff08 高电平 xff0c 低电平 xff0c 不接线 xff09 xff0c 开发板的下载情况分析如下图 xff1a xff08 x 代表不接线 xf
  • Windowsxp主机下用Putty连接VirtualBox中的Debian

    参考网址 1 xff0c debian中需要安装openssh server xff0c 并开启ssh服务 2 xff0c VirtualBox的网络连接方式选择NAT xff08 可以连接外面的网络 xff09 xff0c 默认情况下 x
  • 设备接入天猫精灵教程(一)

    现在网上接入天猫精灵的教程基本都是云对云接入 xff0c 需要搭建服务器 xff0c 写硬件程序 xff0c 费时又复杂 这次结合之前的阿里云教程做一个通过阿里云物联网平台接入天猫精灵的教程 xff0c 免去了服务器开发 xff0c 大大的
  • 测试 使用 perf 进行性能分析时如何获取准确的调用栈

    测试 使用 perf 进行性能分析时如何获取准确的调用栈 ifonly 2020年02月27日 101 次阅读 目录 perf 是 Linux 下重要的性能分析工具 xff0c perf 可以通过采样获取很多性能指标 xff0c 其中最常用
  • Jetson Xavier NX 安装固态硬盘并挂载到/home目录下

    1 查看硬盘所有分区 指令 xff1a sudo fdisk lu xff12 对硬盘进行分区 指令 xff1a sudo fdisk dev nvme0n1 3 格式化分区为ext4 指令 xff1a sudo mkfs t ext4 d
  • 单目相机位姿求解之PNP算法原理剖析与实践

    对于视觉里程计中 xff0c 相机位姿的求解问题极为常见 对于双目相机 xff0c 由于其可以直接计算出深度信息 xff0c 所以在相机位姿求解上十分容易 但如果我们使用的是单目相机 xff0c 如何从二维图像中求解出相机相对三维物体的位姿
  • 计算器1.0

    数据结构让我们相遇 计算器1 0正式上线 xff1a define h span class token macro property span class token directive keyword include span span
  • 常用软件滤波方法及其示例程序

    常用软件滤波方法及其示例程序 作者 未知 来源 发布时间 2005 08 24 浏览次数 lt script language 61 34 Javascript 34 src 61 34 view php articleid 61 10 3
  • I2C协议调试总结

    1 协议总结 开始 xff1a 在SCL为高期间 xff0c SDA由高变低 结束 xff1a 在SCL为高期间 xff0c SDA由低变高 应答 xff1a 时钟脉冲 xff19 期间释放数据线 xff0c SCL为高期间 xff0c S
  • mtk6765上i2c-tools的使用

    1 下载i2c tools 从开源网站http dl lm sensors org i2c tools releases 下载i2c tools 几个版本都可以用 xff0c 可以选择下载i2c tools 4 3 xff12 到官网下载交
  • mt6762/mt6765平台i2c驱动能力修改与波形优化

    mt6762在连接一些外设时 xff0c i2c在低电平会拉不低的情况 xff0c 最低电平在0 4V左右 xff0e 这时需要去掉外设的上拉电阻或调整硬件i2c的驱动电流 xff0e 修改文件路径 xff1a vendor mediate
  • cmake find_package 原理简介以及使用说明

    下面简单介绍Cmake 如何使用find package命令对外部库进行查找 cmake本身不提供任何关于搜索库的便捷方法 xff0c 也不会对库本身的环境变量进行设置 它仅仅是按照优先级顺序在指定的搜索路径进行查找Findxxx cmak

随机推荐