我写了一些嵌入式代码有超过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倍(每个数组元素一次)。
由于他们被定义为常数,你有什么我忽略了?
由于他们被定义为常数,你有什么我忽略了?
在C与声明的对象const
修饰符不是真正的常量 。 为常量一个更好的名字可能会是readonly
-它真正的意思是,编译器不会让你改变它。 而你需要真正的常量来初始化静态存储(我怀疑对象regs_to_read
是全球性的)。
你可以尝试分配regs_to_read
在别的之前调用函数使用数组。
常量并不能让他们在编译时间常数。 让他们#define和编译器会很高兴。
我觉得这可能是一个编译器的问题,这将有助于了解你的平台,你是如何构建这个代码。 我只是把大部分代码,篡改它,编译它,并使用gcc在Linux上编译。 有没有警告。
#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项?
另外,请注意consts需要一点时间来适应在C.他们并不总是表现得你所期望的方式。