RISC-V交叉编译环境搭建:K210工具链安装配置实战
2026/9/16 19:36:40 网站建设 项目流程

简介:面向Windows 64位系统的Kendryte RISC-V开发工具链安装包,版本8.2.0(2019年4月发布),专为基于RISC-V架构的K210等芯片的嵌入式与AI边缘计算开发设计,适合物联网开发者、嵌入式工程师使用。压缩包共1069个文件,约51.36MB,内部以头文件(h/hpp)、库文件(a/la)、可执行工具(exe)及编译相关配置(tcc、specs)为主体,涵盖GCC编译器、链接器、调试器等核心组件,并附带SDK头文件与少量Python辅助脚本,可直接在命令行或IDE中调用。工具链针对Kendryte芯片优化,支持C/C++开发与硬件外设访问,配合gdb可完成断点调试、内存检查等操作,是K210应用开发、语音图像处理等场景的基础环境。目前已有239人学习使用,适合希望快速搭建Kendryte Windows开发环境、熟悉RISC-V工具链的开发者参考。

1. 先搞清楚这个zip里到底是什么

我第一次下载kendryte-toolchain-win-amd64-8.2.0-20190409.zip的时候,心里也犯嘀咕:这不就是一个压缩包嘛,能有什么技术含量?实际上,这个文件基本上是把K210芯片和一个“编译器”打包在一起,专门用来在Windows系统上开发K210这块RISC-V架构芯片的交叉编译环境。

如果你的项目和K210、嘉楠开发板、AI边缘计算、甚至某些带摄像头的人脸识别门锁有什么关系,那你迟早要和这个压缩包打交道。很多人一开始容易误解:以为arduino或者keil C51那种方式就能直接写K210程序。其实K210和常见的51、STM32差别很大,它用的不是ARM Cortex-M内核,而是RISC-V双核架构。你要在PC上写出能在K210上跑的程序,就必须用交叉编译工具链。

交叉编译是什么意思?用生活类比:你在一台装着Windows的电脑上写代码,但最终代码要跑到一块完全不同的芯片上。你的电脑CPU和K210芯片的指令集架构(ISA)不一样,本机编译器编出来的程序根本不认识。所以你需要一个专门“翻译”成RISC-V指令集的编译器。这个zip就是干这个活的——一个可以在Windows上运行的、目标平台是RISC-V的GCC工具链。

顺带说一句,这个压缩包对应的是嘉楠早期开源SDK(Kendryte Standalone SDK)配套工具链。现在官方主推的Kendryte IDE虽然也内置了交叉编译环境,但核心编译器仍然是同一套riscv64-unknown-elf-gcc,所以理解和会手动配这个工具链,对你后续用IDE、写Makefile、甚至接入VS Code都会非常有用。

2. 安装前必须知道的三个关键点

2.1 解压不等于安装,环境变量才是主角

很多人下载完这个zip,双击解压到某个目录,然后发现命令行输入riscv64-unknown-elf-gcc --version直接报“不是内部或外部命令”。原因很简单:压缩包解压后不会自己注册到系统PATH里,你需要手动把bin目录加到环境变量。

我建议先把整个目录放到一个干净、无中文、无空格的位置,比如C:\kendryte-toolchain\。为什么强调无空格?因为后面SDK的Makefile脚本在拼接路径时,如果目录里带空格(比如C:\Program Files\kendryte-toolchain),很容易出现路径截断或转义错误。这个坑我在命令行版SDK上踩过不止一次。

2.2 为什么是amd64而不是arm64

标题里的amd64指的是你这台电脑的CPU架构,不是K210芯片的架构。Intel和AMD的64位CPU一般用x86_64指令集,而微软叫它amd64。arm64是ARM架构的64位指令集。如果你的电脑是普通Windows台式机、笔记本(绝大多数Intel/AMD芯片),选amd64版;如果是Windows on ARM设备(比如部分骁龙平台的平板),就需要arm64版工具链。

不要以为这无所谓。交叉编译器本身也是个程序,也要能在你的Windows系统里运行。选错了架构,轻则根本无法启动,重则跑起来后莫名其妙崩溃。下载之前先确认自己的系统类型:Win+R输入msinfo32,找到“系统类型”就能看到是x64还是ARM64。

2.3 版本号里藏着的信息

8.2.0-20190409这一段不是随便写的:

  • 8.2.0:GCC主版本号。K210的BSP(板级支持包)在编某些驱动时对编译器版本比较敏感,8.2.0是嘉楠官方当时验证过的版本。
  • 20190409:构建日期。2019年4月9日。这个日期很关键——如果你去下载更新的工具链(比如RISC-V官方发布的9.2.0或10.1.0),在编译老版本的Kendryte SDK时可能会遇到内联汇编语法兼容性问题。

