关于noinit定义:noinit段指的是芯片SRAM的一块内存区域(注意是RAM区而非Flash),在该段定义的变量、或者函数,在除了掉电之外的任何芯片复位的情况下都不会被重新初始化。
关于noinit作用:no_init段常用来保存一些敏感信息,特殊应用场合下的不能被复位的数据或者做复位判断标志等数据。这个功能可以配合flash存储,在短期内以noinit RAM保持数据,在关键节点再将数据写进flash,以达到减少flash擦写次数的操作次数。
1、关于CH32V系列MCU设置noinit变量,具有以下3种方法:
方法1:按照下图配置,使用__attribute__((section(".noinit")))定义变量,但需要注意,noinit变量放在RAM中,不能初始化,变量开始值是一个随机值。
方法2:参考下图,需要配置ld文件,ld文件修改如下:
ld文件: .noinit : { . = ALIGN(4); KEEP(*(*.inot*)) }>NOINIT main文件: volatile uint32_t test __attribute__((section(".inot"))) ;
方法3:参考下图,需先定义一个结构体,然后位置放在RAM区域内,对结构体变量进行运算。
typedef struct { __IO uint32_t a; __IO uint32_t b; __IO uint32_t n; } test; #define T_V ((test *) 0X20003000)
2、关于CH32F系列MCU设置noinit变量(2种方法)
第一步:按照下图勾选No Init
第二步:按照下图方法1或者方法2配置
方法1:
#define __noinit__ __attribute__((zero_init)) // 变量不初始化为0 __noinit__ int tmp; // 变量前加上宏__noinit__
方法2:
__attribute__((zero_init)) int tmp;
标签:__,noinit,CH32,RAM,uint32,MCU,下图,变量 From: https://www.cnblogs.com/liaigu/p/17784475.html