没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Keil MDK下如何设置非零初始化变量下如何设置非零初始化变量
一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或
者不至于因瞬间复位而重启现场设备。而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化变量
数据清零。如何设置非初始化数据变量不被零初始化,这是本篇文章所要探讨的。
在给出方法之前,先来了解一下代码和数据的存放规则、属性,以及复位后为何默认非初始化变量所在RAM都被初始化为零
了呢。
什么是初始化数据变量,什么又是非初始化数据变量?(因为我的文字描述不一定准确,所以喜欢举一些例子来辅助理解文
字。)
定义一个变量:int nTimerCount=20;变量nTimerCount就是初始化变量,也就是已经有初值;
如果定义变量:int nTimerCount;变量nTimerCount就是一个非赋值的变量,Keil MDK默认将它放到属性为ZI的输入节。
那么,什么是“ZI”,什么又是“输入节”呢?这要了解一下ARM映像文件(image)的组成了,这部分内容略显无聊,但我认为
这是非常有必要掌握的。
ARM映像文件的组成:
一个映像文件由一个或多个域(region,也有译为“区”)组成 每个域包含一个或多个输出段(section,也有译为“节”) 每个输
出段包含一个或多个输入段 各个输入段包含了目标文件中的代码和数据
输入段中包含了四类内容:代码、已经初始化的数据、未经过初始化的存储区域、内容初始化为零的存储区域。每个输入段有
相应的属性:只读的(RO)、可读写的(RW)以及初始化成零的(ZI)。
一个输出段中包含了一些列具有相同的RO、RW和ZI属性的输入段。输出段属性与其中包含的输入段属性相同。
一个域包含一到三个输出段,各个输出段的属性各不相同:RO属性、RW属性和ZI属性
到这里我们就可以知道,一般情况下,代码会被放到RO属性的输入节,已经初始化的变量会被分配到RW属性输入区,
而“ZI”属性输入节可以理解为是初始化成零变量的集合。
已经初始化变量的初值,会被放到硬件的哪里呢?(比如定义int nTimerCount=20;那么初始值20被放到哪里呢?),我觉得
这是个有趣的问题,比如keil在编译完成后,会给出编译文件大小的信息,如下所示:
Total RO Size (Code + RO Data) 54520 ( 53.24kB)
Total RW Size (RW Data + ZI Data) 6088 ( 5.95kB)
Total ROM Size (Code + RO Data + RW Data) 54696 ( 53.41kB)
很多人不知道这是怎么计算的,也不知道究竟放入ROM/Flash中的代码有多少。其实,那些已经初始化的变量,是被放入RW
属性的输入节中,而这些变量的初值,是被放入ROM/Flash中的。有时候这些初值的量比较大,Keil还会将这些初值压缩后再
放入ROM/Flash以节省存储空间。那这些初值是谁在何时将它们恢复到RAM中的?ZI属性输入节中的变量所在RAM又是谁在
何时给用零初始化的呢?要了解这些东西,就要看默认设置下,从系统复位,到执行C代码中你编写的main函数,Keil帮你做
了些什么。
硬件复位后,第一步是执行复位处理程序,这个程序的入口在启动代码里(默认),摘录一段cortex-m3的复位处理入口代码:
1: Reset_Handler PROC ;PROC等同于FUNCTION,表示一个函数的开始,与ENDP相对?
2:
3: EXPORT Reset_Handler [WEAK]
4: IMPORT SystemInit
5: IMPORT __main
6: LDR R0, =SystemInit
7: BLX R0
8: LDR R0, =__main
9: BX R0
10: ENDP
初始化堆栈指针、执行完用户定义的底层初始化代码(SystemInit函数)后,接下来的代码调用了__main函数,这里__main函
数会调用一些列的C库函数,完成代码和数据的复制、解压缩以及ZI数据的零初始化。数据的解压缩和复制,其中就包括将储
存在ROM/Flash中的已初始化变量的初值复制到相应的RAM中去。对于一个变量,它可能有三种属性,用const修饰符修饰的
资源评论
weixin_38663443
- 粉丝: 7
- 资源: 978
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功