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 ] =================================================================
等待编译完成即可