From 9f46df0d9de1157a1ff3822242800f58e8db88a4 Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Thu, 10 Feb 2022 17:02:07 -0500 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=BC=96=E8=AF=91=E5=99=A8?= =?UTF-8?q?=E9=85=8D=E5=B9=B3=E5=B1=82=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programming-manual/libc/compiler.md | 8 ++++++- .../libc/figures/kservice.png | Bin 0 -> 29512 bytes .../libc/posix/introduction.md | 22 +++++++++++++++--- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/libc/figures/kservice.png 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 5286fa6..7ab1b91 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,6 +1,6 @@ # 编译器配平层 -编译器配平层负责对接编译器的底层桩函数以及平衡不同编译器内置C库函数的差异而设计,为上层 POSIX 层提供功能统一的接口,位于 [components/libc/compiler](https://github.com/RT-Thread/rt-thread/tree/master/components/libc/compilers) 文件目录下。之所以需要配平,是由于 GCC、Keil-MDK、IAR 三个编译工具所提供的标准 C 库函数支持程度不一样,编译器配平层负责将 Keil-MDK、IAR、GCC 三种不同的编译链所提供的标准 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) 四个编译工具所提供的标准 C 库函数支持程度不一样,编译器配平层负责将四种不同的编译链所提供的标准 C 库平衡到相同的水平。编译器配平层无需用户手动干预,会在编译工程时,根据用户所使用的的编译平台和工具链自动进行配平。 配平层已经提供了一些基本的 libc 函数,这些函数不需要用户额外使能,可以即刻使用。 @@ -64,3 +64,9 @@ system 函数可以用于在 C 程序中内置执行一些 FinSH 命令。 | 第二组 | mktime | timegm | 2. 目前,时间相关函数不支持的是夏令时自动转换相关功能。夏令时在中国不使用,主要是欧美国家在使用。 + +## kservice.c + +在RT-Thread内核 (Kernel) 中有一个叫 kservice.c 的文件。该文件提供了RT-Thread自己实现的C库函数,例如 rt_strlen、rt_strcpy 等等。这些函数存在的意义在于让 RT-Thread 内核具备自持能力,即在不依赖任何C库的情况下,依然可以正常运行。此外,部分编译器内置的C库函数,如上所说,存在一些缺陷,kservice.c 文件中提供的函数更安全,且可控。如果认为,kservice.c 文件中提供的函数与编译器内置C库函数重复,可以通过配置,将 kservice.c 中的大多数函数重映射到编译器内置C库函数中,例如:在开启如下图所示的选项后,调用 rt_strlen 函数实际相当于直接调用编译器内置C库的 strlen 函数。 + +![kservice](figures/kservice.png) diff --git a/rt-thread-version/rt-thread-standard/programming-manual/libc/figures/kservice.png b/rt-thread-version/rt-thread-standard/programming-manual/libc/figures/kservice.png new file mode 100644 index 0000000000000000000000000000000000000000..26d3d8d9a7e08fb262381129603c74b9dcba2e84 GIT binary patch literal 29512 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 Nl$rIPMJF!b{U2>}T2uf4 literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/libc/posix/introduction.md b/rt-thread-version/rt-thread-standard/programming-manual/libc/posix/introduction.md index ada8c8a..2c8302e 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/libc/posix/introduction.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/libc/posix/introduction.md @@ -1,10 +1,26 @@ # POSIX 简介 +## 标准输入输出函数 +如果需要读写标准输入输出,调用以下函数/功能,请开启 `RT_USING_POSIX_FS` 和 `RT_USING_POSIX_STDIO` 宏。若读写文件系统中的文件,则仅需开启 `RT_USING_POSIX_FS`,无需开启 `RT_USING_POSIX_STDIO`。 -## 标准输入输出函数 +```c +/* 标准输出 */ +write(STDOUT_FILENO 或 STDERR_FILENO); +printf(...); /* 该函数仅需在gcc下使能上述两个宏,在其他编译器下,可以直接使用 */ +fprintf(stdout 或 stderr); +fwrite(stdout 或 stderr); +fputs(stdout 或 stderr); +fputc(stdout 或 stderr); +puts(); -在不使能 POSIX 层相关功能的情况下,用户无法使用 read 、getchar 等获取字符串输入的标准 C 函数,需要开启 `RT_USING_POSIX_FS` 和 `RT_USING_POSIX_STDIO` 宏。 +/* 标准输入 */ +getchar(); +read(STDIN_FILENO); +fread(stdin); +fgetc(stdin); +fgets(stdin); +``` -如果已经开启 FinSH 功能的话,可以在 FinSH 线程下,使用 finsh_getchar 代替 getchar,来获取从终端键入的字符。 +> 注:如果已经开启 FinSH 功能的话,可以在 FinSH 线程下,使用 finsh_getchar 代替 getchar,来获取从终端键入的字符。 -- Gitee