河南郑州网站建设哪家公司好,商场装修,电影网站怎么做关键词,网站搭建团队项目场景#xff1a;
在OTA中#xff0c;FLASH通常被划分为以下几种类型
bootloaderiapappbootloaderappapp保存区bootloaderapp1app2 不同的分区方式有不同的有点#xff0c;但是共同点都是需要执行分区跳转 问题1描述
但在分区跳转过程中遇到过使用不同的编译器不能跳转…项目场景
在OTA中FLASH通常被划分为以下几种类型
bootloaderiapappbootloaderappapp保存区bootloaderapp1app2 不同的分区方式有不同的有点但是共同点都是需要执行分区跳转 问题1描述
但在分区跳转过程中遇到过使用不同的编译器不能跳转的情况例如在keil中使用v5编译器可以正常跳转但是使用v6编译器就无法跳转了。
void JumpToCode(uint32_t addr) {uint32_t *inputAddr (uint32_t *)addr;uint32_t jumpAddr *(uint32_t *)(addr 4);if ((*inputAddr 0x2FFE0000) 0x20000000) {__set_MSP(*inputAddr);((void (*)(void))jumpAddr)();}
}问题1原因分析
发现v6和v5的编译优化不一样v6编译执行__set_MSP后跳转地址变量jumpAddr被释放就不能正确跳转了。把地址相关的变量声明为全局变量就可以正常跳转了
uint32_t *inputAddr; // !声明为全局变量防止执行__set_MSP后变量被释放
uint32_t jumpAddr; // !设置MSP后改变了栈底地址,导致原来的局部变量范围出了新栈的空间,被系统释放void JumpToCode(uint32_t addr) {inputAddr (uint32_t *)addr;jumpAddr *(uint32_t *)(addr 4);if ((*inputAddr 0x2FFE0000) 0x20000000) {__set_MSP(*inputAddr);((void (*)(void))jumpAddr)();}
}问题2描述
裸机时可以正常跳转但是开启freertos后分区无法相互跳转度娘说要跳转前需要关闭全局中断、关闭外设。我采用的分区方式是bootloaderiapappboot跳转前关闭中断和外设后跳转freertos的app分区没有问题而跳转裸机的iap分区时无法运行发现卡在初始化中。为什么跳freertos就ok呢最后发现MX_FREERTOS_Init的时候自动把中断打开了原来跳转后在main函数中需要重新开启中断在其他所有裸机的main函数的while前添加__set_FAULTMASK(0)开启中断即可freertos不需要。修改后的跳转代码如下
uint32_t *inputAddr; // !声明为全局变量防止执行__set_MSP后变量被释放
uint32_t jumpAddr; // !设置MSP后改变了栈底地址,导致原来的局部变量范围出了新栈的空间,被系统释放void JumpToCode(uint32_t addr) {inputAddr (uint32_t *)addr;jumpAddr *(uint32_t *)(addr 4);if ((*inputAddr 0x2FFE0000) 0x20000000) {HAL_RCC_DeInit();HAL_DeInit();__set_FAULTMASK(1);__set_MSP(*inputAddr);((void (*)(void))jumpAddr)();}
}问题3描述
boot可以跳iap和app了但是但是app无法跳iap最后发现FREERTOS运行在PSP模式而裸机运行在MSP模式尝试跳转前设定MSP就正常了添加__set_CONTROL(0)最终的跳转如下
uint32_t *inputAddr; // !声明为全局变量防止执行__set_MSP后变量被释放
uint32_t jumpAddr; // !设置MSP后改变了栈底地址,导致原来的局部变量范围出了新栈的空间,被系统释放void JumpToCode(uint32_t addr) {inputAddr (uint32_t *)addr;jumpAddr *(uint32_t *)(addr 4);if ((*inputAddr 0x2FFE0000) 0x20000000) {HAL_RCC_DeInit();HAL_DeInit();__set_FAULTMASK(1);__set_CONTROL(0);__set_MSP(*inputAddr);((void (*)(void))jumpAddr)();}
}