【问题标题】:Cortex M0+ Jump to user application failingCortex M0+ 跳转到用户应用程序失败
【发布时间】:2019-10-09 03:38:22
【问题描述】:

我有一个 KL17,我正在尝试编写一个引导加载程序以允许 OTA 更新。我在跳转到用户应用时遇到问题,这就是我正在尝试的。

void JumpToUserApplication(uint32_t userSP, uint32_t userStartup)
{
printf("MSP BEFORE: %x \n", __get_MSP());
printf("PSP BEFORE: %x \n", __get_PSP());

SCB->VTOR = userSP; // SET UP INTERUPT VECTOR TABLE FOR APP
// set up stack pointer
__set_MSP(userSP);
__set_PSP(userStartup);
void (*user_app)(void) = userStartup;
user_app();

printf("BAD MSP AFTER: %x \n", __get_MSP());
printf("BAD PSP AFTER: %x \n", __get_PSP());

}

我这样称呼它:

JumpToUserApplication(PROGRAM_ADDRESS, (PROGRAM_ADDRESS+0x4));

我希望它跳转到应用程序,但是实际上发生的是引导加载程序实际上重新启动,就好像它回到引导加载程序重置...

WELCOME TO THE BOOTLOADER! 
MSP BEFORE: 20005fc0 
PSP BEFORE: 20006000 
WELCOME TO THE BOOTLOADER! 
MSP BEFORE: 20005fc0 
PSP BEFORE: 20006000
... and so on. 

感谢您的任何意见,谢谢!

【问题讨论】:

  • 这个组装成什么?它应该只有几条指令,而且应该更容易调试。
  • 代码很简单。 PSP 值要求userStartup 可被 8 整除,但将其作为函数调用则要求它是 odd 值(拇指位设置)。这两个要求不能同时满足。
  • psp 被设置为入口点?很难尝试用拇指做到这一点,因为这取决于工具和使用的指令,您必须设置或不设置 lsbit。使用真正的组装更容易。用这些值调用一个函数,然后让真正的程序集完成剩下的工作。
  • 实际上不仅更简单,而且是确保代码正常工作的唯一方法。
  • 谢谢大家,我很确定主要问题实际上是@TurboJ 使用此数组方法指示的值效果很好。

标签: c assembly arm bootloader mo+


【解决方案1】:

此方法有效:

#define PROGRAM_VECTOR_TABLE ((uint32_t *) PROGRAM_ADDRESS)

void jump_to_app(void)
{
    static void (*go_to_app)(void) = 0;
    go_to_app = (void (*)(void))(PROGRAM_VECTOR_TABLE[1]);
    SCB->VTOR = (uint32_t)PROGRAM_VECTOR_TABLE;
    __set_MSP(PROGRAM_VECTOR_TABLE[0]);
    __set_PSP(PROGRAM_VECTOR_TABLE[0]);
    go_to_app();
}

进行了一些更改,但是我注意到转到应用程序的向量地址解析为与我尝试的不同的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2019-12-26
    • 2020-03-22
    • 2019-02-09
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多