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

求助:S12X中断重映射,程序跑飞

求助:S12X中断重映射,程序跑飞

大家好,我在用MC9S12XDT256这个片子来实现Flash Bootloader。需要用到中断重映射的功能,但是,我试着去try,发现有问题。现发一个附件,大家看看。
试验如下:

1. when I add this code "IVBR = 0x7Fu;" to main.c , this project is always reset.
2. when I delete this code "IVBR = 0x7Fu;" this project is running correctly.
main.c如下:

unsigned char test_flag = 0;
void main(void) {
   /* put your own code here */
  TSCR2 |= 0x84u; /* 16 Prescale Factor */
  TSCR1 |= 0x80u; /* start timer */
  //IVBR = 0x7F;   /* delte this code ,the code is OK */
  EnableInterrupts;
  for(;;) {} /* wait forever */
  /* please make sure that you never leave this function */
}
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC SAVE_ALL_REGS
void ECT_OVERLOW(void)
{
      test_flag++;
      
      if(test_flag == 3)
      {
        for(;;);
      }
}
#pragma CODE_SEG DEFAULT

interupt_vector_relocate.rar (309.35 KB)

我也想知道
你解决了没
void ECT_OVERLOW(void)
{
      test_flag++;
      
      if(test_flag == 3)
      {
        for(;;);
      }
}

如果这是中断程序的话,那你就写错了啊。要加中断关键字的
感觉你应该在你的PRM文件中加入中断程序的入口地址 VECTOR ADDRESS 0X(XXXX) ECT_OVERLOW.
或者采用void interrupt 中断号 ECT_OVERLOW()的方式定义中断程序。
#pragma TRAP_PROC已经告诉编译器这个是中断函数,所以不需要再加interrupt关键字了。
这个问题需要将中断地址重新定义一下。重映射实际上需要两套中断地址,你的这个只能将ECT_OVERLOW映射到默认的地址,所以重映射后就定位不到那个中断了。因为prm文件是链接文件是在编译之后做的,所以在里面定义中断入口对重映射来说没有用,而应该在prm里面划出两套中断向量的地址,然后在程序中通过#pragma 指定到对应的地址。
修改PRM文件, 在prm文件最后一行添加 VECTOR ADDRESS 0x7FD6 ECT_OVERLOW
我试过应该可以运行。如果有问题再发帖讨论。
返回列表