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 的字符,是返回自身,否则返回 0int isupper(int c);是否为 A-Z,是返回自身,否则返回 0int islower(int c);是否为 a-z,是返回自身,否则返回 0int isdigit(int c);是否为'0'- '9',是返回自身,否则返回 0int 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用来终止参数的使用。