S32DS-“全局变量地址异常变化”之枚举类型导致

问题现象:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 结构体为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“

问题原因:

  1. 根据提示信息,可知道,该工程枚举变量占用内存是可变的,非固定方式,”variable-sizeenums“;

  2. ”枚举变量占用内存是可变的“是什么意思?
    [ ] C标准中定义,“枚举型尺寸是能够容纳最大枚举子值的整数尺寸”,“枚举类型中枚举子的值必须要能用一个int型表述”。也就是说,枚举型的尺寸不能超过int型,但不必等于int型,只要能容纳最大枚举子就行

    [ ] 和编译器有关,多数编译器默认枚举为int类型,但存在编译器为节约内存,可以设置枚举为非int类型

    [ ] S32K DS 使用的是GCC编译器,关于枚举类型占用内存,存在以下配置:
    -fshort-enums - 非固定方式,至少1字节 (默认配置)
    -fno-short-enums - 固定方式,4字节

  3. 由于压库的工程配置为默认配置(-fshort-enums),集成的工程配置为-fno-short-enums,导致代码运行时,不同的.c 存在不同的调试参数,导致变量数据异常。

问题解决:

  1. 将集成的工程配置改为 -fshort-enums或将压库的工程配置改为 -fno-short-enums,两者保持一致;
  2. 定义枚举类型时,定义最大值0xFFFFFFFF,强制分配4字节,如下:
typedef enum 
{
	...
	ENUM_MAX = 0xFFFFFFFF,
}a;

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值