Keil MDK设置非零初始化变量技巧解析
需积分: 0 112 浏览量
更新于2024-08-05
收藏 304KB PDF 举报
"在Keil MDK环境下,开发一些工控产品时,可能需要在系统复位后保持RAM中的非初始化变量数据。默认情况下,Keil MDK在复位时会将这些数据清零。本文将介绍如何设置非零初始化变量,以避免复位后的数据丢失。
首先,了解代码和数据的存放规则是关键。在ARM映像文件中,域(region)由输出段(section)组成,每个输出段又包含输入段。输入段分为四类:代码、已初始化数据、未初始化数据和初始化为零的数据。这些输入段有各自的属性,如只读(RO)、可读写(RW)和初始化为零(ZI)。
初始化变量会被放置在RW属性的输入段,而未初始化的变量(如声明但未赋值的变量)通常位于ZI属性的输入段,这个区域在复位时会被自动清零。为了不让非初始化变量在复位后被清零,我们需要修改分散加载文件(scatter file)。
方法一是增加一个名为MYRAM的执行节,并设定其起始地址为0x1000A000。这个新的执行节将用于存放非零初始化的变量。在分散加载文件中,你需要指定这个MYRAM节的属性,确保它不会在复位时被清零。
方法二是定义一个数组,并将其放置在MYRAM节中。这样,即使系统复位,这个数组内的数据也会被保留。
具体操作步骤包括打开scatter文件,添加新的MYRAM节,并配置其属性。然后在C代码中,使用特定的内存模型将非初始化变量分配到这个新定义的MYRAM节。例如,可以使用__attribute__((section("MYRAM")))来指定变量存储位置。
了解这些基础知识后,开发者就能根据需求调整Keil MDK的设置,确保非初始化变量在复位后仍能保留其原有的值,从而实现快速恢复现场或避免设备重启。在实际应用中,这样的设置对于那些依赖于复位前状态的系统尤为重要。
总结起来,通过修改分散加载文件并创建一个专门的执行节,可以防止Keil MDK在复位时清零非初始化变量。这个技巧对于需要保持RAM数据的工控产品设计非常有用。正确理解和运用这些知识,能够优化嵌入式系统的复位行为,提高系统的可靠性和效率。"
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-08-03 上传
2017-12-11 上传
2011-07-13 上传
2013-03-20 上传
2020-08-03 上传
2016-06-01 上传
袁大岛
- 粉丝: 40
- 资源: 305