gpt4 book ai didi

c - 如何将位域(通过引用)传递给函数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:17 24 4
gpt4 key购买 nike

我的问题是如何通过引用函数来传递位域实例。我已按如下所示执行此操作,但是当我输入函数 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 的函数原型(prototype)为:

void DAC_set_gain_code(uint8_t channel_u8, int8_t gain_code_i8, GAIN_REG_st *GAIN);

感谢任何建议。

谢谢。

最佳答案

由于此代码的真正用途是写入硬件寄存器,因此填充和字段对齐/排序等问题确实很重要。

我怀疑编译器使用的是 32 位整数,并且该结构被填充为 32 位,但在调试的实际代码中,GAIN_X 不是本地变量,您传递的是 0xNNNNNNN(或等效值)-并且地址不在“正确”边界上(很有可能,因为它是一个 24 位寄存器)。编译器会假定您传递的是一个指向真正的 GAIN_REG_st 的指针,而不是一个类型双关地址,因此可能对对齐做出了假设。

要直接从 C/C++ 访问硬件,您需要知道编译器如何处理此类内容,并确保小心地对编译器撒谎。

关于c - 如何将位域(通过引用)传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5675299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com