搜索
bottom↓
回复: 16

咨询keil中启动文件的问题,LM3S6938,非常感谢!!

[复制链接]

出0入0汤圆

发表于 2009-6-12 13:42:09 | 显示全部楼层 |阅读模式
我想让启动文件 复位的时候不清空RAM 可以怎么处理, 我发现__main是keil库里面的,在这个函数里面他清空了RAM

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-6-12 15:57:41 | 显示全部楼层
哪为知道,给指点下,谢谢!!!

出0入0汤圆

发表于 2009-6-13 23:10:25 | 显示全部楼层
不会,帮着顶一下

复位的时候清零的应该都是Z0区的数据吧,也就是在程序中声明了的但又没有赋初值的全局变量或者静态变量。

不知道别的变量区域需不需要清零,比如赋了初值的全局变量,或者留给局域变量用的ram区域。

感觉从理论上讲,不初始化也没什么问题,毕竟赋值操作不需要先清零(对于需要赋初值的全局变量),大不了没有赋值的局部变量和全

局变量在第一次读的时候读出一个随机数罢了。

您为什么不想清零ram呢,是为了节省开机初始化的时间么。

希望bluelucky斑竹能出来解释一下,可不可以在启动过程中避开CRT清零ram的操作,或者说这么做可不可行。

感谢

aaa1982

出0入0汤圆

 楼主| 发表于 2009-6-15 16:13:00 | 显示全部楼层
我是想软件复位后,保留RAW的值,只是让系统复位

出0入0汤圆

发表于 2009-6-15 22:30:17 | 显示全部楼层
抱歉,我看了Arm开发工具的说明,也没有看到让C库不处理RW和ZI的做法。这是C语言标准要求的,如果不做,会导致全局变量的值无法初始化。除非不使用C库。但在Keil这样包装了ARM开发工具的环境中,可能强制要求使用C库。不使用C库的话,很多汇编级的初始化代码和繁琐的底层工作都要自己完成
如果是在崩溃后希望转储崩溃前夕内存中的数据,或者在复位时显示上次运行实例中内存的数据(行话叫内存转储"dump"),一个折衷的办法是,修改启动时的汇编代码,在它调用__main之前,把内存中从的RW+ZI数据复制到一个指定的地方,或者使用调试环境观察。链接器定义了Image$$RW$$Base ,Image$$RW$$Length, Image$$ZI$$Base ,Image$$ZI$$Length,根据它们求得RW与ZI的位置与长度,试试复制到RAM中地址较高的一些区域,这些区域的寻找可能要多试几次(找到未定义的RAM区域)。或者复制到比SP低的内存中,使其起始位置+长度< SP+32(32供最小栈需求)

出0入0汤圆

发表于 2009-6-16 08:59:18 | 显示全部楼层
十分感谢bluelucky版主的回答:

还是有几个问题比较迷惑,希望能指教一下。

1)关于“或者复制到比SP低的内存中,使其起始位置+长度< SP+32(32供最小栈需求)”

您的意思是说在初始化的时候用堆栈空间来保存RW+Z0区域的数据(毕竟除了RW+Z0以外的RAM是不被清零的),等到C库完成清零工作以后再把入栈的数据都返回到RW+Z0,这样就可以在不增加非易失性存储器的情况下,保证软件复位的时候全局变量的数据不会被清零。是这个概念么?但是为什么要有一个  起始位置+长度< SP+32  的限制呢?

cortex-m3的堆栈不是递减的么,什么叫最小栈需求?

2)对于您说的第一个方法(选择一个高的ram地址),是不是等于我们是绕开了编译器,在编译器没有用到的区域另开了一个地方来存数(RW+Z0),该区域什么都不算,所以自然在初始化的时候不会被清零了。您说要反复试几次就是因为刚开始谁也不知道那块地方编译器没用到,只有链接完了形成map文件以后我们才知道,所以看见map的ram地址分配以后我们还要在动态调整一下,让自己用到的备份内存区域确实不在编译器的使用范围就可以了,是这个思路吧?

3)如果不是软件复位而是掉电复位等其他情况,ram中的数据已经不可靠了,我们这么做可能就不太合适了,cortex-m3系统能在复位的时候判断出是什么复位么?

感谢指教?

aaa1982

出0入0汤圆

发表于 2009-6-16 19:43:20 | 显示全部楼层
To aaa1982: 看得出你也是对计算机系统底层机制热爱钻研的人,赞一个先!
1)  32只是一个试验性的数字。可能在进入Main函数后调用其它函数来分析上次运行实例的数据,这些函数调用可能会消费一些栈空间。如果32不够,可以增加,增加步进量最好是8的整数倍,这就是上文提到的最小堆栈需求,用词不太严谨,抱歉:P
2) 就是这个思路。看懂map的话连尝试都可以省去了,直接计算即可
3) 一般地,复位时判断原因是在芯片级实现的,芯片可以提供专门的寄存器来指出复位的原因

出0入0汤圆

发表于 2009-6-16 21:19:27 | 显示全部楼层
很荣幸得到BLUELUCKY斑竹的表扬哈。呵呵

感谢一直以来的地不吝赐教。

aaa1982

出0入0汤圆

 楼主| 发表于 2009-6-22 09:54:59 | 显示全部楼层
非常感谢!!!但是还是有点不明白,keil中定义的ZI是整个RAM的大小,还有不清零的地方吗?

出0入0汤圆

发表于 2009-6-22 11:07:16 | 显示全部楼层
ZI不可能是整个RAM的大小,如果存在没有定义的全局变量或者静态变量,才会存在ZI。

您是怎么判定的ZI是整个ram的大小

aaa1982

出0入0汤圆

 楼主| 发表于 2009-6-22 11:35:20 | 显示全部楼层
我找到了有的是没有清零,非常感谢!!!!

出0入0汤圆

 楼主| 发表于 2009-6-24 14:39:58 | 显示全部楼层
aaa1982 :  如果存在没有定义的全局变量或者静态变量,才会存在ZI。 是什么意思? 是说Zi是没有使用的RAM?

出0入0汤圆

 楼主| 发表于 2009-6-24 14:44:56 | 显示全部楼层
Zi应该是定义变量而使用的RAM吧

出0入0汤圆

发表于 2009-6-24 21:52:50 | 显示全部楼层
ZI是存放没有付初值的全局变量或者静态变量的区域。

出0入0汤圆

发表于 2009-7-29 21:50:58 | 显示全部楼层
突然看到这个帖子,发现一个问题,

4楼 blueLucky版主提到的

“或者复制到比SP低的内存中,使其起始位置+长度< SP+32(32供最小栈需求)”

是不是应该是  使其起始位置+长度< SP-32(32供最小栈需求)

也就是把SP+32 变成 SP-32


感谢

aaa1982

出0入0汤圆

发表于 2009-8-12 20:02:28 | 显示全部楼层
看看下图吧!

(原文件名:Untitled 1.jpg)

别告诉我,搞不定!

出0入0汤圆

发表于 2009-9-20 09:20:15 | 显示全部楼层
标记
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-17 19:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表