我正在从事硬件RTL仿真项目。我想从使用C的现有固件中了解一些配置位的位置。但是,我无法理解某些语法。代码在头文件中,我不知道“ * field”和“ val”来自何处。
#define __BITFIELD(__type, __name, __bit, __width) \
static inline __type __name(volatile const void *field) \
{ \
volatile const __type *ptr = field; \
return (*ptr >> (__bit)) & __BIT_MASK(__type, __width); \
} \
static inline void __name##_set(volatile void *field, __type val) \
{ \
volatile __type *ptr = field; \
*ptr &= ~(__BIT_MASK(__type, __width) << (__bit)); \
*ptr |= (val & __BIT_MASK(__type, __width)) << (__bit); \
}
答案 0 :(得分:1)
field
和val
是参数。它们来自函数的签名,因此从字面上看,它们就是您传递给函数的任何内容。他们来自你...
答案 1 :(得分:0)
我认为__type
,__name
,__bit
和__width
来自第一行(以{{1}开头) }),看起来像一个函数声明,但#define
和field
不是。
val
不是函数声明,而是名为__BITFIELD(...)
的{{3}}定义。
定义此宏后,您可以编写如下内容:
__BITFIELD
然后CPP将该宏扩展为“真实的” C代码,用上面的文字输入替换宏参数:
__BITFIELD(uint16_t, enable_counter, 4, 1)
然后将编译此代码。
因此,您最终将获得一个带有static inline uint16_t enable_counter(volatile const void *field)
{
volatile const uint16_t *ptr = field;
return (*ptr >> (4)) & __BIT_MASK(uint16_t, 1);
}
...
参数的函数。