所以如果遇到“这个工具链太老了吧”的想法,我的建议是:只要你的SDK版本不是特别新的主线代码,就用官方这个配套版本最稳。升级工具链虽然能解决部分编译告警,但也会引入一些未知的兼容性风险。

3. 实操步骤:从解压到跑通第一个程序

3.1 安装与验证工具链

我把完整流程分成四步,每一步都给出验证方法,避免你到最后一步才发现前面配错了。

第一步:解压

把zip解压到C:\kendryte-toolchain\。解压完你应该能看到以下主要目录:

C:\kendryte-toolchain\ ├── bin\ # 编译器可执行文件在此 ├── lib\ # 运行库 ├── libexec\ ├── riscv64-unknown-elf\ # 目标系统的库文件和头文件 └── share\

第二步:添加环境变量

Win+R输入sysdm.cpl,打开“高级→环境变量”,在“系统变量”中找到Path,追加一行:

C:\kendryte-toolchain\bin

注意是追加,不是替换。然后打开新的CMD窗口(旧窗口不会刷新环境变量),测试:

riscv64-unknown-elf-gcc --version

如果输出以riscv64-unknown-elf-gcc (GCC) 8.2.0开头,说明工具链已经能用了。

第三步:检查辅助工具

光有编译器还不够,SDK的构建流程还依赖makepythongit

  • make:建议装一个带make的GNU工具集。我推荐直接装gcc-make独立工具包,或者用小熊猫C++自带的MinGW工具集里的make。
  • python:Kendryte SDK的烧录脚本kflash.py是Python写的,需要Python 3.6以上。装完记得把Python也加进PATH。
  • git:拉取SDK源码用,推荐装标准版Git for Windows。

第四步:验证完整编译链

进入SDK目录,先跑一个最简单的编译指令:

make

如果能正常生成.elf.bin文件,说明你的工具链和SDK联动正常。

3.2 用命令行版SDK跑通一个点灯例程

很多教程会直接让你打开Kendryte IDE,但我觉得对于理解底层流程来说,命令行方式更清晰。以Kendryte Standalone SDK为例,完整跑通一个blink例程分三步。

第一步:拉取SDK

git clone https://github.com/kendryte/kendryte-standalone-sdk.git cd kendryte-standalone-sdk

如果你想省事,也可以用Gitee镜像,速度会更快。这里我用的是github地址,只是作为常见来源之一。

第二步:修改编译配置

SDK顶层的kendryte-package.jsonMakefile里会有一个变量指定工具链前缀。有的版本默认是riscv64-unknown-elf-,有的SDK分支使用riscv64-known-elf-。如果你配置完环境变量后直接make报错提示找不到编译器,检查这个前缀是否匹配你的工具链。

通常不需要改,但如果你把工具链装到了非默认路径,则需要显式指定:

make TOOLCHAIN_PATH=C:/kendryte-toolchain/bin

第三步:编译和烧录

在SDK根目录下,先编译一个最简单的例程。比如src/demo里有现成的hello world:

make demo_hello_world

生成的固件在build/hello_world.bin。接下来烧录到开发板:

python kflash.py -p COM3 -b 1500000 build/hello_world.bin

其中COM3换成你实际串口号,-b 1500000表示波特率。K210的ISP(在系统编程)协议支持最高1.5M波特率,实测这个速度在多数USB转串口芯片上都比较稳。

提示:烧录时要先让开发板进入下载模式。K210开发板一般有一个BOOT按键,按住BOOT再按一下RESET,然后松开BOOT,板子就会进入ISP模式。如果你直接烧录失败,先检查这一步。

4. 常见的坑与排查技巧

4.1 “不是内部或外部命令”

这是新手遇到最多的报错。排查顺序:

  1. 重新打开CMD窗口,确认PATH已经生效,可以echo %PATH%查看是否包含你的工具链bin。
  2. 确认文件名。bin目录下应该有一个riscv64-unknown-elf-gcc.exe,不是所有版本都叫这个名。有的工具链会把编译器命名为riscv64-unknown-elf-gcc-8.2.0,有一个后缀。如果是这样,你需要手动创建一个无后缀的副本,或者直接使用完整文件名。
  3. 以管理员身份打开CMD。有些环境变量修改后,非管理员窗口可能没有正确刷新。

4.2 make报错“missing separator”

这个问题通常出现在你手动修改过SDK的Makefile之后,使用了空格缩进而不是Tab缩进。Makefile对格式极其严格,命令行必须以Tab开头,不能用空格替代。

另外,如果你把SDK放在了中文目录下,或者路径里带空格,也会出现类似“file not found”或路径截断的问题。Windows下编译RISC-V项目,路径“干净”是第一原则。

