Commit from zer0 on branch b_zer0 (2008-05-11 17:04 CEST)
=================================
fix compilation with gcc 4.3
aversive include/aversive.h 1.1.2.5
aversive modules/encoding/hamming/hamming.c 1.2.4.4
===========================
aversive/include/aversive.h (1.1.2.4 -> 1.1.2.5)
===========================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: aversive.h,v 1.1.2.4 2008-04-27 12:59:45 zer0 Exp $
+ * Revision : $Id: aversive.h,v 1.1.2.5 2008-05-11 15:04:52 zer0 Exp $
*
*/
@@ -110,24 +110,85 @@
#define ABS(val) ( ((val) < 0) ? -(val) : (val) )
-/* byte extraction, not recommended for use
- * use only if you need speed optimization !
- * use ">>" instead for current operations
- */
-#define extr16_08_0(i) (*(char *)(&i)) // LSB of a 16bit
-#define extr16_08_1(i) (*((char *)(&i)+1)) // MSB of a 16bit
-
-#define extr32_16_0(i) (*(int *)(&i)) // LSB of a 32 bit
-#define extr32_16_1(i) (* (((int *)(&i)) +1)) // MSB of a 32 bit
-#define extr32_16_23(i) (*((int *)((char *)(&i)+1))) // middle of a 32 bit
-
-#define extr32_08_0(i) (*(char *)(&i)) // same stuff
-#define extr32_08_1(i) (*((char *)(&i)+1))
-#define extr32_08_2(i) (*((char *)(&i)+2))
-#define extr32_08_3(i) (*((char *)(&i)+3))
+/*
+ * Extract bytes and u16 from larger integer
+ */
+
+#if __BYTE_ORDER != __LITTLE_ENDIAN && __BYTE_ORDER != __BIG_ENDIAN
+# error "Endianness not defined"
+#endif
+
+struct extract32 {
+ union {
+ struct {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ uint8_t u8_0;
+ uint8_t u8_1;
+ uint8_t u8_2;
+ uint8_t u8_3;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ uint8_t u8_3;
+ uint8_t u8_2;
+ uint8_t u8_1;
+ uint8_t u8_0;
+#endif
+ } __attribute__ ((packed)) u8;
+ struct {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ uint16_t u16_0;
+ uint16_t u16_1;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ uint16_t u16_1;
+ uint16_t u16_0;
+#endif
+ } __attribute__ ((packed)) u16;
+ struct {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ uint8_t u8_0;
+ uint16_t u16_mid;
+ uint8_t u8_3;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ uint8_t u8_3;
+ uint16_t u16_mid;
+ uint8_t u8_0;
+#endif
+ } __attribute__ ((packed)) u16_b;
+ uint32_t u32;
+ } __attribute__ ((packed)) u;
+} __attribute__ ((packed));
+
+#define extr32_08_0(i) ({ struct extract32 __x; __x.u.u32 = i; __x.u.u8.u8_0;
})
+#define extr32_08_1(i) ({ struct extract32 __x; __x.u.u32 = i; __x.u.u8.u8_1;
})
+#define extr32_08_2(i) ({ struct extract32 __x; __x.u.u32 = i; __x.u.u8.u8_2;
})
+#define extr32_08_3(i) ({ struct extract32 __x; __x.u.u32 = i; __x.u.u8.u8_3;
})
+
+#define extr32_16_0(i) ({ struct extract32 __x; __x.u.u32 = i;
__x.u.u16.u16_0; })
+#define extr32_16_1(i) ({ struct extract32 __x; __x.u.u32 = i;
__x.u.u16.u16_1; })
+#define extr32_16_mid(i) ({ struct extract32 __x; __x.u.u32 = i;
__x.u.u16_b.u16_mid; })
+
+
+struct extract16 {
+ union {
+ struct {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ uint8_t u8_0;
+ uint8_t u8_1;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ uint8_t u8_1;
+ uint8_t u8_0;
+#endif
+ } __attribute__ ((packed)) u8;
+ uint16_t u16;
+ } __attribute__ ((packed)) u;
+} __attribute__ ((packed));
+
+#define extr16_08_0(i) ({ struct extract16 __x; __x.u.u16 = i; __x.u.u8.u8_0;
})
+#define extr16_08_1(i) ({ struct extract16 __x; __x.u.u16 = i; __x.u.u8.u8_1;
})
+
/* a few asm utilities */
+
#ifndef HOST_VERSION
#ifndef nop
#define nop() __asm__ __volatile__ ("NOP\n") /** nop instruction, 1 CPU cycle
consumed */
===========================================
aversive/modules/encoding/hamming/hamming.c (1.2.4.3 -> 1.2.4.4)
===========================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: hamming.c,v 1.2.4.3 2007-08-19 10:39:31 zer0 Exp $
+ * Revision : $Id: hamming.c,v 1.2.4.4 2008-05-11 15:04:53 zer0 Exp $
*
*/
@@ -28,7 +28,7 @@
/** \file hamming.c
* \brief Implementation for the Hamiing module.
*
- * \todo nothing.
+ * \todo use progmem to store tables !
*
* \test Seems to work
*
@@ -125,16 +125,14 @@
tmp = tab_abcd[(uint8_t)frame&0x0F];
-
- tmp |= ((uint32_t)((uint8_t) (((uint16_t)frame)>>4) & 0x7F)) << 8;
+ tmp |= (frame & 0x7F0) << 4;
-
- frame_middle = * (uint16_t *) ((uint8_t *)(&frame) + 1);
- tmp |= ((uint32_t)((uint8_t)(frame_middle >> 3))) << 16;
+ frame_middle = extr32_16_mid(frame);
+ tmp |= (uint32_t)(frame_middle & 0x7F8) << 13;
- frame_last = * ((uint8_t *)(&frame) + 2);
- tmp |= ((uint32_t)((uint8_t)(frame_last >> 3))) << 24 ;
+ frame_last = extr32_08_2(frame);
+ tmp |= (uint32_t)(frame_last >> 3) << 24 ;
return tmp;
}
_______________________________________________
Avr-list mailing list
[email protected]
CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive
WIKI : http://wiki.droids-corp.org/index.php/Aversive
DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/
BUGZILLA : http://bugzilla.droids-corp.org
COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog