另辟蹊径,看大牛如何在CLion中开发HPM6750

描述

本期工具分享来自一名不愿留名的热心先楫粉丝,咱就称大神为 @L君吧!内容着重介绍了 如何在CLion中开发HPM6750,感兴趣的赶紧上车 

 

HPM6750 是先楫半导体 HPM6000 系列的旗舰产品,采用双RISC-V内核(AndesCore D45)设计。目前先辑半导体主要推荐使用 SEGGER Embedded Studio 进行开发,可以免费进行商业应用。在未来,先辑还可能推出一款基于 VS code 的集成化开发平台。这篇文章主要介绍如何在 CLion 上进行配置开发。
在进入正题之前,首先需要明确的是无论 SEGGER Embedded Studio 还是 VS Code,都只是一个开发环境,并不绑定编译器。如 SEGGER 有一些自己的工具链,但也可以用 Andes 的甚至是 Clang。目前 HPM6000 系列可用的编译器包括但不一定限于以下列表:

名称编译器前缀说明获取方式
riscv32-unknow-elf主线riscv32-unknow-elfrv官方工具链,需修改HPM_SDK方可使用GitHub - riscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC
riscv32-unknow-elf魔改版riscv32-unknow-elf针对HPM的修改版先辑sdk包
nds32le-elf-newlib-v5riscv32-elfAndes 工具链,性能最优GitHub - andestech/nds-gnu-toolchain: GNU toolchain for AndesCore

如果不追求使用主线工具链,选择第二、第三种工具链均可。第二种工具链的优势是可以直接下载到工具链包,而 Andes 的工具链优势是性能最佳,两者的 coremark 跑分大约有 20% 的差距(2022.09.15),但是目前尚未提供可直接下载的二进制包。
那么有没有简单不麻烦的配置方式?SEGGER Embedded Studio Windows Linux MacOS 通吃。
 

软件安装


使用 CLion 开发 HPM6000 系列单片机需要以下软件:

  • CLion
  • 适用于 HPM6000 系列的编译器
  • 适用于 HPM6000 系列的 openocd
  • Python3.8 及以上版本

 

1 nds-gnu-toolchain 的编译(可选)


RISC-V 是一个开放的指令集架构,各个 IP 厂商都可以根据自己的需求定制,因此 RISC-V 虽然有 riscv-gnu-toolchain 这样的公版编译器,但并非所有 RISC-V 核心都适合使用,厂商往往会根据自己的核心特点自行定制一套编译器。对于 Andes 而言,nds-gnu-toolchain 就是他们自行定制的一套编译工具链,只有使用这一套工具链才能获得最佳的性能(例如 coremark 4600+ 的分数)
Andes 和 hpmicro 目前均没有提供这套工具链的二进制文件下载,因此需要自行编译。项目 README 给出了编译方法,主要命令如下所示。目前(2022.09.15)在 Ubuntu22.04 系统下会出现undefined reference to _initialize_string_view_selftests()错误,请选择 20.04 等版本进行编译(Ubuntu20.04 WSL2 测试通过)。若初始化子模块时无法下载,可以参考这里的方法通过镜像站解决。
 

  •  
  •  
  •  
  •  

git clone https://github.com/andestech/nds-gnu-toolchain.gitcd nds-gnu-toolchaingit submodule update --init --recursive./build_elf_toolchain.sh如果编译脚本没有报错,最后你将会获得一个名为 nds32le-elf-newlib-v5 的文件夹,它就是下一步我们需要使用的工具链文件夹。如果你需要支持浮点数的工具链,可以根据 README 的介绍修改编译脚本,构建 nds32le-elf-newlib-v5d / nds32le-elf-newlib-v5f 这两个工具链。

 

2 软件安装与配置

首先,请安装以下软件,并准备好可运行的 CLion

  •  

sudo apt install build-essential cmake ninja-build libc6-i386 libc6-i386-cross libstdc++6-i386-crosssudo apt install python3 python3-pip随后,请从pan.baidu.com/s/1qvyXhh 中下载 SDK/linux_toolchain 下的 openocd,以及 SDK/linux_toolchain 下的 riscv-gnu-toolchain 或者准备自行编译 nds32le-elf-newlib-v5,并通过 git 获取 hpm_sdkgit clone https://github.com/hpmicro/hpm_sdk请将以上文件解压并放置在恰当的位置,以便你能够轻易找出它们的路径,一种参考布局如下图所示下面,我们需要设置一些环境变量。这些环境变量会由 HPM_SDK 中的 CMake 脚本调用,因此如果你后面遇到 CMake 找不到某些内容的报错,不妨首先考虑环境变量问题。使用你喜欢的编辑器打开 ~/.bashrc,在末尾添加上下面的内容,假定TOOLCHAIN_PATH作为工具链的解压目录(需要满足在TOOLCHAIN_PATH\bin下可以找到riscv32-elf-gcc),HPM_SDK_PATH 作为 hpm_sdk 的解压目录。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

# for nds32le-elf-newlib-v5export HPM_SDK_BASE=HPM_SDK_PATHexport GNURISCV_TOOLCHAIN_PATH=TOOLCHAIN_PATHexport HPM_SDK_TOOLCHAIN_VARIANT=nds-gcc
# for riscv-unknow-elfexport HPM_SDK_BASE=HPM_SDK_PATHexport GNURISCV_TOOLCHAIN_PATH=TOOLCHAIN_PATH最后,我们更新环境变量并安装一些 Python 库。如果你在 pip 安装这个过程失败了,请考虑环境变量设置是否正确

  •  
  •  

source ~/.bashrcpip3 install --user -r "$HPM_SDK_BASE/scripts/requirements.txt

