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 5286fa6ee4527f03bb503c3d9322800221402ed9..7ab1b91095b05e3c2ee221a1384df5c96240e174 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 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/programming-manual/libc/figures/kservice.png differ 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 ada8c8ad94b2aeb3fed0b857f7ed0e20ee71949b..2c8302e89012a1c24782b10df0047e60b0aa08e0 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,来获取从终端键入的字符。