首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]请教有关程序起始地址的问题

[求助]请教有关程序起始地址的问题

我是用串口往MCU中下载程序的。配合windows超级终端,往flash下载好程序之后,必须先按ctrl+P,出现PC=F03D,然后修改为c029,最后输入G,才能正常运行下载在flash中的程序。
但是,一旦拔掉串口线,按复位健之后,程序就不能正常运行了。本人推测,是因为复位后,PC寄存器中的值复位成默认的F03D,所以不能指向程序的入口地址c029,导致不能正常运行程序。请教大侠们,原因是不是这样的呢?如何设置能使一复位后就能运行flash中的程序
先谢谢啦。。。。

注:我用的单片机是9s12dg128的。。。
我看了一本书,我觉得这段文字很有价值,不过不太懂:

监控程序代码小于4KB,放在地址$F000处。它把$FF80的中断向量表移到EF80处,顺序不变。用户可以使用$EF80处的中断向量表,此中断向量表和MC9sDP256手册上的中断向量表顺序相同,只是从$FF80移到了$EF80.监控程序运行起来时,如果串口在4s内没有收到数据就会检查$EFFE—$EFFF所指向的用户程序。如果程序运行起来4S内串口接到数据或者$EFFE—$EFFF为$FFFF,则进入DEBUG监控程序。

监控程序不是已经固化在flash中吗?为哪个之分吗?
谢谢解答。。。
哦,我们用的单片机已经集成在开发板上,里头已经有监控程序
可以详细点吗?

还有,如果用BDM写的话,不会出现以上的问题,是吗?

谢谢
版主,我找了另一个方法:

用记事本,打开bin文件夹下的*.s19文件,把倒数第二行的 S105FFFEC02914,改为S105EFFEC02924就可以了,其中为什么把FFFE改为EFFE,上面的一个帖子已经说明

我现在#pragma还不怎么会用
不好意思,上面那个方法可能不是都适用。
哦,谢谢!

还想问一个问题:如何使C029的指向定义的函数User_Entry?是在程序的开头体现出来吗?
我明白User_Entry只是个例子。
C029肯定得指向被监控程序修改后的中断向量表:EFFE处。您说:
PRM文件可以定义:
VECTOR ADDRESS 0xEFFE User_Entry
这样就可以将C029写入EFFE~EFFF里了。
这个前提应该是C029必须先指向函数User_Entry,我想知道的是如何才能使C029指向它,是在程序的开头吗?
谢谢!

我看的书是这么说的,因为水平有限,只能书去亦云了:

程序入口地址之所以是C029而非C000.是因为工程是从START12.c开始执行,然后再执行用户的MAIN.c。用户程序的入口地址是用户在default.prm文件中定义的代码地址加上29

如:
MY_ROM READ_ONLY OX4000 TO 0X7FFF
则用户入口地址是$4029
首先,再次谢谢详细的解答,我这个初学者受益非浅。

应该是project采用那个文件了吧,因为编译的时候,我看到编译那个文件了。至于监控程序,我没有怎么去看它,它在一本书上写着,单片机已经有了,所以没有管它。

我刚才看了一下help,才明白VECTOR ADDRESS 0xEFFE 的意思,不过我还是对help 中的怎么使用Startup Function不太明白,例子太笼统了,
void _Startup(void) {
... set up stack pointer ...
... zero out ...
... copy down ...
CopyCode();
... call main ...
}

我还想问一下,help里面有对s19文件的介绍吗?我找不到。
下面是一个经过我修改之后,在我的单片机上能运行的程序

S01C0000443A5C66697273745C62696E5C4347656E657269632E6162738C
S123C000FEC040FDC03E270E35ED31EC3169700434FB310326F2FEC042EC31270BED3118A1

S11AC0C00794FC20008C00082DF6C7877C2000C6055B4D20EB00008F
S105EFFEC02924(“S105FFFEC02914”)
S9030000FC
括号后面是被前面一部分替换掉的。
修改之后的倒数第二句的意思是这样的吗:在装载的起始地址EFFE中,装入C029
S9030000FC,的意思是程序执行的起始地址
二者之间搞得有点晕,还是对单片机的一些工作特性不太理解啊。。。
上面的回复少了几个字:
S9030000FC,的意思是程序执行的起始地址为0000
最后一个字节好像是校验码,是该记录是的所有内容之和的反码。
还有,s9包含的应该是程序执行时的起始地址。
我查看的一个资料里面简单地那么说了些。。。
发生了一个问题啊,编译之后,bin文件夹之下怎么不产生s19文件啊


我还想问一下,编译之后,bin文件夹之下怎么不产生s19文件啊。
我原来系统里面有两个版本的codewarrior,是V2.0,和4.1。前天晚上把2.0卸载了,后来4.1就不能用了,重装2.0之后,还是不能使用。。。
返回列表