我有以下
/* Size 16 bytes */
typedef struct __attribute__((packed)) {
uint16_t v1; // 2
uint16_t v2; // 2
uint16_t v3; // 2
uint16_t v4; // 2
uint8_t rsvd[6];
uint16_t crc; // 2
} heCell_t;
typedef struct __attribute__((packed)) {
heCell_t c0;
heCell_t c1;
heCell_t c2;
heCell_t c3;
} hePag_t;
typedef union {
hePag_t Page[32];
heCell_t Cell[128];
} heData_t;
由于gcc警告: "为.rodata设置不正确的部分属性。$ Flash3"
这一行
const heData_t heData __RODATA(Flash3);
我必须用某些东西初始化heData,这对我很好,只要所有值都是0xFF(默认闪存擦除)
const heData_t heData __RODATA(Flash3) = { 0xFF };
但是有一些警告
(near initialization for 'heData.Page[0]') [-Wmissing-braces]
答案 0 :(得分:2)
这将清除警告:
const heData_t heData __RODATA(Flash3)={.Page={{{0xff}}}};
但是只有第一个字节是0xff,其余都是0x00。要解决这个问题,你可以尝试(使用gcc):
typedef union {
hePag_t Page[32];
heCell_t Cell[128];
uint8_t bytes[128*sizeof(heCell_t)];
} heData_t
...
const heData_t heData __RODATA(Flash3)={.bytes[0 ... 128*sizeof(heCell_t)-1]=0xff};
这将使用0xff初始化所有数据。
答案 1 :(得分:2)
我必须用某些东西初始化heData,这对我来说很好,只要所有值都是0xFF(默认闪存擦除)。
使用不等于零的值初始化对象或其中任何一部分的唯一方法是为该部分提供显式初始值设定项。您有一个适度大的对象可以使用显式初始化器进行初始化,但由于您希望使用重复模式对其进行初始化,因此预处理器可以为您提供帮助。这是一种方法:
#define TWICE(...) __VA_ARGS__, __VA_ARGS__
#define FOUR_TIMES(...) TWICE(__VA_ARGS__), TWICE(__VA_ARGS__)
#define SIXTEEN_TIMES(...) FOUR_TIMES(TWICE(__VA_ARGS__))
#define TIMES_128(...) SIXTEEN_TIMES(FOUR_TIMES(TWICE(__VA_ARGS__)))
/* Size 16 bytes */
typedef struct __attribute__((packed)) {
uint16_t v1; // 2
uint16_t v2; // 2
uint16_t v3; // 2
uint16_t v4; // 2
uint8_t rsvd[6];
uint16_t crc; // 2
} heCell_t;
typedef struct __attribute__((packed)) {
heCell_t c0;
heCell_t c1;
heCell_t c2;
heCell_t c3;
} hePag_t;
typedef union {
hePag_t Page[32];
heCell_t Cell[128];
} heData_t;
const heData_t heData __RODATA(Flash3) = {
.Cell = { TIMES_128(
{ 0xffff, 0xffff, 0xffff, 0xffff, { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, 0xffff})
}
};
虽然它比其他答案中提供的解决方案有点丑陋,但它是标准的C.(初始化部分是标准的,即从问题中继承的GNU扩展。)