我正在使用mbed的LPC 1768板(使用cortex M3 cpu),并且在这里尝试实现一些功能,主要是从SD卡升级用户应用程序,我正在编写两个程序,首先是 bootstrap /纳米内核,以及一个用户应用程序(helloworld将作为一个开始):

  • 0x00地址处的Bootloader/nano内核运行,它将进行一些检查并最终将SD卡中的二进制文件抓取到
  • 引导加载程序/纳米内核将在地址0x9000复制此二进制文件(以后可能需要更改,但是引导加载程序/纳米内核未使用此空间,因此应该可以)
  • bootstrap 以0x9000 + 4
  • 跳转到用户应用程序

    SD卡非常容易锻炼,我在跳跃部件方面遇到了问题。这是跳转功能的代码。
    void run(void) {
    
      void (*user_code_entry)(void);
    
      unsigned *p;
      SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);
    
      // Load contents of second word of user flash - the reset handler address
      // in the applications vector table
      p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000
    
      user_code_entry = (void (*)(void))p;
    
      // Jump to user application
      user_code_entry();
    

    }

    因此,我已经编译(我正在使用Keil uvision4)用户应用程序,将起始地址更改为0x9000。如果我对板进行编程(使用flashmagictool),然后手动跳转(仍使用flashmagictool)到0x9004(0x9000 + 4),则用户应用程序将运行,因此我相信编译工作正常,因此user-app可以在0x9000上运行。

    但是,如果我运行bootloader/nano-kernel,该程序将不会跳转到用户应用程序,并且不幸的是,由于无法调试,我不确定会发生什么...我也尝试过不使用SD副本部分,因此我首先仅对跳转到0x9004进行编程来对 bootstrap 进行编程。然后,我对位于0x9000的用户应用程序进行编程。如果我重新启动电路板,则引导加载程序会运行,但不会跳转到用户应用程序。我检查了内存,似乎两个程序(引导加载程序+用户应用程序)都是正确的,并且在正确的位置。

    我确定我在这里遗漏了一些东西,是否应该查看任何低级代码?我已经在线阅读了文档的色调,从发现的示例中,它们正以与我相同的方式跳转到用户代码...非常感谢您的帮助。

    最佳答案

    Cortex M3只能在Thumb模式下运行。因此,您始终必须跳至address +1,否则将生成故障。

    你试一试:
    user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);

    关于c - 用于Cortex M3的Bootloader,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12715556/

    10-11 16:45