这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » NOINIT内存段

共2条 1/1 1 跳转至

NOINIT内存段

院士
2026-05-24 23:02:38     打赏

NOINIT(No Initialization)内存段‌是嵌入式开发中RAM里一块特殊内存区域,核心特点是‌启动代码不会对该区域执行清零初始化‌,仅在彻底掉电时数据丢失,软件/看门狗/外部引脚等复位场景下数据会保持不变,它和常规内存段的核心区分如下:

1. 和常规内存段的核心差异

内存段初始化规则数据特性核心用途
NOINIT段启动时不执行清零/重新初始化只要不掉电,任意复位后保留原有值存储需要复位后保持状态的关键数据
.text段无初始化(只读)存储可执行代码/常量,掉电不丢程序指令、固定常量
.data段从Flash加载初始值到RAM存储已初始化的可读写全局/静态变量有明确初始值的全局变量
.bss段启动时统一清零初始化存储未初始化/零初始化的可读写变量,复位后值清零普通未初始化全局/静态变量
Flash/EEPROM掉电保留数据写入速度慢、擦写寿命有限长期掉电存储的数据

2. NOINIT段的核心价值(为什么需要单独区分)

相比其他存储介质,NOINIT段兼顾了两个优势:

  • 复位保留数据‌:只要不断电,任何复位都不会清空数据,实现"带着记忆重启"

  • 高速无寿命限制‌:在RAM中,读写速度和普通变量一致,没有Flash/EEPROM擦写寿命有限的问题,适合高频更新的数据

典型使用场景:累计运行时间、故障诊断记录、传感器校准参数、通信会话状态、死机黑匣子数据等。

3. 不同开发环境的实现区分

不同芯片/IDE/编译器创建NOINIT变量的方式不同,常见区分如下:

  • IAR IDE‌:支持三种方式:直接加__no_init关键字、用#pragma设置属性、#pragma location指定段

  • GCC环境‌:需要先修改链接脚本.ld,定义NOLOAD属性的.noinit段,再用__attribute__((section(".noinit")))声明变量,同时要保证BSS段不覆盖该区域

  • Keil MDK‌:可以直接配置额外RAM区域勾选NOINIT,或用__attribute__((zero_init))修饰变量





关键词: NOINIT    

院士
2026-05-25 16:48:31     打赏
2楼

谢谢分享,学习了。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]