你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
a707083746 提问时间:2018-10-26 16:35 /
本帖最后由 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   284  funtion_inram.o(i.USART2_IRQHandler)


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

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



收藏 评论5 发布时间:2018-10-26 16:35

举报

5个回答
Mandelbrot_Set 回答时间:2018-10-26 17:31:45
目测,你只改了中断函数的位置,中断向量表还在在ER_IROM1

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

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页修改,可以运行了。
RAM.png KEIL中让程序在RAM中运行的办法.pdf (409.72 KB, 下载次数: 51)
toofree 回答时间:2018-10-27 00:13:18
为什么会有这个需求,为什么一定要把中断向量表定在RAM中?
如果你新建个在RAM中跑的程序,把RAM空间分成几块,那么中断向量表自然会在RAM中,中断也会从RAM,不只中断,全部程序都在RAM中执行。
但是如果你建的是在Flash中跑的程序,那么中断向量表自然也在Flash中。这时候,你要想把中断向量表放到RAM,会很麻烦。首先,得从Flash中复制一份中断向量表到特定RAM空间去,然后才是把中断向量表地址指向RAM空间。这个RAM空间,必须是在建工程的时候就保留出来的,如果不保留,有可能会当作程序变量存在空间、堆、栈等。即便,这样你把中断向量表成功放到RAM中,实际中断程序还会跳转到Flash中,因为向量指向实际程序地址没变过,那么只是在RAM中存个向量表,又有什么意义呢。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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空间了?



所属标签

相似问题

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版