everkimage 发表于 2018-7-5 10:41:38

bootloader跳入系统软件的方式

我用的是STM32F0系列的芯片,IDE是IAR,FLASH前16KB给了bootloader。
bootloader执行1秒后,通过下面代码跳入APP:
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
   ((pFunction)(*(__IO uint32_t*) (APPLICATION_ADDRESS + 4)))();
然后我优化了APP编译选项,导致bootloader无法跳入APP。降低优化条件,便可以。
不知道是bootloader跳入有问题,还是IDE优化有BUG所致。

wudianjun2001 发表于 2018-7-5 11:20:14

没看出啥问题来,我都是这样跳的
void execute_user_code(uint32_t Addr)
{
        /* Change the Vector Table to the USER_FLASH_START
        in case the user application uses interrupts */
        SCB->VTOR = Addr & 0x1FFFFF80;

        boot_jump(Addr);
}

everkimage 发表于 2018-7-5 13:17:34

wudianjun2001 发表于 2018-7-5 11:20
没看出啥问题来,我都是这样跳的
void execute_user_code(uint32_t Addr)
{


boot_jump()代码是怎么样的?

wudianjun2001 发表于 2018-7-5 13:40:32

everkimage 发表于 2018-7-5 13:17
boot_jump()代码是怎么样的?

__asm void boot_jump( uint32_t address )
{
        LDR SP,                 ;Load new stack pointer address
        LDR PC,         ;Load new program counter address
}

发表于 2018-7-5 14:01:29

可能是楼主优化代码以后,部分问题导致。建议楼主仿真测试一下。带有boot的程序也可以仿真的

everkimage 发表于 2018-7-5 16:22:01

安 发表于 2018-7-5 14:01
可能是楼主优化代码以后,部分问题导致。建议楼主仿真测试一下。带有boot的程序也可以仿真的 ...

仿真可以的。
就是最优化后bootloader跳不过去,应该没有执行到APP的初始化代码,因为出来的是bootloader的HardFault处理打印信息。
后来我降低优化等级就可以了,然后再最优化编译,也可以了。不知道怎么地。

everkimage 发表于 2018-7-5 16:24:39

wudianjun2001 发表于 2018-7-5 13:40
__asm void boot_jump( uint32_t address )
{
        LDR SP,                 ;Load new stack pointer address


你是直接设置SP。
我是调用__set_MSP()设置的。还有一个函数__set_PSP(),不知道是不是跟这个有关系。

发表于 2018-7-5 16:28:30

应该是把代码给优化掉了。

everkimage 发表于 2018-7-5 16:30:22

本帖最后由 everkimage 于 2018-7-5 16:32 编辑

everkimage 发表于 2018-7-5 16:24
你是直接设置SP。
我是调用__set_MSP()设置的。还有一个函数__set_PSP(),不知道是不是跟这个有关系。 ...
像HardFault的处理,就需要判断MSP和PSP,这部分机制有点忘了,哪位大神提示一下?跳入APP时设置MSP还是PSP,还是都可以?

ZDPHPN 发表于 2018-7-10 17:07:25

做个标记,之后写bootloader参考怎么让跳转:lol
页: [1]
查看完整版本: bootloader跳入系统软件的方式