标题: 将中断向量表写入Flash的方案?![讨论][求助] [打印本页]
作者: flyeye 时间: 2005-7-7 15:12
高手来看一下嘛!!!
作者: flyeye 时间: 2005-7-7 15:18 标题: 将中断向量表写入Flash的方案?![讨论][求助]
我用S912DP256 ECU,中断向量表所要存放的位置为0xFF80--0xFFFF.
CodeWarrior自动生成的Vectors.c是这样解决的:
typedef void (*near tIsrFunc)(void);
const tIsrFunc _vect[] @0xFF80 = { /* Interrupt table */
Cpu_Interrupt, /* 0 Default (unused) interrupt */
Cpu_Interrupt, /* 1 Default (unused) interrupt */
..........................
}
也就是将函数指针数组写到以@0xFF80 开始的一段flash内,刚好是到0xFFFF.
这个方法当然正确.
但是小弟需要移植操作系统,对中断向量表有系统自己的定义,采取这种方案:
#pragma CONST_SEG .vector
typedef void (*near tIsrFunc)(void);
const tIsrFunc _vect[] = { /* Interrupt table */
Cpu_Interrupt, /* 0 Default (unused) interrupt */
.....................
}
然后在PRM文件中加入(只写出了添加部分,其他的保持原PRM)
SECTIONS
VECTORS = READ_ONLY 0x0000FF80 TO 0x0000FFFF;
END
PLACEMENT
.vector INTO VECTORS
END
结果编译链接,下载到硬件中,我一读0xFF80,根本没有写到里面去,这是怎么回事。理论上这样是可以的吧?请教!!!
[em07][em07]
[此贴子已经被作者于2005-7-7 15:18:21编辑过]
作者: strongchen 时间: 2005-7-7 16:33
你要检查一下你的定义与CodeWarrior原有的定义是否有冲突。
作者: flyeye 时间: 2005-7-7 16:44
我的RPM文件全部如下:NAMES
END
SECTIONS
/* List of all sections specified on the "Build options" tab */
RAM = READ_WRITE 0x00001000 TO 0x00003FFF;
ROM_C000 = READ_ONLY 0x0000C000 TO 0x0000FF7F;
ROM_VECTOR = READ_ONLY 0x0000FF80 TO 0x0000FFFF;
ROM_4000 = READ_ONLY 0x00004000 TO 0x00007FFF;
ROM_PAGE30 = READ_ONLY 0x00308000 TO 0x0030BFFF;
ROM_PAGE31 = READ_ONLY 0x00318000 TO 0x0031BFFF;
ROM_PAGE32 = READ_ONLY 0x00328000 TO 0x0032BFFF;
ROM_PAGE33 = READ_ONLY 0x00338000 TO 0x0033BFFF;
ROM_PAGE34 = READ_ONLY 0x00348000 TO 0x0034BFFF;
ROM_PAGE35 = READ_ONLY 0x00358000 TO 0x0035BFFF;
ROM_PAGE36 = READ_ONLY 0x00368000 TO 0x0036BFFF;
ROM_PAGE37 = READ_ONLY 0x00378000 TO 0x0037BFFF;
ROM_PAGE38 = READ_ONLY 0x00388000 TO 0x0038BFFF;
ROM_PAGE39 = READ_ONLY 0x00398000 TO 0x0039BFFF;
ROM_PAGE3A = READ_ONLY 0x003A8000 TO 0x003ABFFF;
ROM_PAGE3B = READ_ONLY 0x003B8000 TO 0x003BBFFF;
ROM_PAGE3C = READ_ONLY 0x003C8000 TO 0x003CBFFF;
ROM_PAGE3D = READ_ONLY 0x003D8000 TO 0x003DBFFF;
END
PLACEMENT
DEFAULT_RAM INTO RAM;
DEFAULT_ROM INTO ROM_PAGE30, ROM_PAGE31, ROM_PAGE32, ROM_PAGE33, ROM_PAGE34, ROM_PAGE35, ROM_PAGE36,
ROM_PAGE37, ROM_PAGE38, ROM_PAGE39, ROM_PAGE3A, ROM_PAGE3B, ROM_PAGE3C, ROM_PAGE3D;
_PRESTART, STARTUP,
ROM_VAR, STRINGS,
NON_BANKED, COPY INTO ROM_C000, ROM_4000;
.vector INTO ROM_VECTOR;
END
INIT _EntryPoint /* The entry point of the application. This function is generated into the CPU module. */
STACKSIZE 0x0080 /* Size of the system stack. Value can be changed on the "Build options" tab */
作者: strongchen 时间: 2005-7-7 17:11
看看是否被优化掉了?
作者: flyeye 时间: 2005-7-7 17:19
怎么解决??到哪里看???
help!!!!
急!!!
作者: flyeye 时间: 2005-7-7 17:53
我的SmartLinker option Settings设置面板的Optimization一栏的复选框我都没有选择,这样没有使用任何优化吧?你能否帮我看一下我的工程文件,谢谢!
我的邮箱是fly_cjh@126.com,谢谢!!!!!!
作者: flyeye 时间: 2005-7-8 11:59
救命啊!!!!
作者: strongchen 时间: 2005-7-8 12:23
把你的project打包发到strongchen_free@yahoo.com.cn。发后出个帖子通知一声。
作者: flyeye 时间: 2005-7-8 17:59
谢谢,给你发了,谢谢!!!!!
[此贴子已经被作者于2005-7-8 17:59:04编辑过]
作者: strongchen 时间: 2005-7-12 12:23
我试了一下你发过来的project。你似乎打开了Processor Expert功能,而且编译根本无法通过。我用的是CodeWarrior 3.1。你再试试看。
作者: flyeye 时间: 2005-7-12 18:40
那如果采取这种方案,你怎么配置呢?你能给一个例子不?:
#pragma CONST_SEG .vector
typedef void (*near tIsrFunc)(void);
const tIsrFunc _vect[] = { /* Interrupt table */
Cpu_Interrupt, /* 0 Default (unused) interrupt */
.....................
}
然后在PRM文件中加入(只写出了添加部分,其他的保持原PRM)
SECTIONS
VECTORS = READ_ONLY 0x0000FF80 TO 0x0000FFFF;
END
PLACEMENT
.vector INTO VECTORS
END
作者: strongchen 时间: 2005-7-14 15:28
我根据你的意思做了一个project,已经发给你了。你可以看到MyInterrupt的地址已经写入了FFFC~FFFF的矢量地址中。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |