I have checked Jens's motor.h
changes into the motor module SVN trunk. Those changes will
appear in the next release; R6.9
Ron
On 6/2/2014 2:28 AM, Torsten Bögershausen wrote:
On 2/7/14 18:02, [email protected] wrote:
Am 07.02.2014 16:56, schrieb Ron Sluiter:
On 2/7/2014 9:21 AM, [email protected]
wrote:
I suggest to remove the switch and
replace the occurrence of MSB_First
with the EPICS provided endianness switch:
+#include <epicsEndian.h>
-#ifdef MSB_First
+#if (EPICS_BYTE_ORDER == EPICS_ENDIAN_BIG)
Thanks for the suggestion but MSB_First/LSB_First is set to
indicate how
C/C++ bit fields are packed, not endianness.
To my knowledge and experience
(arm gcc & RVCT, x86 gcc & MSVC, powerpc gcc, sparc gcc)
the compiler fills
a bitfield with bits the same way it fills a machine word with
bytes.
In other words: the endianess for bits and bytes is the same,
either big or little.
Is there any chance to get Jens patch into motor.h ?
Either the short one (my favorite) or the long one ?
What compiler and compiler version are
you using?
I verified with the following compilers:
Linux 32bit/64bit (gcc4.7.4)
linux arm gcc-Version 4.7.2 20120731 (prerelease) (crosstool-NG
linaro-1.13.1+bzr2458 - Linaro GCC 2012.08)
powerpc-rtems4.10.2 (mvme2100 cpu=603e)
tornado-2.2 (CPU=MC68040)
At least for gcc bit field packing is LSB_first for little
endian and
MSB_first for big endian machines.
If you are afraid of breaking existing code, how about this:
#if defined(_WIN32) || defined(_M_IX86) || defined(_X86_)
#define LSB_First (TRUE) /* LSB is packed first. */
#elif defined(__i386__) || defined(_armv4l_) ||
defined(_X86_64_) ||
defined(__APPLE__)
#define LSB_First (TRUE) /* LSB is packed first. */
#elif defined(i386)
#define LSB_First (TRUE) /* LSB is packed first. */
#elif defined(sparc) || defined(m68k) || defined(powerpc)
#define MSB_First (TRUE) /* MSB is packed first. */
#elif defined(ppc603e)
#define MSB_First (TRUE) /* MSB is packed first. */
#elif defined(CPU) && ((CPU == PPC604) || (CPU ==
PPC603) || (CPU ==
PPC85XX) || (CPU == MC68040) || (CPU == PPC32))
#define MSB_First (TRUE) /* MSB is packed first. */
#elif defined(__GNUC__)
#include <epicsEndian.h>
#if (EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE)
#define LSB_First (TRUE)
#else
#define MSB_First (TRUE)
#endif
#else
#error: unknown bit order!
#endif
Jens
|