在线时间1 小时
UID404875
注册时间2012-12-1
NXP金币0
该用户从未签到
注册会员

- 积分
- 155
- 最后登录
- 2020-12-15
|

楼主 |
发表于 2013-2-21 09:26:52
|
显示全部楼层
回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值
回复第 12 楼 于2013-02-20 23:57:20发表:
回复第 7 楼 于2013-02-20 14:28:04发表:
回复第 6 楼 于2013-02-20 13:02:01发表:
回复第 5 楼 于2013-02-20 09:58:39发表:
回复第 4 楼 于2013-02-20 02:14:39发表:
回复第 3 楼 于2013-02-19 23:23:21发表:
不行。只能用FLASH来保存。
他要保存的是“非上电复位”的数据,掉电后复位不算,应该行吧?
恩,谢谢您们啊,呵呵,安帮主和lwn71再次来帮我了。用FLASH的话,每次更新还要擦除,担心有些麻烦。根据我查的资料,修改启动汇编代码是可以做到非上电复位后不对RAM区清零。如lwn71所说,我选定某个保留地址不清零,比如地址在SRAM区0x40002000到0x40003000之间。那么我若直接强制读写一个地址:#define RESET_COUNT 0x40002500。这样我每次复位启动后立即对RESET_COUNT++计数。能否做到对非上电复位的次数计数呢?还有Code Warrior2.10中,我若修改了启动汇编代码会对以后建立其它工程产生影响,是否有更好的方法呢?
你要实现的功能是不是计数非断电情况下系统软复位的次数?
如果是就把那段SRAM清零的汇编拿掉,或留两个字(节),一个当计数器,一个做标志。每次复位后查标志位是否是一个你写的特殊字(如0x5aa5):
如果不是说明是系统刚上电复位,内存数据无效,此时应对计数器清零同时把标志写成特殊字(0x5aa5)。
如过是说明是非掉电复位,内存数据有效,此时计数器+1。 计数值就是你要的东西
关于这段清零的汇编,每新建一个工程文件系统就会生成这段汇编,它保证你复位后你未初始化的变量都是零,如此而已,对你的工程是否产生影响可能你最清楚。对于我,我不用它;我对每个要用的变量都手动初始化--这样移植起来容易一些(有些编译器默认有这段清零程序,有些默认没有)
嗯,你说的这个方法非常好。我之前做的是读复位状态寄存器,判断是上电复位还是非上电复位的,根据寄存器的值决定是否对复位计数。和你说的效果应该一样的。我想做的就是你说的,只计算非上电复位次数,但是只允许指定的复位计数变量不清零,而其它全局变量复位后正常清零。为此,我单独定义了一个段区间0x40002500到0x40003000。修改RAM初始化代码后,在该区间段定义了一个变量用以计数复位次数。调试时发现,变量虽然没有被清零,但是一直保持0x52这个值,没有按照我写的那样自加计数。不知道我修改的RAM初始化代码可正确,麻烦帮我看下,真是谢谢lwn71兄啊。
/* Initialize with zeros */
bii = _bss_init_info;
while (1) {
if (bii->addr == 0 && bii->size == 0) break;
if (bii->addr == _myDataStart) break;//这是我添加的代码,_myDataStart指向的是非初始化段的起始地址0x40002500
__init_bss_section(bii->addr, bii->size);
bii++;
}
若上面修改不正确,我又该如何正确修改RAM初始化,达到我想要的要求?
我没用过这款芯片,说的不一定对。
0x40002500到0x40003000这段是SRAM的结尾吗?如果是倒没看出初始化有什么错。
检查一下你的连接报告文件,系统没把你那段用作堆栈吧?或者你的定义被编译器忽略了,二次分配给其他变量用
能否把你预留那段地址挪个地方试一试,如换到0x40001500到0x40002000, 看看运行后还是0x52?初始化程序暂时改成
/* Initialize with zeros */
bii = _bss_init_info;
while (1) {
if (bii->addr == 0 && bii->size == 0) break;
if( (bii->addr addr >= _myDataStart+Max_offset )) __init_bss_section(bii->addr, bii->size);
bii++;
}
SRAM0x40002000到0x40002500这段空间是我单独腾出来的,没有用作堆和栈,其后的RAM空间被用作堆栈了。我后面试了几次,强行读写的RESET_COUNT又能够正确计数了,很奇怪,我程序一点没改,此时,在腾出来的RAM空间定义的变量test却不能正常计数,值为1。而RESET_COUNT和test所在地址都属于单独腾出来的RAM空间。进入调试模式后,我断开电源,再通过调试窗口使单片机复位,此后复位计数又固定在某个非正常值。
你这种修改初始化程序比较好,我试下。呵呵,谢谢啊 |
|