辛亚平的博客专栏

在 Vivado SDK/Vitis 中使用 byteorder.h

byteorder.h 是用于将整型数值在本机字节序与大端字节序或小端字节序之间进行转换的很好用的开源程序,之前在 Windows 和 Linux 平台使用,非常方便。然而,今天在进行 Zynq 7020 的 PS 端开发的时候,无法在 SDK 开发环境中编译通过。

原因:原版的 byteorder.h 并没有对 Zynq 平台进行支持。如下图所示:
image

上面这段代码考虑了很多处理器平台,然而其中却并没有 Zynq 平台。

我们的 Zynq 7020 芯片,其 PS 端ARM核采用的是双核 ARMv7-A 架构。
image

查一下 ARMv7-A 处理器在 gcc 中的宏定义:https://sourceforge.net/p/predef/wiki/Architectures/
如图所示:
image

所以,解决办法如是:在 byteorder.h 中增加对 ARM_ARCH_7A 的支持,如下所示:
image

代码片段如下:

#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

posted on 2025-03-24 22:05  辛亚平  阅读(25)  评论(0)    收藏  举报

导航