【发布时间】:2011-04-15 10:20:01
【问题描述】:
我的问题是如何通过引用函数来传递位域实例。我已经按如下所示执行了此操作,但是当我输入函数 DAC_set_gain_code 时,处理器会引发中断故障。就通过位域而言,我所做的是否正确?
我已经创建了一个位域(见下文),它表示 DAC 芯片上的一个 24 位寄存器,我想将其写入并保存在 .h 文件中。
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;
}GAIN_REG_st;
我有一个像这样初始化位域的函数:
void init(void)
{
GAIN_REG_st GAIN_x; //Create instance of bitfield
//other code here...
DAC_set_gain_code(channel_u8, gain_code_i8, &GAIN_x); //Pass address of bitfield
return;
}
实际填充位域的函数如下所示:
void DAC_set_gain_code(uint8_t channel_u8, int8_t gain_code_i8, GAIN_REG_st *GAIN)
{
/* Populate ZERO_REG_st bitfield */
GAIN->rdwr_u8 = 0;
GAIN->not_used_u8 = 0;
if(channel_u8==0){
GAIN->address_u8 = GAIN_REGISTER_0;
}
else if(channel_u8==1){
GAIN->address_u8 = GAIN_REGISTER_1;
}
else if(channel_u8==2){
GAIN->address_u8 = GAIN_REGISTER_2;
}
else if(channel_u8==3){
GAIN->address_u8 = GAIN_REGISTER_3;
}
GAIN->data_u8 = gain_code_i8;
return;
}
hal_DAC_set_gain_code_uni 的函数原型是:
void DAC_set_gain_code(uint8_t channel_u8, int8_t gain_code_i8, GAIN_REG_st *GAIN);
任何建议表示赞赏。
谢谢。
【问题讨论】:
-
您发布的内容可能无法编译,或者您没有显示您实际使用的内容(函数名称不匹配、未声明的变量和/或未显示的全局变量以及未使用的参数)
-
还是不行。
ZERO未在您发布的内容中定义,GAIN未在DAC_set_gain_code中使用。 -
对帖子中的错误表示抱歉。现在应该与实际代码相同。我的主要问题是,我是否正确传递了位域的引用?
-
我的代码编译没有错误,所以未声明的变量和函数名不匹配不是问题。
-
嗯,是的,你正确地传递了一个指针(C 中没有引用本身)。但是您发布的代码仍然不是您所拥有的(GAIN 没有名为
data_u16的成员。您确定您的程序在该函数中死亡,而不是在它之后不久?
标签: c embedded device-driver microcontroller bit-fields