首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将位字段(通过引用)传递给函数?

如何将位字段(通过引用)传递给函数?
EN

Stack Overflow用户
提问于 2011-04-15 18:20:02
回答 2查看 4.3K关注 0票数 1

我的问题是如何通过引用函数来传递位域实例。我已经按如下所示执行了此操作,但是当我输入函数DAC_set_gain_code时,处理器抛出一个interupt错误。就传递位字段而言,我所做的是正确的吗?

我已经创建了一个位域(见下文),它代表了一个数模转换器芯片上的24位寄存器,我想把它写到.h文件中。

代码语言:javascript
复制
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;

我有一个初始化位域的函数,如下所示:

代码语言:javascript
复制
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;
 }

实际填充位域的函数如下所示:

代码语言:javascript
复制
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的函数原型是:

代码语言:javascript
复制
void DAC_set_gain_code(uint8_t channel_u8, int8_t gain_code_i8, GAIN_REG_st *GAIN);

任何建议都很感谢。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2011-04-26 03:01:16

由于此代码的实际用法是写入硬件寄存器,因此像填充和字段对齐/排序这样的问题确实很重要。

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

要直接从C/C++访问硬件,你需要知道编译器是如何处理这类事情的,并确保你仔细地欺骗了编译器。

票数 3
EN

Stack Overflow用户

发布于 2011-04-15 20:06:34

会不会是对齐问题?

也许你可以尝试你的编译器的对齐选项?或者试着在最后用一个虚拟的uint8填充你的结构?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5675299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档