此代码用于DAC芯片的驱动程序。
我下面有一个表示24位寄存器的位字段。因此,我需要做的是填充位域,并通过SPI将其写出到芯片。
typedef struct {
uint8_t rdwr_u8: 1;
uint8_t not_used_u8: 3;
uint8_t address_u8: 4;
uint8_t reserved_u8: 8;
uint8_t data_u8: 8;
uint8_t padding_u8: 8;
} GAIN_REG_st;在我的初始化函数中,我创建了一个联合,如下所示。
union{
GAIN_REG_st GAIN_st;
uint32_t G_32;
} G_u;现在,我需要将一个GAIN_REG_st位字段传递给一个函数,该函数将填充它。
一旦它被填充,我就可以将该位字段赋值给一个32位整数,并将该整数传递给一个低级函数以覆盖SPI。
当函数位于联合中时,如何将位字段GAIN_REG_st传递给该函数?(你能展示一个函数原型和调用吗)?
函数如何访问位域的成员?(它会像G_u.GAIN_st.rdwr_u8 = 1一样吗?)
发布于 2011-04-18 21:38:28
union G_u
the_union;
the_union.GAIN_st.address_u8 = 0x4;
function_call( &the_union );
void function_call( union G_u *the_union )
{
uint8
address;
address = the_union->GAIN_st.address_u8;
return;
}你是说这个吗?这是一个联盟,为什么要传递一个内部成员呢?这不会有任何不同。它们都从相同的内存偏移量开始。
发布于 2011-04-19 03:49:54
标题是关于通过工会,但问题是关于通过结构。您可以这样做,您只需相应地声明函数参数,并传递成员或整个联合。
所有当前的答案都演示了通过引用传递,但没有必要这样做,你可以通过复制传递,这对于最终为32位值的结构或联合不会更昂贵,并在被调用的函数中保存一个取消引用,因此可能更有效;
void fn( union G_u arg );
int main()
{
union G_u param;
...
fn( param );
}或者传递结构:
void fn( GAIN_REG_st arg );
int main()
{
GAIN_REG_st param;
...
fn( param );
}请注意,您可以使用以下结构来定义联合:
typedef union
{
GAIN_REG_st GAIN_st;
uint32_t G_32;
} G_u ;那么第一个例子将是简单的;
void fn( G_u arg );
int main()
{
G_u param;
...
fn( param );
}几乎可以肯定的是,传递结构或联合在开销上没有区别。这只是一个选择在哪里公开内部表示的知识的问题。
发布于 2011-04-18 21:37:17
原型:
int populateGainRegSt(GAIN_REG_st *st);该函数可以使用->运算符访问结构字段:
st->data_u8 = 1;用法:
G_u g;
...
populateGainRegSt( &(g.GAIN_st));https://stackoverflow.com/questions/5703671
复制相似问题