在应用程序加载和运行程序中

时间:2014-08-01 13:48:06

标签: c assembly execution stm32 program-counter

我想写两个主程序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");
}

那么,如果有可能,有没有办法这样做。

2 个答案:

答案 0 :(得分: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。图示的值具有代表性,因此您需要使用适当的值更新它。 (请参阅您的评估板文档。)

答案 1 :(得分:1)

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