跳到主要内容

2.8 使用工具内部库

在编译器安装路径下:

  • \lib\clang-runtimes\kf32r\kf32r_general\lib 目录:存放芯片相关的算法库与系统库文件,包括libm.a、libc.a、librt.a、libnosys.a、libc++.a、libc++abi.a。
  • \lib\clang-runtimes\kf32r\kf32r_general\include 目录:存放相关的头文件,例如 math.h、malloc.h、string.h、stdio.h、stdint.h、stdarg.h、stdlib.h等。

KF32工具提供适配嵌入式的C库和数学库,同时输出裁剪的C++库以及编译需要的运行时库。直接调用链接器时应主动传递这些库:C工程使用 -lc -lm,C++工程在此基础上追加 -lc++ -lc++abi;编译器运行时库(浮点模拟与64位整型运算,见 2.8.3)使用 -lrt。

若经编译器驱动 kf32clang 完成链接(见 2.7),以上库由驱动自动加入,无需在命令行上指定。VS Code 插件生成的工程中还会传入 -lnosys,该库在包内为空桩库,不含实现。

2.8.1 C库方法示例与使用​

KF32 编译工具链实现部分 C 标准库,包括字符操作、字符串操作、数学库及相应的常量、类型等定义。用户可通过编译工具头文件路径中的相应头文件进行查看。

2.8.1.1 stdio打印输出​

工具支持轻量文件系统定义,支持常规C的打印库,支持C++打印输出。

注:GCC工具将打印绑定到USART和基于USART的外设寄存器基址并作为参数传达的方法不适用,因此stdio.h的头文件中不再声明USARTx_STREAM

2.8.1.2 类型判断库函数​

使用时需要添加 #include "ctype.h"

  • int isalpha(int c); 是否为 A-Z ,a-z 的字符,是返回自身,否则返回 0
  • int isupper(int c); 是否为 A-Z,是返回自身,否则返回 0
  • int islower(int c); 是否为 a-z,是返回自身,否则返回 0
  • int isdigit(int c); 是否为'0'- '9',是返回自身,否则返回 0
  • int tolower(int c); 返回字符对应的小写,或自身。即 A-Z 返回 a-z,其他字符保持自身返回。
  • int toupper(int c); 返回字符对应的大写,或自身。即 a-z 返回 A-Z,其他字符保持自身返回。

2.8.1.3 系统标准库函数​

使用时需要添加 #include "stdint.h"

定义常规数据类型别名,如:

typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned int uint32_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;

2.8.2 数学运算库函数​

使用时需要添加 #include "math.h"

如:

float sinf ( float );
double sin ( double );
float expf ( float );

2.8.3 运行时库​

运行时库主要包含补充浮点模拟与64位数的移位。浮点库包括单精度、双精度浮点操作及64位整型变量运算的一系列函数组成。

这些函数由C语言编译器编译生成调用过程,以辅助实现相应功能。当C语言定义float类型并进行计算时,编译器会自动调用浮点库完成运算。当使用汇编编写代码时,根据参数传递规则调用对应的函数即可调用库实现。

2.8.4 可变参数列表​

头文件stdarg.h支持带有可变参数列表的函数。参数列表中必须至少包含一个指定的参数。可变参数用省略号(...)表示,当宏定义传递时,可以在宏定义带入代码中使用 __VA_ARGS__ 传递。必须在函数中声明一个va_list类型的对象用以保存这些参数。va_start 将变量初始化为一个参数列表,va_arg用来访问这个参数列表,va_end用来终止参数的使用。