Board logo

标题: 将中断向量表写入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