HIFI5 DSP

基于 Cadence Xtensa HIFI5 DSP 进行开发,该DSP 具有:

  • 以 72 位元累加器支援每循环 8 个32x32 位元乘数累加器(multiplier-accumulators,MACs)
  • 在特定条件下,支援每循环 16 个 16x16 位元 MACs
  • 5 个超长指令集(VLIW) 插槽架构,能够每循环发出 2 个 128 位元负载
  • 备有向量浮点运算单元,提供高达每循环 16 个单精密度 IEEE 浮点运算 MAC

关于 XCC 与 Xtensa Xplorer

《xtensa_xcc_compiler_ug.pdf》 中这样介绍:

Xtensa C 和 C++编译器(XCC)是针对所有Xtensa处理器的高级优化编译器。XCC扩充了标准Xtensa GNU软件开发工具链、汇编器、链接器、调试器、库和二进制实用程序。虽然XCC的操作类似于标准GNUC和C++编译器(GCC),但XCC通过改进的优化和代码生成技术提供了对TIE(Tensilica指令扩展语言)的支持,以及卓越的执行性能和更小的编译代码大小。

而 Xtensa Xplorer IDE 是基于 Eclipse 的 IDE,方便调试。

既然 XCC 基于 GCC,那可不可以抛弃专有的 TIE,SIMD 加速指令,将HIFI5 作为一个单纯的 Xtensa LX7 来使用。

自行编译 GCC for HIFI5

为了编译交叉编译工具链,我们需要两个工具:

  • 目标核心的 xtensa-config-overlay.tar.gz 配置文件
  • https://github.com/crosstool-ng/crosstool-ng

config-overlay 是一个tar文件,其中包含各种工具链工具(如binutils、gcc和gdb)所需的处理器配置相关文件的修改版本。而 crosstool-ng 作为编译交叉编译工具链的脚本。

由于 HIFI5 使用的是 Xtensa LX7,我们可以寻找相同的 esp32-s3 的配置文件,也可以去奇妙的 FTP 上下载 HIFI5 使用的 xtensa-config-overlay.tar.gz,这里给一个下载的链接

转换 overlay

然后需要将这个overlay文件转换成对应的结构树,使用脚本 make-overlay.sh

wget https://raw.githubusercontent.com/foss-xtensa/xtensa-config/master/make-overlay.sh; chmod a+x make-overlay.sh

运行脚本,参数:./make-overlay.sh <core-name> <source-configuration-overlay> <result-directory>

./make-overlay.sh hifi5-dsp xtensa-config-overlay.tar.gz .

然后就会生成转换好了的 xtensa_hifi5-dsp.tar.gz

编译交叉编译工具链

首先安装 crosstool-ng 工具,参考官方文档 https://crosstool-ng.github.io/docs/install/,并且把转换后的 xtensa_hifi5-dsp.tar.gz 放到 /root/xtensa-hifi5-dsp 文件夹下

然后配置 ct-ng menuconfig 选择下列选项,这里使用的是 esp 所提供的 newlib 作为 clib

Target options  --->
	Target Architecture (xtensa)  --->
	Target Architecture Variant (Custom Xtensa processor configuration)  --->
	(hifi5-dsp) Custom processor configuration name
	(/root/xtensa-hifi5-dsp) Full path to custom configuration (overlay)
Toolchain options  --->
	(hifi5) Tuple's vendor string
Operating System  --->
	Target OS (bare-metal)  --->
C-library  --->
	C library (newlib)  --->
	Source of newlib (Vendor/custom repository)  --->
	VCS type (Git)  --->
	(https://github.com/espressif/newlib-esp32.git) Repository URL
	(esp-4.1.0_20230208) Branch/tag to check out

然后编译即可 ct-ng build

~# ct-ng build
[INFO ]  Performing some trivial sanity checks
[INFO ]  Build started 20230309.120257
[INFO ]  Building environment variables
[EXTRA]  Preparing working directories
[EXTRA]  Installing user-supplied crosstool-NG configuration
[EXTRA]  =================================================================
[EXTRA]  Dumping internal crosstool-NG configuration
[EXTRA]    Building a toolchain for:
[EXTRA]      build  = x86_64-pc-linux-gnu
[EXTRA]      host   = x86_64-pc-linux-gnu
[EXTRA]      target = xtensa-hifi5-elf
[EXTRA]  Dumping internal crosstool-NG configuration: done in 0.08s (at 00:01)
[INFO ]  =================================================================
[INFO ]  Retrieving needed toolchain components' tarballs
[EXTRA]    Retrieving 'newlib-git-ff0b7d93'
[EXTRA]    Checking out 'newlib-git-ff0b7d93' (git https://github.com/espressif/newlib-esp32.git, branch esp-4.1.0_20230208)
[EXTRA]    Saving 'newlib-git-ff0b7d93.tar.bz2' to local storage
[INFO ]  Retrieving needed toolchain components' tarballs: done in 17.37s (at 00:19)
[INFO ]  =================================================================
[INFO ]  Extracting and patching toolchain components
[EXTRA]    Extracting binutils-2.36.1
[EXTRA]    Patching binutils-2.36.1
[EXTRA]    Extracting gcc-11.1.0
[EXTRA]    Patching gcc-11.1.0
[EXTRA]    Extracting newlib-git-ff0b7d93
[EXTRA]    Patching newlib-git-ff0b7d93
[EXTRA]    Extracting gdb-9.2
[EXTRA]    Patching gdb-9.2
[INFO ]  Extracting and patching toolchain components: done in 39.76s (at 00:59)
[INFO ]  =================================================================
[INFO ]  Installing ncurses for build
[EXTRA]    Configuring ncurses
[EXTRA]    Building ncurses
[EXTRA]    Installing ncurses
[INFO ]  Installing ncurses for build: done in 17.54s (at 01:16)
[INFO ]  =================================================================

等待编译完成即可