瀏覽代碼

implement inline bit manipulation function

hathach 12 年之前
父節點
當前提交
51b6c6ff41

+ 40 - 4
tests/lpc18xx_43xx/test/test_binary_const.c → tests/lpc18xx_43xx/test/test_binary.c

@@ -1,6 +1,6 @@
 /**************************************************************************/
 /*!
-    @file     test_binary_const.c
+    @file     test_binary.c
     @author   hathach (tinyusb.org)
 
     @section LICENSE
@@ -48,7 +48,7 @@ void tearDown(void)
 {
 }
 
-void test_binary_8()
+void test_binary_8(void)
 {
   TEST_ASSERT_EQUAL_HEX8(0x00, BIN8(00000000));
   TEST_ASSERT_EQUAL_HEX8(0x01, BIN8(00000001));
@@ -65,7 +65,7 @@ void test_binary_8()
   TEST_ASSERT_EQUAL_HEX8(0xff, BIN8(11111111));
 }
 
-void test_binary_16()
+void test_binary_16(void)
 {
   TEST_ASSERT_EQUAL_HEX16(0x0000, BIN16(00000000, 00000000));
   TEST_ASSERT_EQUAL_HEX16(0x000f, BIN16(00000000, 00001111));
@@ -75,7 +75,7 @@ void test_binary_16()
   TEST_ASSERT_EQUAL_HEX16(0xffff, BIN16(11111111, 11111111));
 }
 
-void test_binary_32()
+void test_binary_32(void)
 {
   TEST_ASSERT_EQUAL_HEX32(0x00000000, BIN32(00000000, 00000000, 00000000, 00000000));
   TEST_ASSERT_EQUAL_HEX32(0x0000000f, BIN32(00000000, 00000000, 00000000, 00001111));
@@ -88,3 +88,39 @@ void test_binary_32()
   TEST_ASSERT_EQUAL_HEX32(0xf0000000, BIN32(11110000, 00000000, 00000000, 00000000));
   TEST_ASSERT_EQUAL_HEX32(0xffffffff, BIN32(11111111, 11111111, 11111111, 11111111));
 }
+
+void test_bit_set(void)
+{
+  TEST_ASSERT_EQUAL_HEX32( BIN8(00001101), bit_set( BIN8(00001001), 2));
+  TEST_ASSERT_EQUAL_HEX32( BIN8(10001101), bit_set( BIN8(00001101), 7));
+}
+
+void test_bit_clear(void)
+{
+  TEST_ASSERT_EQUAL_HEX32( BIN8(00001001), bit_clear( BIN8(00001101), 2));
+  TEST_ASSERT_EQUAL_HEX32( BIN8(00001101), bit_clear( BIN8(10001101), 7));
+}
+
+void test_bit_mask(void)
+{
+  TEST_ASSERT_EQUAL_HEX32(0x0000ffff, bit_mask(16));
+  TEST_ASSERT_EQUAL_HEX32(0x00ffffff, bit_mask(24));
+  TEST_ASSERT_EQUAL_HEX32(0xffffffff, bit_mask(32));
+}
+
+void test_bit_range(void)
+{
+  TEST_ASSERT_EQUAL_HEX32(BIN8(00001111), bit_mask_range(0, 3));
+  TEST_ASSERT_EQUAL_HEX32(BIN8(01100000), bit_mask_range(5, 6));
+
+  TEST_ASSERT_EQUAL_HEX32(BIN16(00001111, 00000000), bit_mask_range(8, 11));
+  TEST_ASSERT_EQUAL_HEX32(0xf0000000, bit_mask_range(28, 31));
+}
+
+void test_bit_set_range(void)
+{
+  TEST_ASSERT_EQUAL_HEX32(BIN8(01011001), bit_set_range(BIN8(00001001), 4, 6, BIN8(101)));
+
+  TEST_ASSERT_EQUAL_HEX32(BIN32(11001011, 10100000, 00000000, 00001001),
+                          bit_set_range(BIN8(00001001), 21, 31, BIN16(110, 01011101)));
+}

+ 0 - 6
tinyusb/common/assertion.h

@@ -36,12 +36,6 @@
 */
 /**************************************************************************/
 
-/** \file
- *  \brief TBD
- *
- *  \note TBD
- */
-
 /** \ingroup TBD
  *  \defgroup TBD
  *  \brief TBD

+ 44 - 14
tinyusb/common/binary.h

@@ -36,12 +36,6 @@
 */
 /**************************************************************************/
 
-/** \file
- *  \brief TBD
- *
- *  \note TBD
- */
-
 /** \ingroup TBD
  *  \defgroup TBD
  *  \brief TBD
@@ -56,18 +50,54 @@
  extern "C" {
 #endif
 
-/// n-th Bit
-#define BIT_(n) (1U << (n))
+#include "primitive_types.h"
+#include "compiler/compiler.h"
 
-/// set n-th bit of x to 1
-#define BIT_SET_(x, n) ( (x) | BIT_(n) )
+//------------- Bit manipulation -------------//
+#define BIT_(n) (1U << (n))                                ///< n-th Bit
+#define BIT_SET_(x, n) ( (x) | BIT_(n) )                   ///< set n-th bit of x to 1
+#define BIT_CLR_(x, n) ( (x) & (~BIT_(n)) )                ///< clear n-th bit of x
+#define BIT_TEST_(x, n) ( ((x) & BIT_(n)) ? true : false ) ///< check if n-th bit of x is 1
+
+static inline uint32_t bit_set(uint32_t value, uint8_t n) ATTR_CONST ATTR_ALWAYS_INLINE;
+static inline uint32_t bit_set(uint32_t value, uint8_t n)
+{
+  return value | BIT_(n);
+}
+
+static inline uint32_t bit_clear(uint32_t value, uint8_t n) ATTR_CONST ATTR_ALWAYS_INLINE;
+static inline uint32_t bit_clear(uint32_t value, uint8_t n)
+{
+  return value & (~BIT_(n));
+}
 
-/// clear n-th bit of x
-#define BIT_CLR_(x, n) ( (x) & (~BIT_(n)) )
+static inline bool bit_test(uint32_t value, uint8_t n) ATTR_CONST ATTR_ALWAYS_INLINE;
+static inline bool bit_test(uint32_t value, uint8_t n)
+{
+  return (value & BIT_(n)) ? true : false;
+}
+
+///< create a mask with n-bit lsb set to 1
+static inline uint32_t bit_mask(uint8_t n) ATTR_CONST ATTR_ALWAYS_INLINE;
+static inline uint32_t bit_mask(uint8_t n)
+{
+  return (n < 32) ? ( BIT_(n) - 1 ) : UINT32_MAX;
+}
+
+static inline uint32_t bit_mask_range(uint8_t start, uint32_t end) ATTR_CONST ATTR_ALWAYS_INLINE;
+static inline uint32_t bit_mask_range(uint8_t start, uint32_t end)
+{
+  return bit_mask(end+1) & ~ bit_mask(start);
+}
+
+static inline uint32_t bit_set_range(uint32_t value, uint8_t start, uint8_t end, uint32_t pattern) ATTR_CONST ATTR_ALWAYS_INLINE;
+static inline uint32_t bit_set_range(uint32_t value, uint8_t start, uint8_t end, uint32_t pattern)
+{
+   return ( value & ~bit_mask_range(start, end) ) | (pattern << start);
+}
 
-/// test n-th bit of x
-#define BIT_TEST_(x, n) ( ((x) & BIT_(n)) ? true : false )
 
+//------------- Binary Constant -------------//
 #if defined(__GNUC__) && !defined(__CC_ARM)
 
 #define BIN8(x)               ((uint8_t)  (0b##x))

+ 4 - 4
tinyusb/common/common.h

@@ -89,10 +89,10 @@
 //--------------------------------------------------------------------+
 // MACROS
 //--------------------------------------------------------------------+
-#define STRING_(x)  #x                             // stringify without expand
-#define XSTRING_(x) STRING_(x)                     // expand then stringify
-#define STRING_CONCAT_(a, b) a##b                  // concat without expand
-#define XSTRING_CONCAT_(a, b) STRING_CONCAT_(a, b) // expand then concat
+#define STRING_(x)  #x                             ///< stringify without expand
+#define XSTRING_(x) STRING_(x)                     ///< expand then stringify
+#define STRING_CONCAT_(a, b) a##b                  ///< concat without expand
+#define XSTRING_CONCAT_(a, b) STRING_CONCAT_(a, b) ///< expand then concat
 
 #define MAX_OF(a, b)  ( (a) > (b) ? (a) : (b) )
 #define MIN_OF(a, b)  ( (a) < (b) ? (a) : (b) )

+ 0 - 6
tinyusb/common/primitive_types.h

@@ -36,12 +36,6 @@
 */
 /**************************************************************************/
 
-/** \file
- *  \brief TBD
- *
- *  \note TBD
- */
-
 /** \ingroup TBD
  *  \defgroup TBD
  *  \brief TBD