123
返回列表 发新帖
楼主: 忠实的代码

[其他] 怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值(已解决)

[复制链接]

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2013-2-23 09:17:30 | 显示全部楼层

回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值

回复第 20 楼 于2013-02-23 08:12:11发表:
回复第 19 楼 于2013-02-22 22:09:09发表:
回复第 18 楼 于2013-02-22 16:28:51发表:
回复第 14 楼 于2013-02-21 10:43:58发表:

SRAM0x40002000到0x40002500这段空间是我单独腾出来的,没有用作堆和栈,其后的RAM空间被用作堆栈了。我后面试了几次,强行读写的RESET_COUNT又能够正确计数了,很奇怪,我程序一点没改,此时,在腾出来的RAM空间定义的变量test却不能正常计数,值为1。而RESET_COUNT和test所在地址都属于单独腾出来的RAM空间。进入调试模式后,我断开电源,再通过调试窗口使单片机复位,此后复位计数又固定在某个非正常值。
你这种修改初始化程序比较好,我试下。呵呵,谢谢啊
 
 
 
你是用调试模式测的吗?如果是不妨烧写芯片脱机运行试一试。总感觉你预留的地址被重复利用了,或者是别的逻辑原因。
 
如果你预留的那段内存如果在系统尾部,我的初始化程序和你的功能上没区别。你的在碰到预留内存就停止清零了,预留内存后还有内存的话也不被清零,如此而已。
 
 恩,我之前是在调试模式下测的,然后直接看计数值地址内容是否复位后进行了自加。后来脱机运行,通过串口讲计数值发送到电脑,效果一样。目前的情况是,我强制给RAM某地址内容自加能够达到我的要求,但是我若在这个地址上定义一个变量,却达不到我计数的要求。总是被清零。 
有些编译器是在.map文件中没有映射的地址内容不会被初始化清零,不知道,我上面描述的情况符不符合这个条件?
 

 

 

 

你是怎么定义这个变量的?如果用 #define RESET_COUNT  *(unsigned char*)0x40002500, 那和你直接操作地址没区别啊。
而且你引用RESET_COUNT时没有做别的运算吧?如果有,定义RESET_COUNT时多加一对括号好一些#define RESET_COUNT ( *(unsigned char*)0x40002500)
 
 
编译器对不对映射的地址清零就看那段清零程序,应该没有其它暗扣了。
 

嗯,我没有对RESET_COUNT进行其他操作。就是这样强行修改0x40002500地址内容;还有一种方法就是在该地址上定义一个全局变量,然后对该变量自加计数。这两种方法目前只有第一种有效。不知道这里面的具体原因是什么?
 
 
 
很多编译器就是用#define 这种方法在绝对地址定义变量,你看一下Freescale定义的特殊寄存器就知道了。
 
你说的另一种方法有些C编译器不支持,有的不支持还不报错。你查一下链接报告看你预留的地址是否只分配给你指定的变量就知道了。
 
我建议既然第一种有效就随它去吧。
 
 
 
 
 
 
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
 楼主| 发表于 2013-2-23 11:34:17 | 显示全部楼层

回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值

回复第 21 楼 于2013-02-23 09:17:30发表:
回复第 20 楼 于2013-02-23 08:12:11发表:
回复第 19 楼 于2013-02-22 22:09:09发表:
回复第 18 楼 于2013-02-22 16:28:51发表:
回复第 14 楼 于2013-02-21 10:43:58发表:

SRAM0x40002000到0x40002500这段空间是我单独腾出来的,没有用作堆和栈,其后的RAM空间被用作堆栈了。我后面试了几次,强行读写的RESET_COUNT又能够正确计数了,很奇怪,我程序一点没改,此时,在腾出来的RAM空间定义的变量test却不能正常计数,值为1。而RESET_COUNT和test所在地址都属于单独腾出来的RAM空间。进入调试模式后,我断开电源,再通过调试窗口使单片机复位,此后复位计数又固定在某个非正常值。
你这种修改初始化程序比较好,我试下。呵呵,谢谢啊
 
 
 
你是用调试模式测的吗?如果是不妨烧写芯片脱机运行试一试。总感觉你预留的地址被重复利用了,或者是别的逻辑原因。
 