4.3 烧录时报“No module named serial”

kflash.py依赖pyserial库。运行:

pip install pyserial

有时候还需要requests库,一并装了就完了。如果Flask脚本还报别的缺模块,直接看报错内容缺什么补什么。

4.4 Python2和Python3混用

有些老文档会建议用Python2,但kflash.py是Python3的脚本。如果你电脑上同时装了Python2和Python3,直接用python命令可能会调用到Python2,导致语法错误。建议用python3py -3显式指定版本。

4.5 “undefined reference to__adddf33” 类型的链接错误

这个问题我在用新版本GCC(9.2.0以上)编译老SDK时遇到过。原因是指令集扩展不匹配——旧SDK配置文件里没有正确启用软浮点或硬件浮点支持。K210支持RV64IMAFDC(即带F和D扩展),但你用的编译器如果默认生成rv64imac的目标代码,在链接时就会缺浮点运算的辅助函数。

解决办法是检查SDK的CMake或Makefile配置里是否有-march=rv64imafc-march=rv64imafdc,没有就手动加。如果没有加这个参数,且你用的是新版编译器,就会因为软浮点库缺失而链接失败。

4.6 环境变量配置了但重启后又失效

“系统变量”和“用户变量”的区别:如果改的是用户变量,Windows重启后某些服务(比如VS Code或某些终端软件)不会继承,需要彻底关闭并重新打开。如果改的是系统变量,也需要重新启动所有已打开的终端窗口。

还有一个更隐蔽的问题:如果Path里既有用户变量又有系统变量,且系统变量的Path中有一个无效路径,可能会导致整个Path解析中断。排除方法:把工具链路径加到用户变量,并且在CMD里直接运行完整路径C:\kendryte-toolchain\bin\riscv64-unknown-elf-gcc.exe --version,如果完整路径能运行,说明工具链本身没问题,问题出在PATH。

5. 工具链之外,你还差这三样

5.1 一个顺手的编辑器

很多教程默认用VS Code + C/C++插件。我可以直接告诉你,用这套搭配编译K210项目很简单:安装插件后在.vscode/c_cpp_properties.json里指定compilerPath为工具链里的gcc,并设置intelliSenseModegcc-x64,includePath指向SDK的libinclude目录就行。

用同一个工具链做语法补全和代码跳转,比用本机gcc更准确,因为宏定义和目标平台指令集都匹配。

5.2 对Makefile体系的基本认识

Kendryte官方SDK虽然是cmake也能构建,但很多示例项目的入口还是Makefile。你不需要做CMake专家,但至少要能看懂几个关键变量:

  • CROSS_COMPILE:交叉编译器前缀,通常是riscv64-unknown-elf-
  • ARCH:目标架构,RISC-V的K210一般写成rv64imafdc
  • CFLAGS:编译参数,包含-march=... -mabi=lp64d -O2

5.3 一个串口调试工具

烧录和输出log都依赖串口。推荐用MobaXterm或者SSCOM,前者功能强、界面清晰,后者是绿色单文件,使用简单。串口波特率一般是115200,开发板的log输出默认就是这频率。K210的ISP烧录波特率可以和log波特率不同,这是两个独立的概念。

6. 最后再分享一点真实踩坑经验

我个人实际用这套工具链做了大概半年多的K210项目,最大的体会是:这个工具链虽然老,但千万别小看它,也别随便升级。

有一段时间我图新鲜,换成了RISC-V官方最新的GCC 10.1.0版。编译跑起来确实没报错,但烧录到板子上,程序初始化就卡死,折腾了整整三天,最后发现是链接脚本里某些符号的地址对齐方式变了,新版GCC生成的代码段布局和老版不一样。换回8.2.0版本之后,问题立刻消失,一切正常。从那之后,我手机上存放的始终是官方这个版本,只有当项目明确需要某种新特性时才会谨慎评估升级。

另外还有一个习惯值得推荐:不要把工具链路径添加到用户目录下的.bashrc而忽略系统PATH,尤其在Windows上配合MSYS2或Git Bash使用时,PATH的拼接顺序会影响工具链的优先级。如果你同时装了多个RISC-V工具链,建议专门用一个名字特别清晰的文件夹区分(比如C:\toolchains\riscv-8.2.0),避免时间一久自己都搞混。

这个压缩包本身虽然只有一百多兆,但它背后涉及的交叉编译、RISC-V指令集、SDK构建体系,足以让一个新手研究很久。如果你能把上面这些步骤都跑通,K210对你来说基本就没有门槛了。后续不管是做人脸识别门禁、智能语音助手还是边缘视觉检测,你都能直接在此基础上展开,不再会被“编译环境”这种基础问题卡住。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询