Board logo

标题: [求助]请教有关程序起始地址的问题 [打印本页]

作者: charlychan    时间: 2007-5-10 18:53     标题: [求助]请教有关程序起始地址的问题

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

注:我用的单片机是9s12dg128的。。。
作者: strongchen    时间: 2007-5-11 10:20

你用的串口通讯监控程序(芯片中的)或BOOTLOADER是哪个?它没有关于中断矢量映射的说明吗?
作者: charlychan    时间: 2007-5-11 19:57

我看了一本书,我觉得这段文字很有价值,不过不太懂:

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

监控程序不是已经固化在flash中吗?为哪个之分吗?
谢谢解答。。。
作者: strongchen    时间: 2007-5-14 11:02

芯片出厂时里面并没有监控程序,需要用BDM往里写。
作者: fithkyo0885    时间: 2007-5-14 11:53

用别人提供的监控程序只是为了方便调试,最后的系统程序还是要用BDM写的,如果是用BDM写的话应该不存在入口地址的问题。
作者: charlychan    时间: 2007-5-14 15:52

哦,我们用的单片机已经集成在开发板上,里头已经有监控程序
作者: strongchen    时间: 2007-5-14 16:00

照你上面提到的文档描述,你应该在编程时将C029写入EFFE~EFFF。
作者: charlychan    时间: 2007-5-14 16:15

可以详细点吗?

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


作者: strongchen    时间: 2007-5-14 16:48

比如你位于C029的用户程序入口函数为User_Entry,那么在PRM文件中你可以定义:

VECTOR ADDRESS 0xEFFE User_Entry

这样就可以将C029写入EFFE~EFFF里了。

如果用BDM写用户程序,监控可能会被全部擦除。此时就需要采用原始的中断矢量地址区了。
作者: charlychan    时间: 2007-5-14 17:35

谢谢
作者: charlychan    时间: 2007-5-15 20:09

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

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

我现在#pragma还不怎么会用

作者: charlychan    时间: 2007-5-15 20:37

不好意思,上面那个方法可能不是都适用。
作者: strongchen    时间: 2007-5-16 09:46

这个方法只改了S19文件,并没有修改其他文件,所以调试的时候可能会有问题。另外,用PRM文件可以定义所有的中断矢量地址。当要修改的中断矢量较多时,修改S19文件就比较麻烦。
作者: charlychan    时间: 2007-5-16 10:43

哦,谢谢!

还想问一个问题:如何使C029的指向定义的函数User_Entry?是在程序的开头体现出来吗?
作者: strongchen    时间: 2007-5-16 10:57

我说的User_Entry只是个例子,你的C029必定是某个函数的起始地址吧。这个函数名就是所谓的User_Entry了。
作者: charlychan    时间: 2007-5-16 15:31

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


作者: strongchen    时间: 2007-5-16 16:02

EFFE处应该放的是你的用户程序的入口地址,但这个地址不一定非要是C029。如果你知道程序启动后从哪里开始执行,那么将这个起始函数的函数名用VECTOR ADDRESS的格式写入EFFE即可。现在你说程序入口地址是C029,那么这个C029是哪里来的呢?它是哪个函数的起始地址呢?
作者: charlychan    时间: 2007-5-16 16:44

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

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

如:
MY_ROM READ_ONLY OX4000 TO 0X7FFF
则用户入口地址是$4029
作者: strongchen    时间: 2007-5-16 17:17

如果你想要程序从START12.C中的_Startup开始执行,就这样写:
VECTOR ADDRESS 0xEFFE _Startup
如果你想程序从main处开始执行,就这样写:
VECTOR ADDRESS 0xEFFE main
但是main函数必须放入非分页地址中,要在它前面加一个声明
#pragma CODE_SEG __NEAR_SEG NON_BANKED
以上是指采用CodeWarrior自带的start12.c时的情形。我不知道你的project是采用这个文件,还是监控程序另外提供了一个start12.c文件。

作者: charlychan    时间: 2007-5-16 17:58

首先,再次谢谢详细的解答,我这个初学者受益非浅。

应该是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,的意思是程序执行的起始地址
二者之间搞得有点晕,还是对单片机的一些工作特性不太理解啊。。。
作者: charlychan    时间: 2007-5-16 18:00

上面的回复少了几个字:
S9030000FC,的意思是程序执行的起始地址为0000

作者: strongchen    时间: 2007-5-17 09:10

我想在网上肯定可以找到很多关于S19文件格式的介绍。
在S19文件中,以S0开头的行是起始行,里面是文件属性的信息;
以S1开头的行才是16进制文件的正文;S1后面的一个字节表示此行的字节数,然后跟着的是两个字节地址,最后一个字节是校验和;
以S9开头行是整个S19文件的结束行,里面的内容与16进制程序无关,可以不用管它。
作者: charlychan    时间: 2007-5-17 10:00

最后一个字节好像是校验码,是该记录是的所有内容之和的反码。
还有,s9包含的应该是程序执行时的起始地址。
我查看的一个资料里面简单地那么说了些。。。

作者: charlychan    时间: 2007-5-17 10:45

发生了一个问题啊,编译之后,bin文件夹之下怎么不产生s19文件啊
作者: strongchen    时间: 2007-5-17 10:48

不是的,S9行的内容与程序本身无关,一般都写为0。
作者: charlychan    时间: 2007-5-17 11:56



我还想问一下,编译之后,bin文件夹之下怎么不产生s19文件啊。
我原来系统里面有两个版本的codewarrior,是V2.0,和4.1。前天晚上把2.0卸载了,后来4.1就不能用了,重装2.0之后,还是不能使用。。。
作者: fithkyo0885    时间: 2007-5-17 18:33

顶,是我唯一能说的了
作者: charlychan    时间: 2007-5-17 21:26

问题解决了。。。
作者: fithkyo0885    时间: 2007-5-19 22:28

请问版主:
我用的是和楼主一样的硬件系统,遇到的问题也类似。比如由TOI和TOF控制的溢出中断程序,数据手册上的中断地址是0xFFDE,我如果在PRM里写成VECTOR ADDRESS 0xFFDE int_test,则可以通过软件仿真,可是硬件调试时并没进中断。我按你所说的将PRM文件里改成VECTOR ADDRESS 0xEFDE(中断函数是放在非分页地址的),但编译报错:
Link Error1119:Vector allocated at absolute address 0xEFDE overlaps with sections placed in segment ROM_C000
请问这是什么原因?如何解决?
我用的CW是4.6版
作者: strongchen    时间: 2007-5-21 09:45

你试试将PRM文件中ROM_C000段的定义中,将结束地址由0xFEFF改为0xEEFF。
作者: fithkyo0885    时间: 2007-5-21 13:04

可以了,多谢版主!
作者: charlychan    时间: 2007-5-22 15:14

版主,以前我提到的那个问题,我在2.0版本中对prm文件写入
VECTOR ADDRESS 0xEFFE _Startup,程序能正常运行,不过在4.1版本中写入程序就不能正常运行了。。。
作者: charlychan    时间: 2007-5-22 16:22

请问是不是大多数人都不用监控程序啊。。。
作者: strongchen    时间: 2007-5-22 17:48

这应该与CodeWarrior的版本无关,而应该与你使用的监控程序有关。如果有BDM,就用不着监控程序了。
作者: charlychan    时间: 2007-5-22 19:38

哪有BDM使用的技术资料啊?找不到。谢谢啊
作者: charlychan    时间: 2007-5-22 20:05

谢谢大家的帮助啊,上面遇到的问题都解决了哈。。。
作者: happy_sea    时间: 2007-7-26 16:39

好东西要顶啊,版主辛苦了
作者: jianw007    时间: 2007-7-26 17:34

谢谢,,,很经典的问题




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0