Stm32的中断向量表和应用程序存放在同一个flash地址会发生覆盖吗?

调试程序的时候发生一个问题,烧录程序后,芯片不工作了,操作系统没有运行起来。查看了一下代码,觉得这个地方有点可疑,所以发帖请教一下各位。

中断向量表起始地址是0x08000000,这个地方我放了boot程序,然后在0x08008000处放应用程序,中断向量表也偏移到应用程序这个地址。这样看boot有一个自己的中断向量表,应用程序也有一个自己的中断向量表,这两个中断向量表的内容是一样的,也就是应用程序再去0这个起始地址去查中断入口,理论上也是可以的。但是程序会跑死,这是为什么?当然实际我是做了中断向量表偏移的。

另外一个问题,从上面的描述可以看出,我的boot和它自己的中断向量表在flash中的存储地址是一样的,应用程序也是如此,那么地址一样会不会产生覆盖。在什么情况下会产生覆盖,因为调试现象看,程序并不是每一次都会跑死,而是有概率性的,而且概率不高,一周才发生个两三次。

首先,关于中断向量表问题,需要考虑的因素有很多,比如你使用的是哪种处理器,处理器如何处理中断等。一般来说,一个中断发生时,处理器会跳转到中断向量表中相应的位置执行代码。如果你的boot和应用程序都有各自的中断向量表,且这两个表的内容是一样的,那么处理器应该能够正确的处理中断。然而,你提到的问题可能与中断向量表的偏移有关。一般来说,如果你偏移了中断向量表的地址,那么处理器在查找中断处理程序时需要知道新的地址。否则,它将会在错误的地方查找中断处理程序,可能导致程序无法正常运行。你可以检查一下你的中断向量表偏移是否正确,以及你的处理器是否正确地处理了这个偏移。

其次,关于存储地址问题,一般来说,如果两个程序使用相同的存储地址,那么可能会发生覆盖,具体取决于你如何编程以及如何操作这些地址。你可以考虑使用不同的存储地址为boot和应用程序,或者使用一种机制来防止覆盖,例如使用信号量或互斥锁。此外,你提到程序有时会"跑死",这可能是由于一个难以复现的错误,或者由于一种叫做"竞态条件"的问题,这是一种两个或多个操作的相对执行顺序会影响程序行为的情况。

在解决这个问题时,一种可能的方法是使用调试器来查看程序在哪里停止运行,或者使用日志来记录程序的运行情况,这可能有助于找出问题的根源。在这个过程中,如果可能的话,保持代码的简洁和可读性也很重要,因为这可以使问题更容易被找出和解决。

两个中单向量表的内容并不一样啊,boot的中断向量表跳转到boot程序段内,应用程序的中断向量表调整到应用程序范围内,范围都不一样,内容怎么会一样。即使你的boot和应用程序源代码一样,但肯定也是定位到不同的地址段的。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7786728
  • 以下回答来自chatgpt:

    由于问题描述不够清晰,我无法确定具体的解决方案。但是根据参考资料提供的内容,可以提出以下推测和建议:

    1. 可能会发生地址覆盖导致程序跑死。最好通过调试工具检测出现问题时的内存情况,确保没有出现地址覆盖。

    2. 另外,由于boot和应用程序在flash中的存储地址是一样的,可能会产生覆盖导致程序跑死。建议将二者的存储地址分开,确保不会产生冲突。

    3. 在开发过程中,应该遵循良好的编程规范和代码管理,确保程序的质量和稳定性。同时,加强测试和调试,避免因为一些小问题导致程序崩溃或出现其他错误。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^