5

我正在编写一些嵌入式代码以通过 SPI 与外部设备交互。该设备有几个不同长度的寄存器,为了帮助保持直截了当,我定义了以下结构

typedef struct
{
    uint16_t    Signed          :1;  // Register is signed or unsigned
    uint16_t    CommLengthBytes :3;  // The width of the register in bytes 
    uint16_t    Address         :12; // Register address
}ts_register;

然后,我在源代码中定义了每个寄存器,如下所示

static const ts_register    SAGCYC      = {0, 1, 0x000};
static const ts_register    DISNOLOAD   = {0, 1, 0x001};
static const ts_register    LCYCMODE    = {0, 1, 0x004};
static const ts_register    IRMSA       = {0, 4, 0x31A};
static const ts_register    IRMSB       = {0, 4, 0x31B};
static const ts_register    VRMS        = {0, 4, 0x31C};

等等

我有一个函数,它将获取一个指向 ts_registers 数组的指针,并将读取数组中所有寄存器所需的 SPI 传输排队,并调用回调函数来处理回复

当我尝试使要读取的 ts_registers 数组如下时出现我的问题:

ts_register regs_to_read[3] = {VRMS, IRMSA, IRMSB};

这会产生错误:“表达式必须有一个常量值”3 次(每个数组元素一次)。

由于它们被定义为常量,我忽略了什么?

4

4 回答 4

8

由于它们被定义为常量,我忽略了什么?

在 C 中使用const修饰符声明的对象不是真正的常量。const 的更好名称可能是readonly- 它的真正含义是编译器不会让更改它。而且您需要真正的常量来初始化具有静态存储的对象(我怀疑regs_to_read是全局的)。

您可以尝试regs_to_read在其他任何东西使用该数组之前分配一个调用的函数。

于 2012-07-28T16:20:10.000 回答
2

const 不会在编译时使它们成为常量。让它们#defines,编译器会很高兴。

于 2012-07-28T16:21:08.767 回答
1

我认为这可能是编译器问题,了解您的平台以及如何构建此代码会很有帮助。我只是拿走了你的大部分代码,修改它来编译它,并在 Linux 上使用 gcc 编译。没有任何警告。

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

typedef struct
{
    uint16_t    Signed          :1;  // Register is signed or unsigned
    uint16_t    CommLengthBytes :3;  // The width of the register in bytes 
    uint16_t    Address         :12; // Register address
}ts_register;

int main(int argc, char **argv) {

    static const ts_register    SAGCYC      = {0, 1, 0x000};
    static const ts_register    DISNOLOAD   = {0, 1, 0x001};
    static const ts_register    LCYCMODE    = {0, 1, 0x004};
    static const ts_register    IRMSA       = {0, 4, 0x31A};
    static const ts_register    IRMSB       = {0, 4, 0x31B};
    static const ts_register    VRMS        = {0, 4, 0x31C};

    ts_register regs_to_read[3] = {VRMS, IRMSA, IRMSB};

    return(0);
}

您是否尝试过强制转换值?这并不总是最好的做法,但会让你绕过错误。

您是否考虑过创建#define 条目?

另外,请注意 const 在 C 中需要一些时间来适应。它们的行为并不总是像您预期的那样。

于 2012-07-28T16:33:08.320 回答
0

如果regs_to_read在任何函数范围内声明,则错误将被清除。

于 2021-09-28T13:57:29.983 回答