先楫半导体HPMicro
直播中

liminqi

2年用户 14经验值
擅长:电源/新能源
私信 关注
[问答]

使用SEGGER Embedded Studio编译器发现变量无法自动初始化

使用SEGGER Embedded Studio编译器发现变量无法自动初始化,
例如声明静态变量static uint8_t i = 0;这种写法i成了静态变量,但没有初始化成功,声明的结构体也是需要主动初始化,否则这些变量的值不赋值的话各不一样,有没有哪个设置可以解决这个问题,我希望声明一个结构体或者变量后默认状态就是0

回帖(2)

杨福林

2024-1-11 16:02:14
在SEGGER Embedded Studio编译器中,可以通过使用全局变量初始化器来确保变量在声明时被初始化为默认值。

对于静态变量,你可以在声明时直接将其初始化为0。例如:

```
static uint8_t i = 0;
```

对于结构体,你可以使用以下方式来初始化变量为默认值:

```
struct myStruct {
    int a;
    float b;
};

struct myStruct myVar = {0};
```

上述代码将会将`myVar`结构体的成员变量`a`和`b`都初始化为0。

另外,你也可以使用以下方式来初始化结构体变量为默认值:

```
struct myStruct myVar = {0}; // 或者 .a = 0, .b = 0
```

这样就可以确保结构体的成员变量在声明时被初始化为默认值了。

如果你希望在整个项目中都使用默认值初始化变量,你可以在项目的链接脚本 (`*.ld` 文件) 中为全局变量段添加一个ZERO 表示的段。具体操作步骤如下:

1. 打开项目的链接脚本文件 (一般为 `*.ld` 或 `*.x`)。
2. 找到定义全局变量段(如 `.data`)的相关区域。
3. 添加一个具有ZERO 属性的段,例如:

```
.data :
{
    ...
} > RAM AT > FLASH
.ZERO (NOLOAD):
{
    *(.bss*)
} > RAM
```

这样,所有没有显式初始化的全局变量将会被放置在这个 `.ZERO` 段中,从而被初始化为默认值。

希望这能帮助到你解决问题!
举报

liminqi

2024-1-12 14:53:36
在声明时就初始化在这个编译器中无法生效,在代码中实测只能声明成哪种数据类型,初始化没有完成




现在有些数据是按照下面这种写法清零的,我想知道有没有一种高效的方法,不需要主动去初始化在声明时就自动初始化了

1 举报
  • to_be_mature: 请提供可以复现此问题的测试环境,包括sdk版本、evk型号,sample例程与源码

更多回帖

发帖
×
20
完善资料,
赚取积分