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

标签 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");
}

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

最佳答案

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

GCC 和 friend 们允许使用 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。所示值具有代表性,因此您需要使用正确的值对其进行更新。 (查阅评估板的文档。)

关于c - 在应用加载和运行程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25081743/

相关文章:

使用 LuaJIT 调用标准打开对话框会导致访问冲突

在 SIGPIPE 中清理

c - fuse :创建线程时出错:资源暂时不可用

assembly - 如何寻址 32 位寄存器的高 16 位?

mysql - 有没有比我的笔记本电脑执行mysql更快的地方?

c - 我应该在套接字生命周期内什么时候设置 TCP_QUICKACK 选项?

windows - 在调用 Main() 之前 Windows 做了什么?

c - 我怎样才能把它变成 shellcode?

testing - 在concolic测试中, "concrete execution"是什么意思?

python - 为什么这个 python 脚本要等到计时器线程执行完毕?