1. 概述
本章介绍ChipON KungFu32嵌入式编译工具链(以下简称KF32工具链)的组成,帮助您快速了解KF32工具链的功能以及典型的程序开发流程,并介绍KF32工具链支持的架构。
1.1 文档说明
本文档旨在详细介绍 ChipON KungFu32 嵌入式编译工具链(以下简称 KF32 工具链)的完整使用方法,包括快速入门、工具链选项、代码优化、汇编器、链接器、库管理与目标文件工具的使用说明。为从事 ChipON KF32 芯片开发的用户提供全面、易懂的使用指导,帮助新手快速上手 KF32 工具链,提升嵌入式项目的编译、链接与优化效率;同时为有一定使用基础的用户提供命令行选项与工具行为的参考。
1.2 简介
KF32工具链支持C/C++编译,能为ChipON KungFu32位嵌入式MCU生成高效可执行文件,支持C99与C++14标准。
KF32工具链基于LLVM和Clang构建,包括编译器、链接器和库等,具体如下:
- kf32clang:编译器,用于编译C源文件,并承担汇编源文件的汇编工作。
- kf32clang++:编译器,用于编译C++源文件使用。
- kf32ld:链接器,将一个或多个目标文件的内容与一个或多个目标库的选定部分组合起来,以生成目标程序。
- kf32ar:库管理工具,kf32ar支持以标准格式的ar库来收集和维护ELF目标文件集合。
- kf32objdump:反汇编工具,支持解析标准格式的 ELF 目标文件,并将其机器指令转换为可读的汇编语言,同时可展示文件结构与符号信息。
- kf32objcopy:ELF转换工具,支持将链接生成的 ELF 格式目标文件转换为多种可直接下载到芯片存储器的标准格式文件。
- kf32size:段大小查看器,用于快速统计和显示编译链接后生成的可执行文件中,各段(section)在存储器(如 Flash 和 RAM)中的占用大小。
- C库:提供适用于嵌入式设备的高效C库和数学库。
- C++库:提供适用于嵌入式设备的高效C++库。
1.3 适用范围
本文档适用于所有使用 ChipON KungFu32 嵌入式编译工具链进行嵌入式开发的用户,包括嵌入式开发新手、专业嵌入式工程师等不同群体,涵盖从源码编译、汇编、链接到目标文件转换的全流程操作。无论用户是否熟悉命令行开发方式或 ChipON KF32 芯片,均可通过本文档快速掌握 KF32 工具链的使用方法。
1.4 术语与定义
- KF32:ChipON KungFu 系列 32 位 MCU。
- KF32 工具链(Toolchain):ChipON 基于 LLVM 与 Clang 构建、面向 KF32 系列芯片的嵌入式编译工具链,包含编译器、汇编器、链接器、库管理工具与目标文件处理工具。
- ELF:Executable and Linkable Format,工具链在编译、汇编、链接各环节统一采用的目标文件格式。
- 目标文件(Object File):由源文件编译或汇编得到的可重定位 ELF 文件,是链接器的输入。
- 链接脚本(Linker Script):描述目标芯片存储器布局与段分配规则的脚本文件,链接器据此确定各段在 Flash、RAM 中的地址。
- 交叉编译:在一种平台上生成另一种平台(此处为 KF32 MCU)可执行代码的编译方式。
1.5 支持的架构
注:基于LLVM的KF32工具链与老版本GCC的工具链不兼容,请勿混用。历史工具链生成的库不建议在当前工具链使用。
当前,KF32工具链支持以下架构:
- kf32r(精简指令集)
1.6 数据类型
1.6.1 字节序
KF32编译器以小端字节序格式存储数据。最低有效字节存储在最低地址。
例如,32位数值0x12345678在地址0x10000000处开始,按如下格式存储:
表1.1 存储示例
| 地址 | 0x10000000 | 0x10000001 | 0x10000002 | 0x10000003 |
|---|---|---|---|---|
| 数值 | 0x78 | 0x56 | 0x34 | 0x12 |
1.6.2 整型类型与范围
KF32编译器中的整型范围如下:
表1.2 整型类型
| 类型 | 位 | 字节 | 最小值 | 最大值 |
|---|---|---|---|---|
| signed char | 8 | 1 | -128 | 127 |
| char,unsigned char | 8 | 1 | 0 | 255 |
| short,signed short | 16 | 2 | -32768 | 32767 |
| unsigned short | 16 | 2 | 0 | 65535 |
| int,signed int | 32 | 4 | -2³¹ | 2³¹-1 |
| unsigned int | 32 | 4 | 0 | 2³²-1 |
| long,signed long | 32 | 4 | -2³¹ | 2³¹-1 |
| unsigned long | 32 | 4 | 0 | 2³²-1 |
| long long,signed long long | 64 | 8 | -2⁶³ | 2⁶³-1 |
| unsigned long long | 64 | 8 | 0 | 2⁶⁴-1 |
1.6.3 默认字节char变量的符号说明
默认情况下,不带修饰符的char 类型的值被KF32编译器定义为无符号值。同时,可以使用命令行选项-fsigned-char将默认类型设置为有符号,-funsigned-char将默认类型设置为无符号。
1.6.4 浮点类型与长度
KF32编译器使用IEEE-754浮点格式。
表1.3 浮点类型
| 类型 | 位 | 字节 |
|---|---|---|
| float | 32 | 4 |
| double | 64 | 8 |
| long double | 64 | 8 |
1.6.5 指针类型与长度
KF32编译器中指针长度为32位整数。