问题现象:
- 结构体为Pbcn
- 存在一个成员HostAvailabilityLeft
- 该成员为枚举类型
- 当进入函数赋值时,Pbcn.HostAvailabilityLeft变量观测正常
- 当退出函数时,Pbcn.HostAvailabilityLeft变量突变为异常值
- 通过取地址&观测 Pbcn.HostAvailabilityLeft变量地址,观测到当函数退出时,地址信息存在变化
- 且编译器信息中存在如下提示:“d:/nxp/s32ds.3.4/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-
eabi/bin/…/lib/gcc/arm-none-eabi/10.2.0/…/…/…/…/arm-none-eabi/lib/thumb/v7e-m+fp/hard\libnosys.a(_exit.o)uses variable-sizeenums yet the output is to use 32-bit enums, use of enum valuesacross objects may fail“
问题原因:
-
根据提示信息,可知道,该工程枚举变量占用内存是可变的,非固定方式,”variable-sizeenums“;
-
”枚举变量占用内存是可变的“是什么意思?
[ ] C标准中定义,“枚举型尺寸是能够容纳最大枚举子值的整数尺寸”,“枚举类型中枚举子的值必须要能用一个int型表述”。也就是说,枚举型的尺寸不能超过int型,但不必等于int型,只要能容纳最大枚举子就行[ ] 和编译器有关,多数编译器默认枚举为int类型,但存在编译器为节约内存,可以设置枚举为非int类型
[ ] S32K DS 使用的是GCC编译器,关于枚举类型占用内存,存在以下配置:
-fshort-enums - 非固定方式,至少1字节 (默认配置)
-fno-short-enums - 固定方式,4字节 -
由于压库的工程配置为默认配置(-fshort-enums),集成的工程配置为-fno-short-enums,导致代码运行时,不同的.c 存在不同的调试参数,导致变量数据异常。
问题解决:
- 将集成的工程配置改为 -fshort-enums或将压库的工程配置改为 -fno-short-enums,两者保持一致;
- 定义枚举类型时,定义最大值0xFFFFFFFF,强制分配4字节,如下:
typedef enum
{
...
ENUM_MAX = 0xFFFFFFFF,
}a;
END