读一段程序,发现有点怪异,Big Endian 访问16位寄存器那段。 所有寄存器都是32位的,地址应该都是4字节对齐。 访问8位寄存器的时候还好理解,异或3就是把地址加3了。可是16位的时候仍然是异或3,这不就有问题了吗? 是程序的问题,还是我的理解不对?请探讨指教一下。 谢谢。 // BYTE Register access. // Individual and vectorized access to 8 bit registers. // Little-endian version or big-endian version that doesn't need address munging #if (CYG_BYTEORDER == CYG_LSBFIRST) || defined(HAL_IO_MACROS_NO_ADDRESS_MUNGING) #define HAL_READ_UINT8( _register_, _value_ ) \ ((_value_) = *((volatile CYG_BYTE *)(_register_))) #define HAL_WRITE_UINT8( _register_, _value_ ) \ (*((volatile CYG_BYTE *)(_register_)) = (_value_)) #else // Big-endian version #define HAL_READ_UINT8( _register_, _value_ ) \ ((_value_) = *((volatile CYG_BYTE *)((CYG_ADDRWORD)(_register_)^3))) #define HAL_WRITE_UINT8( _register_, _value_ ) \ (*((volatile CYG_BYTE *)((CYG_ADDRWORD)(_register_)^3)) = (_value_)) #endif // Big-endian ////======================================================================== // 16 bit access. // Individual and vectorized access to 16 bit registers. // Little-endian version or big-endian version that doesn't need address munging #if (CYG_BYTEORDER == CYG_LSBFIRST) || defined(HAL_IO_MACROS_NO_ADDRESS_MUNGING) #define HAL_READ_UINT16( _register_, _value_ ) \ ((_value_) = *((volatile CYG_WORD16 *)(_register_))) #define HAL_WRITE_UINT16( _register_, _value_ ) \ (*((volatile CYG_WORD16 *)(_register_)) = (_value_)) #else // Big-endian version #define HAL_READ_UINT16( _register_, _value_ ) \ ((_value_) = *((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3))) #define HAL_WRITE_UINT16( _register_, _value_ ) \ (*((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3)) = (_value_)) #endif // Big-endian //----------------------------------------------------------------------------- // 32 bit access. // Individual and vectorized access to 32 bit registers. // Note: same macros for little- and big-endian systems. #define HAL_READ_UINT32( _register_, _value_ ) \ ((_value_) = *((volatile CYG_WORD32 *)(_register_))) #define HAL_WRITE_UINT32( _register_, _value_ ) \ (*((volatile CYG_WORD32 *)(_register_)) = (_value_)) |