OpenOCD设置


OpenOCD 使用一系列配置文件描述电路板的调试器和芯片,这些内容均存放在 `hpm_sdk/boards/openocd/` 路径之下。为了方便起见,我们需要创建一个板级 OpenOCD 描述文件,放置在该目录下。以 hpm6750evkmini 为例,内容如下,请将 HPM_SDK_BASE 替换为你的 sdk 路径。其他开发板请自行对照内容配置文件内容修改

  •  
  •  
  •  
  •  
  •  

# /hpm_sdk/boards/openocd/hpm6750evkmini.cfg
source $HPM_SDK_BASE/boards/openocd/probes/ft2232.cfgsource $HPM_SDK_BASE/boards/openocd/soc/hpm6750-single-core.cfgsource $HPM_SDK_BASE/boards/openocd/boards/hpm6750evkmini.cfg

CLion配置

启动 CLion,打开 hpm_sdk/sample/coremark 项目,打开 Setting

 

1 Toolchain

新建一个 System 类型的工具链并命名为 nds-v5,修改 C/C++ 编译器和 GDB 的路径为 nds-gcc 的可执行文件路径,如下图所示。如果使用 riscv-unknow-elf,则选择对应的路径。

 

2 CMake

打开 CMake 栏,在 CMake Option 中加入下面的语句,并根据你的喜好修改名称,如下所示

  •  

-DBOARD=hpm6750evkmini -DCMAKE_BUILD_TYPE=flash_sdram_xipHPM_SDK 需要根据开发板类型配置各种编译选项,因此首先需要通过 CMake 给出板子名称。后一项则是选择了 flash_sdram_xip 这一预设内存布局,关于这方面内容,可以参考 hpm6750 手册和相关测评文章。在明白其意义的前提下,你可以根据个人需求对这两项选项进行修改。完成这两步以后,你应该可以编译 coremark 工程了。

 

3 配置 OpenOCD 路径

打开选项中的嵌入式部署,将 OpenOCD 路径设置为刚刚你所设置的 OpenOCD,注意,只能选用 HPMicro 提供的 OpenOCD,如果你已有在使用的 OpenOCD,又不想更换,可能只能选择其他方式(如命令行)进行下载和调试。

 

4 配置 OpenOCD 目标

点击 Run/Debug Target 窗口,点击 Edit Configureations ..点击右上角“+”添加一个 OpenOCD Download & Run,按图示配置 Target、Excutable binary、Debugger 和 Board config file,保存后退出。

 

5 编译下载和 coremark 跑分

将 hpm6750evkmin 连接到电脑,点击 Run 绿色箭头,程序自行编译下载。打开串口终端,获得 coremark 跑分结果

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

 hpm6750evkmini clock summary==============================cpu0:            816000000Hzcpu1:            816000000Hzaxi0:            200000000Hzaxi1:            200000000Hzaxi2:            200000000Hzahb:             200000000Hzmchtmr0:         24000000Hzmchtmr1:         1000000Hzxpi0:            133333333Hzxpi1:            400000000Hzdram:            166666666Hzdisplay:         74250000Hzcam0:            59400000Hzcam1:            59400000Hzjpeg:            200000000Hzpdma:            200000000Hz==============================
----------------------------------------------------------------------$$\   $$\ $$$$$$$\  $$\      $$\ $$\$$ |  $$ |$$  __$$\ $$$\    $$$ |\__|$$ |  $$ |$$ |  $$ |$$$$\  $$$$ |$$\  $$$$$$$\  $$$$$$\   $$$$$$\$$$$$$$$ |$$$$$$$  |$$\$$\$$ $$ |$$ |$$  _____|$$  __$$\ $$  __$$\$$  __$$ |$$  ____/ $$ \$$$  $$ |$$ |$$ /      $$ |  \__|$$ /  $$ |$$ |  $$ |$$ |      $$ |\$  /$$ |$$ |$$ |      $$ |      $$ |  $$ |$$ |  $$ |$$ |      $$ | \_/ $$ |$$ |\$$$$$$$\ $$ |      \$$$$$$  |\__|  \__|\__|      \__|     \__|\__| \_______|\__|       \______/----------------------------------------------------------------------2K performance run parameters for coremark.CoreMark Size    : 666Total ticks      : 315580897Total time (secs): 13.149204Iterations/Sec   : 4563.013838Iterations       : 60000Compiler version : GCC10.3.0Compiler flags   : -Wall -Wno-format -fomit-frame-pointer -fno-builtin -ffunction-sections -fdata-sections -g -O3 -funroll-all-loops -finline-limit=600 -ftree-dominator-opts -fno-if-conversion2 -fselective-scheduling -fno-code-hoisting -mstrict-alignMemory location  : STACKseedcrc          : 0xe9f5[0]crclist       : 0xe714[0]crcmatrix     : 0x1fd7[0]crcstate      : 0x8e3a[0]crcfinal      : 0xbd59Correct operation validated. See README.md for run and reporting rules.CoreMark 1.0 : 4563.013838 / GCC10.3.0 -Wall -Wno-format -fomit-frame-pointer -fno-builtin -ffunction-sections -fdata-sections -g -O3 -funroll-all-loops -finline-limit=600 -ftree-dominator-opts -fno-if-conversion2 -fselective-scheduling -fno-code-hoisting -mstrict-align / STACK

由于我们构建的是 debug 版本,4563 的分数距离标称值稍弱。如果 CMake Options 选择 release 版本,则可以得到和标称结果基本一致的跑分

  •  

-DCMAKE_BUILD_TYPE=flash_sdram_xip_release

知乎作者原文链接 (https://zhuanlan.zhihu.com/p/564229673

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分