本帖最后由 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 |
评分
查看全部评分
不太懂,第一次改这个sct文件。。。
但作者在上图红线处留问题,我没想明白。不知道为什么这样改就好了,怕有什么后遗症。。。。
如果你新建个在RAM中跑的程序,把RAM空间分成几块,那么中断向量表自然会在RAM中,中断也会从RAM,不只中断,全部程序都在RAM中执行。
但是如果你建的是在Flash中跑的程序,那么中断向量表自然也在Flash中。这时候,你要想把中断向量表放到RAM,会很麻烦。首先,得从Flash中复制一份中断向量表到特定RAM空间去,然后才是把中断向量表地址指向RAM空间。这个RAM空间,必须是在建工程的时候就保留出来的,如果不保留,有可能会当作程序变量存在空间、堆、栈等。即便,这样你把中断向量表成功放到RAM中,实际中断程序还会跳转到Flash中,因为向量指向实际程序地址没变过,那么只是在RAM中存个向量表,又有什么意义呢。
评分
查看全部评分
感谢你参与讨论! 我有这样一个需求,就是把串口接收到的80K的数据写入到事先已擦除好的flash里。
数据分为很多条ASCII报文,以“;”回车换行结尾,在接收到“;”时执行校验并写入。在波特
率为115200时,有数据丢失的情况。
之前程序都是放在flash,怀疑在写flash时不响应串口中断,所以就有了把中断函数
和中断向量表放到RAM的想法。后来发现是我开的空闲中断影响最大,因为在空闲中断
里把接收计数清零了,80K的数据是用串口助手以文件形式发的,以为是连续的,但从
结果来看是引发了空闲中断,把这里改后测试多次都没问题。
对于改中断向量表位置的问题,其实我不理解,也是最近才在网上找资料看的。(我上传的PDF)
我建的是flash中跑的程序,只是把串口接收函数放在RAM中。这样不会实际还在flash执行吧。
建工程的时候,已经修改了.sct文件,这样是不是相当于保留出来相应的RAM空间了?