summaryrefslogtreecommitdiff
path: root/src/kservice.c
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2021-11-11 10:18:29 +0800
committerGitHub <[email protected]>2021-11-11 10:18:29 +0800
commit301856ac95b8aa536489f066856b8da90cffe591 (patch)
tree282789c7686d22b9044c5d0bbb973013c75567de /src/kservice.c
parente6ae01e3326a5feb6d11176c3407bee7c920399c (diff)
parent216cd309eae96ae3b06e3657fd0f9978569561e4 (diff)
Merge pull request #5063 from Eureka1024/master
[kernel]增加一种新的查找字节最低非0位的算法
Diffstat (limited to 'src/kservice.c')
-rw-r--r--src/kservice.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/kservice.c b/src/kservice.c
index 4ed30f3237..6a42b92047 100644
--- a/src/kservice.c
+++ b/src/kservice.c
@@ -1360,6 +1360,31 @@ RTM_EXPORT(rt_free_align);
#endif /* RT_USING_HEAP */
#ifndef RT_USING_CPU_FFS
+#ifdef RT_USING_TINY_FFS
+const rt_uint8_t __lowest_bit_bitmap[] =
+{
+ /* 0 - 7 */ 0, 1, 2, 27, 3, 24, 28, 32,
+ /* 8 - 15 */ 4, 17, 25, 31, 29, 12, 32, 14,
+ /* 16 - 23 */ 5, 8, 18, 32, 26, 23, 32, 16,
+ /* 24 - 31 */ 30, 11, 13, 7, 32, 22, 15, 10,
+ /* 32 - 36 */ 6, 21, 9, 20, 19
+};
+
+/**
+ * This function finds the first bit set (beginning with the least significant bit)
+ * in value and return the index of that bit.
+ *
+ * Bits are numbered starting at 1 (the least significant bit). A return value of
+ * zero from any of these functions means that the argument was zero.
+ *
+ * @return return the index of the first bit set. If value is 0, then this function
+ * shall return 0.
+ */
+int __rt_ffs(int value)
+{
+ return __lowest_bit_bitmap[(rt_uint32_t)(value & (value - 1) ^ value) % 37];
+}
+#else
const rt_uint8_t __lowest_bit_bitmap[] =
{
/* 00 */ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
@@ -1405,6 +1430,7 @@ int __rt_ffs(int value)
return __lowest_bit_bitmap[(value & 0xff000000) >> 24] + 25;
}
+#endif /* RT_USING_TINY_FFS */
#endif /* RT_USING_CPU_FFS */
#ifdef RT_DEBUG