返回列表 发新帖本帖赏金 0.10元(功能说明)

单片机启动问题

[复制链接]
542|13
 楼主 | 2018-4-14 07:56 | 显示全部楼层 |阅读模式
51核的单片机上电重启后发现程序未从main()函数开始执行,keil模拟仿真发现RST后程序跳转地址不是main(),而是一个子程序的地址。
STARTUP.A51使用的是keil自带默认的。求大神帮着看看原因,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-4-14 09:18 | 显示全部楼层
这个不好说,有可能文仲损坏,换台电脑重新编译,或者重新加载启动文件
| 2018-4-14 18:06 | 显示全部楼层
本来就是这样的,复位后肯定不是从main开始,先要设置中断入口,以及RAM清零的操作。
| 2018-4-14 21:52 | 显示全部楼层
本来就是启动后先进入crt,crt初始化后才会进入main啊。
你把keil的调试勾上执行到main,就把这段跳过去了。
 楼主 | 2018-4-15 09:34 | 显示全部楼层
不是直接跳到main函数可以理解,但是也不能直接跳到子函数中,0x2931对应的是一个子函数,而且是子函数中间。调试配置中已经勾选“Run to Main”了,@linqing171
| 2018-4-15 10:00 | 显示全部楼层
贴 0x2931 对应的反汇编,哥给你注释。
 楼主 | 2018-4-16 06:00 | 显示全部楼层
C:0x2930    22       RET      
C:0x2931    787F     MOV      R0,#0x7F
C:0x2933    E4       CLR      A
C:0x2934    F6       MOV      @R0,A
C:0x2935    D8FD     DJNZ     R0,C:2934
C:0x2937    758120   MOV      SP(0x81),#0x20
C:0x293A    022978   LJMP     C_START(C:2978)
C:0x293D    022B24   LJMP     main(C:2B24)

是自己弄错了,的确是跳到main函数去了。不过问一下,哪句是把所有的RAM清零,因为发现重新上电后,有几个变量没有被清零。
| 2018-4-16 07:54 | 显示全部楼层
2931~2936 这四句清除 0x00~0x7F data Ram, 如果要清除 idata Ram,需要修改startup.A51文件
| 2018-4-16 10:44 | 显示全部楼层
wh6ic 发表于 2018-4-16 07:54
2931~2936 这四句清除 0x00~0x7F data Ram, 如果要清除 idata Ram,需要修改startup.A51文件 ...

这个很牛逼的,R0即是指针,又是计数器
| 2018-4-16 15:50 | 显示全部楼层
这个不好说吧
| 2018-4-16 21:17 | 显示全部楼层
把keil目录里面的startup.A51复制一份,加入到工程里面后,keil就不链接默认的了。

注释如下:
C:0x2930    22       RET      
C:0x2931    787F     MOV      R0,#0x7F    R0里面存入7F,也就是RAM的最后一个地址。
C:0x2933    E4       CLR      A                   ; clear指令来 清空A
C:0x2934    F6       MOV      @R0,A           A的值存入R0指向的idata
C:0x2935    D8FD     DJNZ     R0,C:2934       decrease R0, Jump to 上一句 if Not Zero,翻译成C语言 if(!--R0) goto C:2934
C:0x2937    758120   MOV      SP(0x81),#0x20   c语言运行用堆栈初始化
C:0x293A    022978   LJMP     C_START(C:2978) c语言进入main函数前的全局变量初始化
C:0x293D    022B24   LJMP     main(C:2B24)       c语言main函数


你这个只清空了idata的0~7F;xdata没有清空。

打赏榜单

山东电子小菜鸟 打赏了 0.10 元 2018-04-16

评论

cjseng 2018-4-16 23:21 回复TA
是idata没清空吧 
linqing171 2018-4-16 23:50 回复TA
@cjseng :idata清了一半,但是楼主是用的keil c51 large模式编译的,变量都在xdata。 
 楼主 | 2018-5-7 10:27 | 显示全部楼层
嗯,搞定了。都清了之后就好了。谢谢大家!
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /6 下一条

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