static关键字在C语言中是一个常用且重要的关键字,它的其中之一的功能之一是会使修饰过的变量只进行一次初始化。但是当你系统复位后(不断电的软件复位)由于会重新运行函数,即使是static修饰过的变量也会重新初始化,当我们想要获取复位之前的值时,通常是先将数值在复位之前保存进flash,当下次复位到来之前取出flash中的值。这种方法通常是可行的,但是如果在一些工控领域或者实时性高的地方就会显得很费时间,那么有没有一种办法来实现复位后不重新清零呢?在keil的分散加载中有一个关键字UNINIT 字面意思就是不进行初始化的意思。
首先修改分散加载文件在0x1000A000的RAM中定义一个MYRAM段用来保存我们需要修改的变量
名字为NO_INIT,然后用UNINIT来修饰后面接划分区域的大小,.ANY表示任何变量都可以使用此区域
LR_IROM1 0x00000000 0x00080000 { ; load region size_region
ER_IROM1 0x00000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x10000000 0x0000A000 { ; RW data
.ANY (+RW +ZI)
}
MYRAM 0x1000A000 UNINIT 0x00002000 {
.ANY (NO_INIT)
}
}
定义好我们要使用的段后我们可以使用关键字__attribute__来修饰变量
unsigned char my_var[100] __attribute__((section("NO_INIT"),zero_init));
至此我们的变量就不会被系统软件复位修改了
当你定义了一个变量并赋予初值时,例如int a = 10;此时他会被系统存储于RW段,我们系统复位后进行清零的操作的区域在ZI段。
也就是说只有定义的变量只为赋初值的变量才能用这个方法 例如 int A;此时系统会默认给变量A进行清零操作
此方法有一定的危险性请慎用