我有STM32 MCU的C固件代码,我有2堆应用程序存储在不同的内存地址
在我的bootloader中,我有一个跳转到 0x8004000 地址并运行该应用程序的函数
但是,我想知道,当我跳到那个地址时:
示例:
我的bootloader有一个while循环闪烁一个LED,有些分配了环形缓冲区,所以当我跳转到我的主应用程序时,这个循环是否仍在运行?为环形缓冲区分配的内存是否会自动释放? 或者我需要手动完成?
为什么会这样?
答案 0 :(得分:1)
当您拨打GOTO
或JMP
指令时,控制器将跳转到新位置。堆栈中的任何内存都将保留在堆栈中,堆中的所有内存仍将被分配。
然而,while循环不会在新位置运行,因为没有代码在新位置运行循环。
答案 1 :(得分:1)
如果引导加载程序是独立构建的,并且在跳转后没有进一步参与应用程序运行,它的分配,堆栈,堆完全不相关。因为主应用程序知道没有任何东西与它们相关并且不关心。它可能很乐意覆盖它们。
如果主应用程序要使用引导加载程序中的代码,则它可能需要也可能不需要私有数据。可以通过软件中断调用引导加载程序中的可重入函数,而不需要任何专用于引导加载程序的数据,或者引导加载程序和主服务器的链接程序脚本可以定义数据和/或堆栈部分供引导加载程序代码专用。
'LED闪烁等'是什么?您没有解释如何在您的设计中管理executin。是引导加载程序使用的多任务系统,还是主应用程序应该运行回调的线程?要么可以轻松完成 - 引导加载程序线程可以调用主应用程序,或者主应用程序线程可以通过软件中断调用引导加载程序代码。
您没有详细说明系统的整体设计。我们怎么知道你的系统是如何工作的 - 你设计了它!