KEIL分散加载的方式实现系统软件复位后,非初始化数据的不被清零

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进行清零操作

此方法有一定的危险性请慎用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值