-
Notifications
You must be signed in to change notification settings - Fork 19
标准输出部分解析
本文综述 RPS 标准输出部分的上层架构;这意味着其中不包含底层实现相关内容。若想获知关于底层实现的信息,请参看 UART 及 GPIO 底层部分解析。
RPS 标准输出部分声明在 rpsio.h 中。
| 返回类型 | 函数 | 描述 |
|---|---|---|
| void | printf (const char *fmt, ...) | 格式化输出 fmt 指向的字符串 |
| void | putchar (unsigned int c) | 向标准输出写入字符 |
printf 函数是普通 C 标准库中的 printf 函数的简化版。这个函数简略了一些功能,并且不支持浮点数的输出。printf 函数具有固定大小的缓冲区(100 字符),这意味着其每一个参数所转换而成的字符数都必须小于此缓冲区大小,否则将发生错误。
-
const char *fmt想要写入标准输出的字符串。这个字符串可以包含特定的格式标识符,这些标识符将在输出时被指定格式的内容替换。一个合法的标识符应该如下所示:
%[flags][width][length]specifier其中最重要的是 specifier 部分。specifier 决定了对应参数的类型和解析方式。其可能的内容如下所示;表格没有叙述的字母不会被解析为 specifier,而是会原样输出。
specifier 输出 示例 b 整数的二进制表示 1001 d or D 有符号整数 -392 o or O 整数的八进制表示 1732 u or U 无符号整数 392 x 整数的十六进制表示,小写 9a2 X 整数的十六进制表示,大写 9A2 c 单个字符 s s 字符串 Sample 格式标识符也可以依序包含三个子标识符:flags,width 和 length。一旦 % 后包含了这些信息,那么即使 specifier 无效,它们也会被解析。详细信息介绍如下:
flags 描述 - 向左对齐,而非默认的向右对齐 0 数字位数不足时,左边用 0 填充 width 描述 number 输出的最小长度。如果该值小于此项本应输出的长度,则不会生效 length 描述 l or L 仅对数字类型生效,将其解析为对应的长整型 -
... (additional arguments)这些参数应该与 fmt 中的格式标识符依序一一对应,依照对应的格式标识符解析并输出。如果参数与标识符不对应,结果是未定义的。多余的参数将被忽略。
无
printf 函数通过 lp_print 辅助函数解析字符串,并且通过 print_str 辅助函数进行输出。
-
lp_print 辅助函数
lp_print 辅助函数承担着解析并转换字符串的使命。这个函数逐字符进行读取,如果遇到 % 则进行解析。函数依次解析标识符的所有可能出现的字标识符,设定对应的位,直到 specifier 部分出现。程序根据对应的 specifier 进行不同的解析,并通过 make_char,make_string 和 make_num 三个辅助函数进行对应参数到字符串的转换。转换后的字符串存放在缓冲区中。随后此函数调用 print_str 辅助函数输出缓冲区中的内容,并且继续进行余下部分的解析。
-
print_str 辅助函数
print_str 辅助函数用于输出字符串。该函数对字符串中的字符循环调用 putchar 函数,将字符写入标准输出。
putchar 函数将字符打印到标准输出。
-
unsigned int c要输出的字符。
无
putchar 函数调用底层函数 uart_send 打印字符。当要打印的字符是'\n'时,putchar 函数会自动将其转换为两个字符 0xD 和 0xA。