关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | strongerHuang
有红绿蓝三种状态灯,常亮、闪烁,如果系统异常重启,或者看门狗复位,你想要保持复位前状态,你们有什么办法?这种问题,或者类似的问题,相信很多小伙伴都经历过,而且现实中的很多项目确实有这样的需求。其实就是让“状态变量”保持复位之前的数值,也就是变量不被初始化。变量不被初始化实现的方法有很多种,这里给大家讲讲在Keil、 IAR编译环境下,单片机变量不被初始化的实现方法。
处理器复位的方式有很多种,这里结合STM来讲述MCU复位的来源:STM32的复位为三类:系统复位、电源复位和后备域复位。1. 软件复位,备份区域复位可由设置备份域控制寄存器(RCC_BDCR)中的BDRST位产生。2. 在VDD和VBAT两者掉电的前提下, VDD或VBAT上电将引发备份区域复位。实现处理器复位而变量不被初始化方法之前,让我们先了解一下修饰符的知识。修饰符是用于限定类型以及类型成员申明的一种符号。如C语言中常见的修饰符:1.static静态修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用;2.extern声明修饰符:修饰变量,函数。修饰变量时候,变量的声明在外面;3.const常量修饰符:修饰变量,函数。修饰变量时候,不能被重复赋值,只能放在只读段中;4.volatile不稳定变量修饰符:这个变量不好翻译,在c中的作用大概有两点意思:A.表示变量是易失的,易变的; B.强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存。public公共访问修饰符、private私有访问修饰符、protected保护访问修饰符、friendly、abstract等。虽然这个修饰符不是C语言标准的修饰符,但在Keil、IAR这种集成开发环境中,他们支持这种修饰符。在默认情况下,编译器会将其变量存放在主RAM中,并在启动时对其进行初始化。而__no_init类型修饰符使编译器把变量放在非易失RAM区中,在启动时也不对它们进行初始化,也就是说__no_init在系统启动时不初始化变量。
在Keil中,__no_init不是标准的修饰符,需要进行配置,配置之后就可以使用了。#define __no_init __attribute__((zero_init))
Project -> Options for Targets -> Target,里面右下有个NoInit,这个就是需要我们配置的区域(可设定某一区域);__no_init uint16_t Cnt_NoInit;
提示:不能初始化这个变量(也就是定义时不要赋值)。在IAR中“__no_init”属于是一个关键字,你会发现在使用这个修饰符之后,字体都是关键字颜色。__no_init uint16_t Cnt_NoInit;
这里给大家分享两个简单的Demo(源码),Keil和IAR工程实现的功能一样。__no_inituint16_t Cnt_NoInit;uint16_t Cnt_Init = 100;
intmain(void){ System_Initializes();printf("Start...\n");
while(1) {printf("Cnt_NoInit = %d\n", Cnt_NoInit); Cnt_NoInit++;
if(Cnt_NoInit > 1000) { Cnt_NoInit = 0; }
printf("Cnt_Init = %d\n", Cnt_Init); Cnt_Init++;if(Cnt_Init > 1000) { Cnt_Init = 0; }
LED_ON; TIMDelay_Nms(500); LED_OFF; TIMDelay_Nms(500); NVIC_SystemReset(); }}
Start...Cnt_NoInit = 0Cnt_Init = 100
Start...Cnt_NoInit = 1Cnt_Init = 100
Start...Cnt_NoInit = 2Cnt_Init = 100
Start...Cnt_NoInit = 3Cnt_Init = 100
uint16_t Cnt_NoInit;uint16_t Cnt_Init = 100;
Start...Cnt_NoInit = 0Cnt_Init = 100
Start...Cnt_NoInit = 0Cnt_Init = 100
Start...Cnt_NoInit = 0Cnt_Init = 100
Start...Cnt_NoInit = 0Cnt_Init = 100
相信聪明的你,看了上面例子会明白为什么没有初始化的变量“Cnt_NoInit”在变化,而初始化了的“Cnt_Init”一直不变。------------ END ------------
关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
关于科技区角:国内科技展会垂直内容策划服务商,提供从论坛内容全案策划、会展市场化IP打造到精准专业观众一站式邀约服务,以产业内容吸引高质量B端人群,打通展会从议题设计、演讲嘉宾邀约、宣传预热、精准邀观到供需对接全链路。