打印

卡在启动代码

[复制链接]
2681|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
绿色的瓶盖|  楼主 | 2010-9-19 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 绿色的瓶盖 于 2010-9-19 17:29 编辑

新修改了程序,运行没有现象,调试后发现程序卡在启动代码出不来。每次停下来发现停留在下面这个语句:mov SP,#?STACK-1
以为是堆栈不够,于是改动许多变量的存储区域。现在idata 只占用7了,但是问题依旧。不知道问题出在哪里?哪位朋友指点下~~~

补充:重新把之前版本程序拿出,我准备逐个增加变量,看到底加到几个变量出问题。没想到仅仅加了一个全局变量就出现上述问题,然后我尝试将该变量分别定义到data、idata、pdata区域,问题依旧。本人C语言功底不深,实在百思不得其解,希望哪位网友帮忙分析下。

相关帖子

沙发
lbx_00| | 2010-9-19 13:46 | 只看该作者
mov SP,#?STACK-1是不是放在子程序里了

使用特权

评论回复
板凳
绿色的瓶盖|  楼主 | 2010-9-19 14:38 | 只看该作者
2# lbx_00

没有啊,这个是启动代码里的语句。我没有更改过启动代码。

使用特权

评论回复
地板
绿色的瓶盖|  楼主 | 2010-9-19 22:17 | 只看该作者
:handshake  刷新一下,怎么没人回复啊 啊 啊 啊啊!

使用特权

评论回复
5
ayb_ice| | 2010-9-20 08:39 | 只看该作者
单步调试

使用特权

评论回复
6
绿色的瓶盖|  楼主 | 2010-9-20 11:54 | 只看该作者
5# ayb_ice

最新情况,单步调试后发现,程序会自动回到地址0000处,重新开始执行。再仔细检查,发现执行到ljmp  ?C_START 后地址丢失。汇编后的地址为 ljmp C:1012.但是没有1012这个地址。

使用特权

评论回复
7
lbx_00| | 2010-9-20 13:10 | 只看该作者
LZ不是修改的老程序吗? 修改的那部分县都屏蔽掉,然后一点一点的放开,看看到哪里的时候会出问题

使用特权

评论回复
8
ayb_ice| | 2010-9-20 13:18 | 只看该作者
本帖最后由 ayb_ice 于 2010-9-20 13:36 编辑

直接上源代码吧
不会是项目中都没有C文件吧

使用特权

评论回复
9
绿色的瓶盖|  楼主 | 2010-9-20 16:42 | 只看该作者
8# ayb_ice

项目中除了启动代码,其它都是C。
最新进展:将ljmp  ?C_START  改成  ljmp   main  。编译后有一个警告,提示C_INITSEG 未调用。 不管它,直接运行程序,有正常现象(LED闪烁)。
之后继续查看,发现?C_INITSEG在INIT.A51文件中。该文件前部分有提示:“这段代码会被执行,如果应用程序中有变量初始化。”(英文翻译,大概是这个意思。)

使用特权

评论回复
10
ddtx| | 2010-9-20 17:33 | 只看该作者
有WDT吗?

使用特权

评论回复
11
lotus_1984| | 2010-9-20 20:22 | 只看该作者
很底层的问题啊,不懂帮顶。

使用特权

评论回复
12
冷漠| | 2010-9-20 21:09 | 只看该作者

少加了INIT.A51.

本帖最后由 冷漠 于 2010-9-20 21:13 编辑

项目中还应加入 INIT.A51,(在C51 \ LIB中,与startup.a51同目录。)即:
STARTUP.A51
INIT.A51


XXX.C
XXX1.C
……

要么2个都不加,由连接器自动加。

使用特权

评论回复
13
绿色的瓶盖|  楼主 | 2010-9-23 21:31 | 只看该作者
10# ddtx

确实有WDT,而且后来发现确实是WDT的问题。

使用特权

评论回复
14
绿色的瓶盖|  楼主 | 2010-9-23 21:37 | 只看该作者
12# 冷漠

多谢冷漠的回复。
确实原工程文件中少加了个init.A51。但是仅仅加了它还不行,还要修改一下init.A51.
本人使用的单片机有WDT,而我发现A51中有那么一段文字,如下:

;  User-defined Watch-Dog Refresh.
;
;  If the C application contains many initialized variables uses a watchdog
;  it might be possible that the user has to include a watchdog refresh into
;  the initialization process. The watchdog refresh routine can be included
;  in the following MACRO and can alter all CPU registers except
;  DPTR.
;

之后补充汇编程序,直接关掉WDT。编译,下载,运行,成功!
再一次感谢前面网友的指点。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

97

帖子

0

粉丝