C跳转到特定地址运行应用程序的效果

时间:2016-02-22 07:21:57

标签: c

我有STM32 MCU的C固件代码,我有2堆应用程序存储在不同的内存地址

  1. bootloader(0x8000000)
  2. 主要应用程序(0x8004000)
  3. 在我的bootloader中,我有一个跳转到 0x8004000 地址并运行该应用程序的函数

    但是,我想知道,当我跳到那个地址时:

    1. bootloader应用程序是否仍在运行?
    2. 引导加载程序中分配的内存仍然存在?或者我需要手动免费?
    3. 示例:

      我的bootloader有一个while循环闪烁一个LED,有些分配了环形缓冲区,所以当我跳转到我的主应用程序时,这个循环是否仍在运行?为环形缓冲区分配的内存是否会自动释放? 或者我需要手动完成?

      为什么会这样?

2 个答案:

答案 0 :(得分:1)

当您拨打GOTOJMP指令时,控制器将跳转到新位置。堆栈中的任何内存都将保留在堆栈中,堆中的所有内存仍将被分配。

然而,while循环不会在新位置运行,因为没有代码在新位置运行循环。

答案 1 :(得分:1)

如果引导加载程序是独立构建的,并且在跳转后没有进一步参与应用程序运行,它的分配,堆栈,堆完全不相关。因为主应用程序知道没有任何东西与它们相关并且不关心。它可能很乐意覆盖它们。

如果主应用程序要使用引导加载程序中的代码,则它可能需要也可能不需要私有数据。可以通过软件中断调用引导加载程序中的可重入函数,而不需要任何专用于引导加载程序的数据,或者引导加载程序和主服务器的链接程序脚本可以定义数据和/或堆栈部分供引导加载程序代码专用。

'LED闪烁等'是什么?您没有解释如何在您的设计中管理executin。是引导加载程序使用的多任务系统,还是主应用程序应该运行回调的线程?要么可以轻松完成 - 引导加载程序线程可以调用主应用程序,或者主应用程序线程可以通过软件中断调用引导加载程序代码。

您没有详细说明系统的整体设计。我们怎么知道你的系统是如何工作的 - 你设计了它!