搜索
bottom↓
回复: 12

如何控制复位时不被初始化为0

[复制链接]

出0入0汤圆

发表于 2015-5-4 16:11:12 | 显示全部楼层 |阅读模式
本帖最后由 一匹狼 于 2015-5-4 17:43 编辑

C51的启动代码把片内RAM中00H~7FH单元的内容清零
  1. IDATALEN        EQU     80H
复制代码
  1. IF IDATALEN <> 0
  2.                 MOV     R0,#IDATALEN - 1
  3.                 CLR     A
  4. IDATALOOP:      MOV     @R0,A
  5.                 DJNZ    R0,IDATALOOP
  6. ENDIF
复制代码

为了判断冷、热启动,我需要在特定单元分别写入0xA5、0x5A,
有如下两者解决方案:
1、编译器设置
2、修改启动代码
比较倾向于修改编译器设置,请问在Keil中如何实现热启动时不对其初始化为0?

17:45-2015.05.04修改原因:
如果改启动代码,比如
  1. IDATALEN        EQU     70H
复制代码

直接编译就ok了吗,还需要其他操作不?

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

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

出145入215汤圆

发表于 2015-5-4 17:42:59 | 显示全部楼层
51有热启动这个概念吗?

出0入0汤圆

 楼主| 发表于 2015-5-4 17:48:50 | 显示全部楼层
dz20062008 发表于 2015-5-4 17:42
51有热启动这个概念吗?

有的,按键复位或看门狗复位,复位后,RAM的内容都没有改变

出145入215汤圆

发表于 2015-5-4 17:54:31 | 显示全部楼层
一匹狼 发表于 2015-5-4 17:48
有的,按键复位或看门狗复位,复位后,RAM的内容都没有改变

那样你这问题不就是解决了么?

出0入0汤圆

 楼主| 发表于 2015-5-4 18:09:30 | 显示全部楼层
本帖最后由 一匹狼 于 2015-5-4 18:10 编辑
dz20062008 发表于 2015-5-4 17:54
那样你这问题不就是解决了么?


可能我没说明白,复位后要使得片内RAM的内容保持不变,否则会使得热启动标志清零
现在要做的是修改启动代码或者使得该特定单元复位后不会初始化为0x00或0xFF

出0入0汤圆

发表于 2015-5-4 19:24:05 | 显示全部楼层
本帖最后由 xintao 于 2015-5-4 19:36 编辑

      1.用KEIL编写51程序好像不用启动文件也可以吧?记得以后写的程序都是没加启动文件,这样程序估计是直接从MAIN启动的,应该就跳过内存初始化了吧(没有实际验证过)。
     2.如果第一步行不通,那就修改启动文件吧,把内存初始化那一段汇编跳过去。
     3.新型的51单片机应该带复位标志寄存器了,比如STC的应该就有吧,可以去看看。


这一段应该是初始化各种存储器的,把对应的哪 一段删掉,应该就不会初始化你的内存了。
STARTUP1:

IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF

IF XDATALEN <> 0
                MOV     DPTR,#XDATASTART
                MOV     R7,#LOW (XDATALEN)
  IF (LOW (XDATALEN)) <> 0
                MOV     R6,#(HIGH (XDATALEN)) +1
  ELSE
                MOV     R6,#HIGH (XDATALEN)
  ENDIF
                CLR     A
XDATALOOP:      MOVX    @DPTR,A
                INC     DPTR
                DJNZ    R7,XDATALOOP
                DJNZ    R6,XDATALOOP
ENDIF

IF PPAGEENABLE <> 0
                MOV     PPAGE_SFR,#PPAGE
ENDIF

IF PDATALEN <> 0
                MOV     R0,#LOW (PDATASTART)
                MOV     R7,#LOW (PDATALEN)
                CLR     A
PDATALOOP:      MOVX    @R0,A
                INC     R0
                DJNZ    R7,PDATALOOP
ENDIF

出0入0汤圆

发表于 2015-5-4 19:54:37 | 显示全部楼层
我都没有听明白楼主想说什么~~~~~~~~~~~~~~~`

出0入0汤圆

发表于 2015-5-4 21:16:11 | 显示全部楼层
C语言要修改启动代码或定义非初始化变量,手动清零,汇编的话初始一个RAM的值,上电就判断这个值是否为自己写的值,不是的话就全部初始化变量,

出0入0汤圆

 楼主| 发表于 2015-5-5 09:14:17 | 显示全部楼层
bccuje_love 发表于 2015-5-4 21:16
C语言要修改启动代码或定义非初始化变量,手动清零,汇编的话初始一个RAM的值,上电就判断这个值是否为自己 ...

让指针指向不被初始化的单元(启动代码只初始化0x00~0xFF单元):
  1. unsigned char idata *StartP = (unsigned char *)0xFF;
  2. *StartP = 0xA5;
  3. *( StartP - 1 ) = 0x5A;
复制代码

这两单元会不会被编译器分配给其他变量使用?
你说的非初始化变量怎么定义

出145入215汤圆

发表于 2015-5-5 14:11:17 | 显示全部楼层
C语言的话的却比较麻烦,汇编就是不用就不会改变了。

出0入0汤圆

发表于 2015-5-5 21:56:45 | 显示全部楼层
一匹狼 发表于 2015-5-5 09:14
让指针指向不被初始化的单元(启动代码只初始化0x00~0xFF单元):

这两单元会不会被编译器分配给其他变 ...

PIC的是persistent unsigned int,前面加persistent

出0入0汤圆

 楼主| 发表于 2015-5-7 16:45:19 | 显示全部楼层
本帖最后由 一匹狼 于 2015-5-7 16:57 编辑

//把热启动标志写入片内RAM,并把启动代码的初始化部分全部注释

出0入0汤圆

 楼主| 发表于 2015-5-7 16:49:07 | 显示全部楼层
xintao 发表于 2015-5-4 19:24
1.用KEIL编写51程序好像不用启动文件也可以吧?记得以后写的程序都是没加启动文件,这样程序估计是直 ...

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

本版积分规则

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

GMT+8, 2024-6-11 09:57

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

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