summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-12-12 12:21:38 +0700
committerhathach <[email protected]>2013-12-12 12:21:38 +0700
commit51b6c6ff41e17560ae054298e68762298d0f5d7c (patch)
treec7aca9d5480599d13506a7a87eb4828beff3ee7e
parent4d14e2ac50dfa137d8b761825011c3a4e97cf26d (diff)
implement inline bit manipulation function
-rw-r--r--tests/lpc18xx_43xx/test/test_binary.c (renamed from tests/lpc18xx_43xx/test/test_binary_const.c)44
-rw-r--r--tinyusb/common/assertion.h6
-rw-r--r--tinyusb/common/binary.h58
-rw-r--r--tinyusb/common/common.h8
-rw-r--r--tinyusb/common/primitive_types.h6
5 files changed, 88 insertions, 34 deletions
diff --git a/tests/lpc18xx_43xx/test/test_binary_const.c b/tests/lpc18xx_43xx/test/test_binary.c
index 5d69c994f..fb61df0fa 100644
--- a/tests/lpc18xx_43xx/test/test_binary_const.c
+++ b/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)));
+}
diff --git a/tinyusb/common/assertion.h b/tinyusb/common/assertion.h
index 7d8b3fcba..91d10632b 100644
--- a/tinyusb/common/assertion.h
+++ b/tinyusb/common/assertion.h
@@ -36,12 +36,6 @@
*/
/**************************************************************************/
-/** \file
- * \brief TBD
- *
- * \note TBD
- */
-
/** \ingroup TBD
* \defgroup TBD
* \brief TBD
diff --git a/tinyusb/common/binary.h b/tinyusb/common/binary.h
index 0badd6b3b..d704f93b8 100644
--- a/tinyusb/common/binary.h
+++ b/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))
diff --git a/tinyusb/common/common.h b/tinyusb/common/common.h
index 2cd29417f..399b419b9 100644
--- a/tinyusb/common/common.h
+++ b/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) )
diff --git a/tinyusb/common/primitive_types.h b/tinyusb/common/primitive_types.h
index fe761d163..0f2fe733e 100644
--- a/tinyusb/common/primitive_types.h
+++ b/tinyusb/common/primitive_types.h
@@ -36,12 +36,6 @@
*/
/**************************************************************************/
-/** \file
- * \brief TBD
- *
- * \note TBD
- */
-
/** \ingroup TBD
* \defgroup TBD
* \brief TBD