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

将中断向量表放到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, 下载次数: 82)
七哥 回答时间: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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版