在 Vivado SDK/Vitis 中使用 byteorder.h
byteorder.h 是用于將整型數(shù)值在本機字節(jié)序與大端字節(jié)序或小端字節(jié)序之間進行轉(zhuǎn)換的很好用的開源程序,之前在 Windows 和 Linux 平臺使用,非常方便。然而,今天在進行 Zynq 7020 的 PS 端開發(fā)的時候,無法在 SDK 開發(fā)環(huán)境中編譯通過。
原因:原版的 byteorder.h 并沒有對 Zynq 平臺進行支持。如下圖所示:

上面這段代碼考慮了很多處理器平臺,然而其中卻并沒有 Zynq 平臺。
我們的 Zynq 7020 芯片,其 PS 端ARM核采用的是雙核 ARMv7-A 架構(gòu)。

查一下 ARMv7-A 處理器在 gcc 中的宏定義:https://sourceforge.net/p/predef/wiki/Architectures/
如圖所示:

所以,解決辦法如是:在 byteorder.h 中增加對 ARM_ARCH_7A 的支持,如下所示:

代碼片段如下:
#ifndef BYTE_ORDER
// based on boost/detail/endian.hpp
#if defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) || \
defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) || \
defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN)
#define BYTE_ORDER LITTLE_ENDIAN
#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) || \
defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) || \
defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN)
#define BYTE_ORDER BIG_ENDIAN
#elif defined(__sparc) || defined(__sparc__) || \
defined(_POWER) || defined(__powerpc__) || \
defined(__ppc__) || defined(__hpux) || defined(__hppa) || \
defined(_MIPSEB) || defined(__s390__)
#define BYTE_ORDER BIG_ENDIAN
#elif defined(__i386__) || defined(__alpha__) || \
defined(__ia64) || defined(__ia64__) || \
defined(_M_IX86) || defined(_M_IA64) || \
defined(_M_ALPHA) || defined(__amd64) || \
defined(__amd64__) || defined(_M_AMD64) || \
defined(__x86_64) || defined(__x86_64__) || \
defined(_M_X64) || defined(__bfin__) || \
defined(__aarch64__) || \
defined(__ARM_ARCH_7A__)
#define BYTE_ORDER LITTLE_ENDIAN
#else
#error Unknown machine endianness detected.
#endif
#endif // BYTE_ORDER
浙公網(wǎng)安備 33010602011771號