历史上的今天
今天是:2024年09月12日(星期四)
2018年09月12日 | STM32F0开发笔记8: 在keil中使用不初始化变量
2018-09-12 来源:eefocus
我们进行程序设计的时候,都会知道,系统上电或复位时,会执行变量初始化操作,但是有些情况下,我们并不希望变量初始化,例如,在系统异常复位发生后,我们希望系统能够迅速恢复复位前的现场状况,这样就希望变量能够保留原先的值,而不被初始化。实际上,大家都知道,变量是存储在RAM中的,只要不掉电,变量的数值是不会改变的,只要我们不让系统进行初始化操作就可以了。
不同的编译环境,有不同的设置方法,本文介绍在Keil中设置不初始化变量的方法。在这里需要说明的是,网上介绍了许多的设置方法,但并不是所有的方法都起作用,本文将介绍一种最为直接的方法。
1、打开Options for Target对话框Linker标签,勾选掉Use Memory Layout from Target Dialog,这个选项的意思是使用Target标签进行链接设置,所以在其勾选的情况下,分散文件是不能自己编辑的,勾选掉以后,我们就可以进行分散文件的设置了。
2、点击分散文件后面的Edit按钮,打开分散文件,按下图所示的方法,增加节点。原先仅有一个RAM节点,其起始地址是0x20000000,其长度是0x00008000。我们新编辑的分散文件,将RAM分为2部分,第1部分长度为0x7000,第2部分长度为0x1000,并将第2部分设置为UNINIT,也就是不初始化,显式节点名为NO_INIT。
3、有了上述设置后,我们就可以进行变量设置了,在这里需要注意的是变量需定义为全局变量,且不能赋初值,后面要加入存放的节点,如下面程序所示。我们定义了5个变量,第1个为u16_Start,后面为4个数组(仅是举例子,没有什么实际意义)。
uint16_t u16_Start __attribute__((section("NO_INIT"),zero_init));
uint16_t u16_a[2] __attribute__((section("NO_INIT"),zero_init));
uint16_t u16_b[2] __attribute__((section("NO_INIT"),zero_init));
uint16_t u16_c[2] __attribute__((section("NO_INIT"),zero_init));
uint16_t u16_d[2] __attribute__((section("NO_INIT"),zero_init));
4、正确编译后,将程序下载到目标板,我们就可以观察到这些变量不会因为单片机复位,而被初始化了。不过这又产生了一个新的问题,由于我们没有给这些变量赋初值,当系统上电时,这些变量的值是随机的,所以我们还需要辨别是系统上电,还是系统复位,使用下面的程序就可以了,这也是变量u16_Start的作用。当系统上电时,由于RAM是刚刚加电,所以变量u16_Start为12345的可能性几乎为0,我们认为这是系统上电,将u16_Start设置为12345后,并初始化这些变量。当系统复位时,u16_Start中的数值仍然保留,所以还为12345,这样就不再初始化变量。
if (u16_Start != 12345)
{
u16_Start = 12345;
u16_a[0] = 0;
u16_a[1] = 0;
u16_b[0] = 0;
u16_b[1] = 0;
u16_c[0] = 0;
u16_c[1] = 0;
u16_d[0] = 0;
u16_d[1] = 0;
}
史海拾趣
|
;P ;P !从本网站挪过来的资料! 为了响应小杰关于FPGA入门资料编写号召,特此发此贴,提供下载。 书还没看,感觉还不错,要求FPGA有点入门的。 关于学习FPGA,首先是自己有开发板,然后,就是自己给自己立一个项目练习。这样自己会编写代码。 ...… 查看全部问答> |
|
在eboot中也不能使用物理地址直接访问内存。而使用的是虚拟地址。 我的6410版,RAM从128M升级到256M之后,系统一直没有搞定,在eboot中测试内存发现, 我映射了一段并不存在的内存到0x96000000,在eboot中写了一个循环读写,如下: for (i = 0; ...… 查看全部问答> |
|
注册表项[HKEY_LOCAL_MACHINE\SOFTWARE\Apps]下有许多子项,如何将它们一一读出? 在WinCE上, 注册表项 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Apps]下有许多子项, 如何将它们一一读出?… 查看全部问答> |
|
LCD 驱动程序上有一个DUMMY (RGB_DUMMY) 的东西,它起什么作用呀? LCD 驱动程序上有一个DUMMY (RGB_DUMMY) 的东西,它起什么作用呀? 三星6410(或BSP上)有这个东西吗? 如何设置它?… 查看全部问答> |
|
MTK6225 手机开发板(含源代码) 有诚意者请联系 Qq:296662705 硬件特性: 1、 CPU:mtk6225 2、 TFLASH 卡接口 3、 176X220 2.6寸TFT LCD,最高支持320*240*16的TFT LCD 4、 4线触摸屏接口 5、 双声道音频输出 6、 一个Camera 130万像素 ...… 查看全部问答> |




