From e8eae3c66cbb719a04fd4a5dace90b75affeff4e Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Fri, 10 Jun 2022 03:51:25 -0400 Subject: [PATCH] =?UTF-8?q?=E4=BB=8B=E7=BB=8DPOSIX=E5=92=8CANSIISO?= =?UTF-8?q?=EF=BC=8C=E4=BB=8B=E7=BB=8DPSE5x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programming-manual/libc/compiler.md | 4 +-- .../programming-manual/libc/introduction.md | 26 ++++++++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/rt-thread-version/rt-thread-standard/programming-manual/libc/compiler.md b/rt-thread-version/rt-thread-standard/programming-manual/libc/compiler.md index 7ab1b91..f1cb659 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/libc/compiler.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/libc/compiler.md @@ -1,8 +1,8 @@ # 编译器配平层 -编译器配平层负责对接编译器的底层桩函数以及平衡不同编译器内置C库函数的差异而设计,为上层 POSIX 层提供功能统一的接口,位于 [components/libc/compiler](https://github.com/RT-Thread/rt-thread/tree/master/components/libc/compilers) 文件目录下。之所以需要配平,是由于 GCC (newlib)、Keil-MDK、IAR、Visual Studio (WIN32) 四个编译工具所提供的标准 C 库函数支持程度不一样,编译器配平层负责将四种不同的编译链所提供的标准 C 库平衡到相同的水平。编译器配平层无需用户手动干预,会在编译工程时,根据用户所使用的的编译平台和工具链自动进行配平。 +编译器配平层负责对接编译器的底层桩函数以及平衡不同编译器内置C库函数的差异而设计,为上层 POSIX 层提供功能统一的接口,位于 [components/libc/compiler](https://github.com/RT-Thread/rt-thread/tree/master/components/libc/compilers) 文件目录下。之所以需要配平,是由于 GCC (newlib)、Keil-MDK、IAR、Visual Studio (WIN32) 四个编译工具链内置 LIBC 所提供的标准 C 库函数支持程度不一样,编译器配平层负责将四种不同的编译链所提供的标准 C 库平衡到相同的水平。编译器配平层无需用户手动干预,会在编译工程时,根据用户所使用的的编译平台和工具链自动进行配平。保证上层无需区分使用何种编译平台和工具链的 LIBC ,使用通用的头文件即可引用 LIBC 的相关函数。 -配平层已经提供了一些基本的 libc 函数,这些函数不需要用户额外使能,可以即刻使用。 +配平层已经提供了一些基本的 LIBC 函数,这些函数不需要用户额外使能,可以即刻使用。 ## 标准输出函数 (printf 家族) diff --git a/rt-thread-version/rt-thread-standard/programming-manual/libc/introduction.md b/rt-thread-version/rt-thread-standard/programming-manual/libc/introduction.md index 8fa295b..18c7e41 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/libc/introduction.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/libc/introduction.md @@ -1,21 +1,33 @@ # LIBC 简介 -RT-Thread 提供的 LIBC (C library, C库),包含编译器配平层和 POSIX 层两部分。布局如下图所示: +RT-Thread 提供的 LIBC (C library, C库),包含编译器内置LIBC、编译器配平层和 POSIX 层三部分。布局如下图所示: ![libc_structure](figures/libc_structure.png) -由于在不同的平台开发所使用的编译工具链不一致;所以在实现时,RT-Thread 区分了三个概念:**POSIX标准**,**ISO-ANSI 标准**,**编译器配平层**;下面结合关系图,描述一下对应的概念: +## ISO/ANSI C +ANSI C、ISO C、Standard C是指美国国家标准协会(ANSI)和国际标准化组织(ISO)对C语言发布的标准。历史上,这个名字专门用于指代此标准的原始版本,也是支持最好的版本(称为C89或C90)。使用C的软件开发者被鼓励遵循标准的要求,因为它鼓励使用跨平台的代码。C的第一个标准是由ANSI发布的。虽然这份文档后来被国际标准化组织(ISO)采纳并且ISO发布的修订版亦被ANSI采纳,但名称ANSI C(而不是ISO C)仍被广泛使用。一些软件开发者使用名称ISO C,还有一些使用中立的名称Standard C。例如常说的C89 (ANSI X3.159-1989)、C99 (ISO/IEC 9899:1999)、C11 (ISO/IEC 9899:2011) 实际都是指该标准的不同版本。 -* POSIX 标准,即 POSIX 接口;这里面包含了一些关于 pthread, signal, IPC 等函数以及 C 库,数学库的相关内容; -* ISO-ANSI 标准,即 POSIX.1 的子集。这些主要由一些编译工具链提供,较为常见的就是 KEIL 提供的 ARMCC, IAR 提供的 IARCC;不能说他们没有提供 POSIX 函数,提供了但是仅包含 ISO-ANSI 标准。 -* 编译器配平层,由于不同编译工具链对 POSIX 内容的实现参差不齐,因此需要针对不同的编译平台增补这些函数,这也就是 “ 配平 ” 的由来。 +该标准通常被编译器/工具链内置 LIBC 所支持,例如 Keil-MDK、IAR 等所提供的的内置 LIBC 都是满足该标准的。 + +## POSIX 接口 +可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。ISO/ANSI C 是 POSIX 的子集。 + +### IEEE Std 1003.1 +针对LIBC,目前广泛使用的 POSIX 标准是 1003.1 标准,全称为IEEE Std 1003.1(缩写写法为 POSIX.1)。IEEE Std 1003.1-2001、IEEE Std 1003.1-2008 等为 POSIX.1 在不同时期更新发布的版本。 + +### IEEE Std. 1003.13 +该标准是 POSIX 针对实时规范 (reatime profiles)。该标准是由 IEEE Std 1003.1 筛选而来,因此是其子集。IEEE Std. 1003.13 定义了四个子集: +- Minimal:最小嵌入式子集规范 —— PSE51 +- Controller:工业控制器子集规范 —— PSE52 +- Dedicated:较大规模的嵌入式系统子集规范 —— PSE53 +- Multi-Purpose:具有实时性要求的大规模通用系统子集规范 —— PSE54 + +目前 RT-Thread 已经实现 PSE51 规范以及部分 PSE52 规范的内容。 ### 注意事项 ##### 不同编译平台的兼容 -在上一节,编译器配平层的存在解决了多组编译工具链不一致造成的问题;同时,也引入了一些在编写代码时需要注意的事项。这些注意事项是为了解决对应的编译错误。因为编译工具链有的允许头文件替换,有的不支持这些问题。RT-Thread 提供了一个相对轻便的解决办法: - * 为保证跨不同编译器、不同工具链的兼容性,建议用户应用层代码: * 使用 代替 * 使用 代替 -- Gitee