a707083746 发表于 2018-10-26 16:35:17

将中断向量表放到RAM后就不正常了

本帖最后由 a707083746 于 2018-10-26 16:38 编辑

我单独建一个   Funtion_InRAM.c   把USART2_IRQHandler()放到这个文件里。
通过修改.sct文件,把中断函数放到RAM里
sct文件:
LR_IROM1 0x08000000 0x00020000
{ ; load region size_region
ER_IROM1 0x08000000 0x00020000
{ ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   }
RW_IRAM1 0x20000000 0x00005000
{ ; RW data
      Funtion_InRAM.o(+RO +RW)
      .ANY (+RW +ZI)
   }
}
在MAP文件里可以看到:
    USART2_IRQHandler                        0x2000002d   Thumb Code   284funtion_inram.o(i.USART2_IRQHandler)


然后在main()的开始中设置中断向量表到RAM中:
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x00);
但是程序没跑起来,改成 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);才可以。

谁知道把中断向量表放到RAM中,还需要什么步骤才能正常运行?
芯片是:STM32F103CB



Mandelbrot_Set 发表于 2018-10-26 17:31:45

目测,你只改了中断函数的位置,中断向量表还在在ER_IROM1

a707083746 发表于 2018-10-26 17:34:28

Mandelbrot_Set 发表于 2018-10-26 17:31
目测,你只改了中断函数的位置,中断向量表还在在ER_IROM1

不太懂,第一次改这个sct文件。。。

a707083746 发表于 2018-10-26 17:35:29

按照这个文档的第7页修改,可以运行了。

但作者在上图红线处留问题,我没想明白。不知道为什么这样改就好了,怕有什么后遗症。。。。

toofree 发表于 2018-10-27 00:13:18

为什么会有这个需求,为什么一定要把中断向量表定在RAM中?
如果你新建个在RAM中跑的程序,把RAM空间分成几块,那么中断向量表自然会在RAM中,中断也会从RAM,不只中断,全部程序都在RAM中执行。
但是如果你建的是在Flash中跑的程序,那么中断向量表自然也在Flash中。这时候,你要想把中断向量表放到RAM,会很麻烦。首先,得从Flash中复制一份中断向量表到特定RAM空间去,然后才是把中断向量表地址指向RAM空间。这个RAM空间,必须是在建工程的时候就保留出来的,如果不保留,有可能会当作程序变量存在空间、堆、栈等。即便,这样你把中断向量表成功放到RAM中,实际中断程序还会跳转到Flash中,因为向量指向实际程序地址没变过,那么只是在RAM中存个向量表,又有什么意义呢。

a707083746 发表于 2018-10-27 09:30:55

toofree 发表于 2018-10-27 00:13
为什么会有这个需求,为什么一定要把中断向量表定在RAM中?
如果你新建个在RAM中跑的程序,把RAM空间分成几 ...

      感谢你参与讨论!       我有这样一个需求,就是把串口接收到的80K的数据写入到事先已擦除好的flash里。
数据分为很多条ASCII报文,以“;”回车换行结尾,在接收到“;”时执行校验并写入。在波特
率为115200时,有数据丢失的情况。
      之前程序都是放在flash,怀疑在写flash时不响应串口中断,所以就有了把中断函数
和中断向量表放到RAM的想法。后来发现是我开的空闲中断影响最大,因为在空闲中断
里把接收计数清零了,80K的数据是用串口助手以文件形式发的,以为是连续的,但从
结果来看是引发了空闲中断,把这里改后测试多次都没问题。
      对于改中断向量表位置的问题,其实我不理解,也是最近才在网上找资料看的。(我上传的PDF)
   我建的是flash中跑的程序,只是把串口接收函数放在RAM中。这样不会实际还在flash执行吧。
建工程的时候,已经修改了.sct文件,这样是不是相当于保留出来相应的RAM空间了?



页: [1]
查看完整版本: 将中断向量表放到RAM后就不正常了