发新帖本帖赏金 0.10元(功能说明)我要提问
返回列表
打印

单片机启动问题

[复制链接]
1259|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51核的单片机上电重启后发现程序未从main()函数开始执行,keil模拟仿真发现RST后程序跳转地址不是main(),而是一个子程序的地址。
STARTUP.A51使用的是keil自带默认的。求大神帮着看看原因,谢谢!

main函数的地址是0x2B24.png (32.51 KB )

main函数的地址是0x2B24

main函数的地址是0x2B24

启动跳转0x2931是一个子函数.png (26.51 KB )

启动跳转0x2931是一个子函数

启动跳转0x2931是一个子函数

相关帖子

沙发
h286288986| | 2018-4-14 09:18 | 只看该作者
这个不好说,有可能文仲损坏,换台电脑重新编译,或者重新加载启动文件

使用特权

评论回复
板凳
cjseng| | 2018-4-14 18:06 | 只看该作者
本来就是这样的,复位后肯定不是从main开始,先要设置中断入口,以及RAM清零的操作。

使用特权

评论回复
地板
linqing171| | 2018-4-14 21:52 | 只看该作者
本来就是启动后先进入crt,crt初始化后才会进入main啊。
你把keil的调试勾上执行到main,就把这段跳过去了。

使用特权

评论回复
5
autumwind|  楼主 | 2018-4-15 09:34 | 只看该作者
不是直接跳到main函数可以理解,但是也不能直接跳到子函数中,0x2931对应的是一个子函数,而且是子函数中间。调试配置中已经勾选“Run to Main”了,@linqing171

使用特权

评论回复
6
linqing171| | 2018-4-15 10:00 | 只看该作者
贴 0x2931 对应的反汇编,哥给你注释。

使用特权

评论回复
7
autumwind|  楼主 | 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清零,因为发现重新上电后,有几个变量没有被清零。

使用特权

评论回复
8
wh6ic| | 2018-4-16 07:54 | 只看该作者
2931~2936 这四句清除 0x00~0x7F data Ram, 如果要清除 idata Ram,需要修改startup.A51文件

使用特权

评论回复
9
cjseng| | 2018-4-16 10:44 | 只看该作者
wh6ic 发表于 2018-4-16 07:54
2931~2936 这四句清除 0x00~0x7F data Ram, 如果要清除 idata Ram,需要修改startup.A51文件 ...

这个很牛X的,R0即是指针,又是计数器

使用特权

评论回复
10
本德尔独家代理| | 2018-4-16 15:50 | 只看该作者
这个不好说吧

使用特权

评论回复
11
linqing171| | 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

评论
linqing171 2018-4-16 23:50 回复TA
@cjseng :idata清了一半,但是楼主是用的keil c51 large模式编译的,变量都在xdata。 
cjseng 2018-4-16 23:21 回复TA
是idata没清空吧 
12
autumwind|  楼主 | 2018-5-7 10:27 | 只看该作者
嗯,搞定了。都清了之后就好了。谢谢大家!

使用特权

评论回复
发新帖 本帖赏金 0.10元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

42

帖子

1

粉丝