0

我想编写两个主要程序 P1 和 P2。P1会通过JTAG加载到STM32板子中,P2编译后生成的二进制文件会写入STM32板子外部闪存中。在 P1 中,做了一些事情后,我想将 P2 加载到 RAM 中并运行它。因此,程序计数器将跳转到 P2。

P1:

#include ......

void main(void)
{
    printf("Hello, I am program 1 !\n");

    //TO DO: load and run P2
}

P2:

#include ......

void main(void)
{
    printf("Hello, I am program 2 !\n");
}

那么,如果可能的话,有没有办法做到这一点。

4

2 回答 2

1

是的,这样做没有问题,这正是引导加载程序自黑暗时代以来一直在做的事情。

于 2014-08-01T15:20:42.753 回答
1

正如评论中指出的那样,便携式选项是有限的。但是,鉴于您使用的是嵌入式 STM32,我们假设某种程度的不可移植性是可以接受的。

GCC 和朋友允许用noreturn属性定义一个函数,所以这样的事情将完成一个无条件跳转到 P2。

    #define EXT_FLASH_ADDRESS  (0x60000000)
    void __attribute__((noreturn)) (*p2_entry)(void) = EXT_FLASH_ADDRESS;
    void main(void)
    {
        printf("Hello, I am program 1 !\n");

        p2_entry();
    }

需要注意的几点:

  • 的声明p2_entry()可能因您的工具链而异。图示版本只是通知 GCC 它不必以通常的方式维护调用堆栈。许多其他工具链提供了类似的机制。
  • 您需要EXT_FLASH_ADDRESS适当地修改。图示值具有代表性,因此您需要使用适当的值对其进行更新。(请查阅评估板的文档。)
于 2014-08-01T14:29:52.923 回答