如果你预留的那段内存如果在系统尾部,我的初始化程序和你的功能上没区别。你的在碰到预留内存就停止清零了,预留内存后还有内存的话也不被清零,如此而已。
 
 恩,我之前是在调试模式下测的,然后直接看计数值地址内容是否复位后进行了自加。后来脱机运行,通过串口讲计数值发送到电脑,效果一样。目前的情况是,我强制给RAM某地址内容自加能够达到我的要求,但是我若在这个地址上定义一个变量,却达不到我计数的要求。总是被清零。 
有些编译器是在.map文件中没有映射的地址内容不会被初始化清零,不知道,我上面描述的情况符不符合这个条件?
 

 

 

 

你是怎么定义这个变量的?如果用 #define RESET_COUNT  *(unsigned char*)0x40002500, 那和你直接操作地址没区别啊。
而且你引用RESET_COUNT时没有做别的运算吧?如果有,定义RESET_COUNT时多加一对括号好一些#define RESET_COUNT ( *(unsigned char*)0x40002500)
 
 
编译器对不对映射的地址清零就看那段清零程序,应该没有其它暗扣了。
 

嗯,我没有对RESET_COUNT进行其他操作。就是这样强行修改0x40002500地址内容;还有一种方法就是在该地址上定义一个全局变量,然后对该变量自加计数。这两种方法目前只有第一种有效。不知道这里面的具体原因是什么?
 
 
 
很多编译器就是用#define 这种方法在绝对地址定义变量,你看一下Freescale定义的特殊寄存器就知道了。
 
你说的另一种方法有些C编译器不支持,有的不支持还不报错。你查一下链接报告看你预留的地址是否只分配给你指定的变量就知道了。
 
我建议既然第一种有效就随它去吧。
 
在我分配的RAM空间内, 目前只有我指定的变量在该段地址内。
我暂时就用第一种方法吧,等后续再回过头来看看这个问题,也许就有新的发现,呵呵,再次谢谢你啊
 
 
 

 
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

39

帖子

0

新手上路

Rank: 1

积分
81
最后登录
1970-1-1
发表于 2013-2-26 15:08:03 | 显示全部楼层

回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值

楼很高啊!
楼主的问题现在解决了吗?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
419
最后登录
1970-1-1
发表于 2013-2-26 19:00:01 | 显示全部楼层

RE:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值

好帖,以前也想过,当时用的是STM32用了RTC的BKP寄存器,就没费这个神了
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
 楼主| 发表于 2013-3-1 13:30:48 | 显示全部楼层

回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值(正解)

回复第 23 楼 于2013-02-26 15:08:03发表:
楼很高啊!
楼主的问题现在解决了吗?
 
嗯,除了修改上面所写的启动代码以外,编译器初始化硬件时,有段汇编代码对全部RAM进行了设置,我们需要跳过我们单独分配的RAM区。
 
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
 楼主| 发表于 2013-3-1 13:33:36 | 显示全部楼层

回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值

回复第 24 楼 于2013-02-26 19:00:01发表:
好帖,以前也想过,当时用的是STM32用了RTC的BKP寄存器,就没费这个神了
 
我看看类似你这种方法在我这上面能否实现。谢谢提个建议啊
 
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
 楼主| 发表于 2013-3-1 13:46:15 | 显示全部楼层

回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值

回复第 24 楼 于2013-02-26 19:00:01发表:
好帖,以前也想过,当时用的是STM32用了RTC的BKP寄存器,就没费这个神了
 
嗯,我看看类似你这种方法在我这上面能否实现,谢谢你的建议啊
 
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
22
最后登录
1970-1-1
发表于 2013-3-12 15:27:23 | 显示全部楼层

回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值

回复第 27 楼 于2013-03-01 13:46:15发表:
Kinetis的话可以用System Register File.(0x40041000 base address)
总共有32个byte,只被power on reset复位,其它复位一律无视
此外这里的值在 LLS 和 VLLSx 下仍然能够保持
 
回复第 24 楼 于2013-02-26 19:00:01发表:
好帖,以前也想过,当时用的是STM32用了RTC的BKP寄存器,就没费这个神了
 
嗯,我看看类似你这种方法在我这上面能否实现,谢谢你的建议啊
 

 
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
0
最后登录
1970-1-1
发表于 2013-9-14 22:41:24 | 显示全部楼层

回复:怎样定义某单个全局变量,使其在非上电复位后不初始化,保存复位之前的值

我用51单片机的时候就发现,全局变量在按复位按键和软件复位的时候是不会被清零的。只有断电重新上电的时候才会清零
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-9 13:36 , Processed in 0.102136 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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