📄 fbit_gen.c
字号:
}
#endif
if ((bf & 0x000F) == 0)
{
bit |= 4;
bf >>= 4;
}
if ((bf & 0x0003) == 0)
{
bit |= 2;
bf >>= 2;
}
if ((bf & 0x0001) == 0)
{
bit |= 1;
}
#if (POSCFG_ROUNDROBIN == 0)
return bit;
#else /* POSCFG_ROUNDROBIN */
return (bit + rrOffset) & (MVAR_BITS - 1);
#endif /* POSCFG_ROUNDROBIN */
}
#else /* POSCFG_FBIT_BITSHIFT */
/*
* Fast generic findbit() -function for 8/16/32 bit architectures.
* The code supports roundrobin and standard-scheduling.
*
* Speed:
* 8 bit: 3 if-branches
* 16 bit: 4 if-branches
* 32 bit: 5 if-branches
*
* When roundrobin is enabled, also two shift-, one and-, one or-
* and one addition operation are needed.
*
* Note:
* This function can be used for architectures that
* are slow in bit shifting. This function may
* be used for 8 or 16 bit architectures.
*/
#if (POSCFG_ROUNDROBIN == 0)
UVAR_t p_pos_findbit(const UVAR_t bitfield)
{
UVAR_t bf = bitfield;
UVAR_t bit;
#else /* POSCFG_ROUNDROBIN */
UVAR_t p_pos_findbit(const UVAR_t bitfield, UVAR_t rrOffset)
{
UVAR_t bf;
UVAR_t bit;
bf = (bitfield << (MVAR_BITS - rrOffset)) | (bitfield >> rrOffset);
#endif /* POSCFG_ROUNDROBIN */
#if (MVAR_BITS == 32)
if (bf & 0x0000FFFF) {
#endif
#if (MVAR_BITS >= 16)
if (bf & 0x00FF) {
#endif
if (bf & 0x0F) {
if (bf & 0x03) {
if (bf & 0x01) {
bit = 0;
} else {
bit = 1;
}
} else {
if (bf & 0x04) {
bit = 2;
} else {
bit = 3;
}
}
} else {
if (bf & 0x30) {
if (bf & 0x10) {
bit = 4;
} else {
bit = 5;
}
} else {
if (bf & 0x40) {
bit = 6;
} else {
bit = 7;
}
}
}
#if (MVAR_BITS >= 16)
} else {
if (bf & 0x0F00) {
if (bf & 0x0300) {
if (bf & 0x0100) {
bit = 8;
} else {
bit = 9;
}
} else {
if (bf & 0x0400) {
bit = 10;
} else {
bit = 11;
}
}
} else {
if (bf & 0x3000) {
if (bf & 0x1000) {
bit = 12;
} else {
bit = 13;
}
} else {
if (bf & 0x4000) {
bit = 14;
} else {
bit = 15;
}
}
}
}
#endif
#if (MVAR_BITS == 32)
} else {
if (bf & 0x00FF0000) {
if (bf & 0x000F0000) {
if (bf & 0x00030000) {
if (bf & 0x00010000) {
bit = 16;
} else {
bit = 17;
}
} else {
if (bf & 0x00040000) {
bit = 18;
} else {
bit = 19;
}
}
} else {
if (bf & 0x00300000) {
if (bf & 0x00100000) {
bit = 20;
} else {
bit = 21;
}
} else {
if (bf & 0x00400000) {
bit = 22;
} else {
bit = 23;
}
}
}
} else {
if (bf & 0x0F000000) {
if (bf & 0x03000000) {
if (bf & 0x01000000) {
bit = 24;
} else {
bit = 25;
}
} else {
if (bf & 0x04000000) {
bit = 26;
} else {
bit = 27;
}
}
} else {
if (bf & 0x30000000) {
if (bf & 0x10000000) {
bit = 28;
} else {
bit = 29;
}
} else {
if (bf & 0x40000000) {
bit = 30;
} else {
bit = 31;
}
}
}
}
}
#endif
#if (POSCFG_ROUNDROBIN == 0)
return bit;
#else /* POSCFG_ROUNDROBIN */
return (bit + rrOffset) & (MVAR_BITS - 1);
#endif /* POSCFG_ROUNDROBIN */
}
#endif /* POSCFG_FBIT_BITSHIFT */
#else /* FASTCODE */
#if (POSCFG_ROUNDROBIN == 0)
/*
* Slow but small generic findbit() -function for all architectures.
* The code supports standard-scheduling.
*
*/
UVAR_t p_pos_findbit(const UVAR_t bitfield)
{
UVAR_t bf = bitfield;
UVAR_t bit;
for (bit = 0; bit < MVAR_BITS; bit++)
{
if (bf & 1)
break;
bf >>= 1;
}
return bit;
}
#else /* POSCFG_ROUNDROBIN */
/*
* Slow but small generic findbit() -function for all architectures.
* The code supports roundrobin-scheduling.
*
*/
UVAR_t p_pos_findbit(const UVAR_t bitfield, UVAR_t rrOffset)
{
UVAR_t bf;
UVAR_t bit;
bf = (bitfield << (MVAR_BITS - rrOffset)) | (bitfield >> rrOffset);
for (bit = 0; bit < MVAR_BITS; bit++)
{
if (bf & 1)
break;
bf >>= 1;
}
return (bit + rrOffset) & (MVAR_BITS - 1);
}
#endif /* ROUNDROBIN */
#endif /* FASTCODE */
#endif /* POSCFG_FBIT_USE_LUTABLE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -