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

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

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

EFFE处应该放的是你的用户程序的入口地址,但这个地址不一定非要是C029。如果你知道程序启动后从哪里开始执行,那么将这个起始函数的函数名用VECTOR ADDRESS的格式写入EFFE即可。现在你说程序入口地址是C029,那么这个C029是哪里来的呢?它是哪个函数的起始地址呢?
海纳百川  有容乃大
我看的书是这么说的,因为水平有限,只能书去亦云了:

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

如:
MY_ROM READ_ONLY OX4000 TO 0X7FFF
则用户入口地址是$4029
如果你想要程序从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文件。
海纳百川  有容乃大
首先,再次谢谢详细的解答,我这个初学者受益非浅。

应该是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
我想在网上肯定可以找到很多关于S19文件格式的介绍。
在S19文件中,以S0开头的行是起始行,里面是文件属性的信息;
以S1开头的行才是16进制文件的正文;S1后面的一个字节表示此行的字节数,然后跟着的是两个字节地址,最后一个字节是校验和;
以S9开头行是整个S19文件的结束行,里面的内容与16进制程序无关,可以不用管它。
海纳百川  有容乃大
最后一个字节好像是校验码,是该记录是的所有内容之和的反码。
还有,s9包含的应该是程序执行时的起始地址。
我查看的一个资料里面简单地那么说了些。。。
发生了一个问题啊,编译之后,bin文件夹之下怎么不产生s19文件啊
不是的,S9行的内容与程序本身无关,一般都写为0。
海纳百川  有容乃大


我还想问一下,编译之后,bin文件夹之下怎么不产生s19文件啊。
我原来系统里面有两个版本的codewarrior,是V2.0,和4.1。前天晚上把2.0卸载了,后来4.1就不能用了,重装2.0之后,还是不能使用。。。
顶,是我唯一能说的了
问题解决了。。。
请问版主:
我用的是和楼主一样的硬件系统,遇到的问题也类似。比如由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版
你试试将PRM文件中ROM_C000段的定义中,将结束地址由0xFEFF改为0xEEFF。
海纳百川  有容乃大
返回列表