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

如何重新定位中断向量表

如何重新定位中断向量表

想把中断向量表从0xff80——0xffff重新映射到0x7f80——0x7fff,该什么做,请高手指点。
              非学无以广才,非志无以成学;              
什么意思,为什么要这么做?
海纳百川  有容乃大
中断向量表可以重新映射吗?
正在进行NE64的研究学习,欢迎和我讨论~ saga0807@hotmail.com
因为我的软件有boot和firmware两个程序组成,boot出厂前用BDM烧进去,firmware出厂后用串口下载进去(这样软件远程升级就方便了),所以我的boot放在dp256的3F页并且这部分保护以来防止意外修改或以外檫除。而firmware才真正执行我的所有功能,所以firmware的中断入口地址不能在3F这个页了,只好映射到3E这个页了。我看了AN2153,但那是用汇编写的,我不知道用C应该怎么来弄。
              非学无以广才,非志无以成学;              
我觉得重新映射的话应该是初始化时修改寄存器吧?
你说的是转移吧?
正在进行NE64的研究学习,欢迎和我讨论~ saga0807@hotmail.com
邵贝贝的书上讲了,但我感觉代码不对,AN2153文档里也讲了,而且有原代码;可惜这些代码都是汇编,用C不知道该怎么弄
              非学无以广才,非志无以成学;              

我用DP256做了一个重新映射矢量区的例子,贴出来供大家参考:

http://bbs.eccn.com/uploadImages/9S12DP256_Vector_Remapping.zip

[此贴子已经被strongchen于2006-7-28 11:15:54编辑过]

海纳百川  有容乃大
这个参考是用CW4.5做的。现在做一些说明:
1. 要修改PRM文件。我修改的是文件Full_Chip_Simulation_linker.prm。
2. 修改方法:
1). 我要将中断映射到0xEF80~0xEFFF处,所以要将这段地址空出来。因此,我将ROM_C000段的地址改为0xC000 TO 0xEF7F,又增加了一个ROM_BOOT段,地址为:0xF000 TO 0xFFEF。
2). 定义一个段名:
BOOT_CODE INTO ROM_BOOT;
3). 原矢量地址和跳转矢量地址的定义:
VECTOR 0 BootStart
VECTOR 1 JClockFail

VECTOR ADDRESS 0xEFFE _Startup
VECTOR ADDRESS 0xEFFC ClockFail
海纳百川  有容乃大
文件在这里:
海纳百川  有容乃大
http://bbs.eccn.com/uploadImages/9S12DP256_Vector_Remap.zip
海纳百川  有容乃大
大家可以结合AN2153来看我这个参考工程。
海纳百川  有容乃大
很好
              非学无以广才,非志无以成学;              
我对汇编不熟悉,PCR表示PC寄存器吗?请问:asm JMP [0xEFFE,PCR];的意思是什么?
              非学无以广才,非志无以成学;              
多谢指点
              非学无以广才,非志无以成学;              
之所以要将中断矢量映射到另一块空间,是因为中断矢量一般在内存地址的最后部分。而FLASH的保护区,一般也选在其后部。为了保护boot程序,我们一般把它放在FLASH的保护区里,这样就不会被意外地擦除或修改。这样,中断矢量也就不能修改了。但是我们的应用程序应该可以修改和升级,这样可能导致中断入口地址的改变。如何解决这个矛盾呢?就采用重新映射中断矢量的办法。实际上,它的工作原理是,在原中断矢量区写入的是一个跳转指令的入口地址。而跳转指令从另一个地址表中取跳转目的地址。这个地址表,就是所谓的中断矢量映射区。采用这种结构,可以使得用户在编程时,不用考虑中断矢量是否映射,可以采用完全相同的程序结构。
海纳百川  有容乃大
返回列表