本文主要探讨如何在Keil MDK环境下设置非零初始化变量,以便在系统复位后能保持RAM中的数据,适用于工控产品快速恢复现场的需求。 在Keil MDK中,当系统经历复位(不论是上电复位还是其他类型),默认情况下,所有非初始化的变量数据会被清零。为了防止这种情况,我们需要了解代码和数据的存储规则,以及ARM映像文件的结构。 首先,变量分为初始化数据变量和非初始化数据变量。初始化数据变量是指在声明时就赋予了初值的变量,如`int nTimerCount = 20`。而非初始化数据变量则是没有初值的变量,如`int nTimerCount`。Keil MDK通常会将非初始化变量放在"ZI"(Zero-Initialized)属性的输入节。 ARM映像文件由多个域(region)、输出段(section)和输入段组成。输入段包含四种内容:代码、已初始化数据、未初始化数据和初始化为零的数据。每个输入段都有对应的属性:只读(RO)、读写(RW)和初始化为零(ZI)。已初始化的变量会被放入RW属性的输入区,而未初始化或初始化为零的变量则位于ZI属性的输入节。 在系统复位后,由于默认设置,ZI属性的输入节会被清零,导致非初始化变量的值丢失。因此,要保留复位前的数据,我们需要修改这种默认行为。 要设置非零初始化变量,可以采用以下方法: 1. 使用`__attribute__((section(".mySection")))`关键字指定变量存储位置。创建一个新的输出段,将其属性设为非零初始化,然后将变量放入这个特定的段。 2. 修改链接脚本(Linker Script),添加一个新的段来存放非零初始化的变量,并调整其复位后的处理方式。 3. 利用预处理器宏或运行时初始化函数,在程序启动时手动设置这些变量的初始值。 通过以上方式,我们可以确保非初始化变量在复位后保持其原有值,从而满足工控产品快速恢复现场的要求。请注意,不同的嵌入式系统和编译器可能会有不同的实现方式,具体操作需要根据实际环境进行调整。 在Keil MDK编译过程中,编译器会显示代码和数据的占用空间,如`TotalROSize(Code+ROData) 54520(53.24kB)`,这有助于我们监控和优化内存使用情况。对于需要保持复位前状态的非零初始化变量,我们必须确保它们不被归入“ZI”属性的段中。
下载后可阅读完整内容,剩余2页未读,立即下载
- 粉丝: 7
- 资源: 979
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- BGP协议首选值(PrefVal)属性与模拟组网实验
- C#实现VS***单元测试coverage文件转xml工具
- NX二次开发:UF_DRF_ask_weld_symbol函数详解与应用
- 从机FIFO的Verilog代码实现分析
- C语言制作键盘反应力训练游戏源代码
- 简约风格毕业论文答辩演示模板
- Qt6 QML教程:动态创建与销毁对象的示例源码解析
- NX二次开发函数介绍:UF_DRF_count_text_substring
- 获取inspect.exe:Windows桌面元素查看与自动化工具
- C语言开发的大丰收游戏源代码及论文完整展示
- 掌握NX二次开发:UF_DRF_create_3pt_cline_fbolt函数应用指南
- MobaXterm:超越Xshell的远程连接利器
- 创新手绘粉笔效果在毕业答辩中的应用
- 学生管理系统源码压缩包下载
- 深入解析NX二次开发函数UF-DRF-create-3pt-cline-fcir
- LabVIEW用户登录管理程序:注册、密码、登录与安全