Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ config RT_USING_ASM_MEMCPY
bool
default n

config RT_KSERVICE_USING_TINY_FFS
bool "Enable kservice to use tiny ffs"
default n

endmenu

menuconfig RT_DEBUG
Expand Down
26 changes: 26 additions & 0 deletions src/kservice.c
Original file line number Diff line number Diff line change
Expand Up @@ -1353,6 +1353,31 @@ RTM_EXPORT(rt_free_align);
#endif /* RT_USING_HEAP */

#ifndef RT_USING_CPU_FFS
#ifdef RT_KSERVICE_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,
Expand Down Expand Up @@ -1398,6 +1423,7 @@ int __rt_ffs(int value)

return __lowest_bit_bitmap[(value & 0xff000000) >> 24] + 25;
}
#endif /* RT_KSERVICE_USING_TINY_FFS */
#endif /* RT_USING_CPU_FFS */

#ifdef RT_DEBUG
Expand Down