查看: 17548|回复: 28

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

[复制链接]

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
发表于 2013-2-19 15:43:14 | 显示全部楼层 |阅读模式
我用的芯片是MPC5604P。编译环境为Code Warrior2.10.我想计算单片机的非上电复位的次数,但是正常定义全局变量的话,复位后变量值又被重新初始化,失去了原有的值。我该如何定义这样的变量呢?
我知道答案 目前已有28人回答
回复

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2013-2-19 21:35:47 | 显示全部楼层

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

很多版本的Code Warrior在启动的汇编代码中都加了一段对全部内存清零小程序。你查一下你的版本有没有,如有把你要保留的地址排除就可以了
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-2-19 23:23:21 | 显示全部楼层

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

    不行。只能用FLASH来保存。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    99

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    322
    最后登录
    1970-1-1
    发表于 2013-2-20 02:14:39 | 显示全部楼层

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

    回复第 3 楼 于2013-02-19 23:23:21发表:
    不行。只能用FLASH来保存。 

     
     
    他要保存的是“非上电复位”的数据,掉电后复位不算,应该行吧?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    66

    帖子

    0

    注册会员

    Rank: 2

    积分
    155
    最后登录
    2020-12-15
     楼主| 发表于 2013-2-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中,我若修改了启动汇编代码会对以后建立其它工程产生影响,是否有更好的方法呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    99

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    322
    最后登录
    1970-1-1
    发表于 2013-2-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。 计数值就是你要的东西
     
    关于这段清零的汇编,每新建一个工程文件系统就会生成这段汇编,它保证你复位后你未初始化的变量都是零,如此而已,对你的工程是否产生影响可能你最清楚。对于我,我不用它;我对每个要用的变量都手动初始化--这样移植起来容易一些(有些编译器默认有这段清零程序,有些默认没有)
     
     
     
     
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    66

    帖子

    0

    注册会员

    Rank: 2

    积分
    155
    最后登录
    2020-12-15
     楼主| 发表于 2013-2-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初始化,达到我想要的要求?
     

     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-2-20 15:13:15 | 显示全部楼层

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

    #define  RESET_COUNT   0x40002500
    这个定义是不对的,这样,你只能说是RESET_COUNT=0x40002500;
    我们的产品也在用关于复位原因及次数的统计,都是保存在E2中的。方便的话,还是保存E2比较方便。断电以后,也会保存下内容。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    66

    帖子

    0

    注册会员

    Rank: 2

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

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

    回复第 8 楼 于2013-02-20 15:13:15发表:
    #define RESET_COUNT 0x40002500
    这个定义是不对的,这样,你只能说是RESET_COUNT=0x40002500;
    我们的产品也在用关于复位原因及次数的统计,都是保存在E2中的。方便的话,还是保存E2比较方便。断电以后,也会保存下内容。 

    哈哈。不好意思,我写急了,是#define RESET_COUNT  *(unsigned char*)0x40002500.E2的确可以,但我还是想简单一点,以后需要再用这个方法。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    13

    帖子

    0

    新手上路

    Rank: 1

    积分
    23
    最后登录
    1970-1-1
    发表于 2013-2-20 18:35:22 | 显示全部楼层

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

    定义在FLASH,用汇编实现吧
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-5 09:20 , Processed in 0.124691 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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