我的问题是如何通过引用函数来传递位域实例。我已经按如下所示执行了此操作,但是当我输入函数DAC_set_gain_code时,处理器抛出一个interupt错误。就传递位字段而言,我所做的是正确的吗?
我已经创建了一个位域(见下文),它代表了一个数模转换器芯片上的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);任何建议都很感谢。
谢谢。
发布于 2011-04-26 03:01:16
由于此代码的实际用法是写入硬件寄存器,因此像填充和字段对齐/排序这样的问题确实很重要。
我怀疑编译器正在使用32位it,并且这个结构被填充到32位,但在实际调试的代码中,GAIN_X不是本地变量,您传递的是0xNNNNNNNN(或等效变量)-并且地址不在“正确”边界上(很有可能,因为它是24位寄存器)。编译器将假定您传递的是一个指向实际GAIN_REG_st的指针,而不是一个类型双关地址,因此可能已经对对齐做出了假设。
要直接从C/C++访问硬件,你需要知道编译器是如何处理这类事情的,并确保你仔细地欺骗了编译器。
发布于 2011-04-15 20:06:34
会不会是对齐问题?
也许你可以尝试你的编译器的对齐选项?或者试着在最后用一个虚拟的uint8填充你的结构?
https://stackoverflow.com/questions/5675299
复制相似问题