当前位置: 首页 > news >正文

域名购买万网优化网站除了百度站长

域名购买万网,优化网站除了百度站长,佛山营销网站建设推广,百度搜索收录入口项目场景: 在OTA中,FLASH通常被划分为以下几种类型 bootloaderiapappbootloaderappapp保存区bootloaderapp1app2 不同的分区方式有不同的有点,但是共同点都是需要执行分区跳转 问题1描述 但在分区跳转过程中遇到过使用不同的编译器不能跳转…

项目场景:

在OTA中,FLASH通常被划分为以下几种类型

  • bootloader+iap+app
  • bootloader+app+app保存区
  • bootloader+app1+app2
    不同的分区方式有不同的有点,但是共同点都是需要执行分区跳转

问题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后分区无法相互跳转,度娘说要跳转前需要关闭全局中断、关闭外设。我采用的分区方式是bootloader+iap+app,boot跳转前关闭中断和外设后,跳转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)();}
}
http://www.yayakq.cn/news/985389/

相关文章:

  • 企业网站的制作哪家好我做的网站怎样推广
  • 电商网站开发教程网站改版域名不变
  • 跳转网站南京网站搜索优化
  • 广州网站建设工程定制自己的软件
  • 旅游网站制作文献wordpress 描述
  • 盘龙区网站建设外包哈尔滨制作手机网站
  • 能打开各种网站的搜索引擎成都房产信息网 官网
  • 网站建设ppt做公司网站哪个好
  • 个人网站可以做电商吗网站网址正能量
  • 网站在线留言如何做深圳做网站 信科网络
  • 网站建设 定制商城 小程序开发装修论坛网站有哪些
  • 网站及新媒体帐号内容建设wordpress商城主题付费
  • 网站制作策划建设大纲wordpress如何更改页面链接
  • 甘肃省交通建设项目招投标中心网站佛山做外贸网站服务
  • vs2008 做网站wordpress怎么用vue
  • 如何自己做个网站网站图片地址怎么做
  • 上海个人建站专业做网站公司排名
  • 网站技术支持 新锐网络wordpress数据库修改后台网址
  • aspcms 网站标签调用烟台开发区网站制作公司
  • 做网站视频教程北京网站开发哪家好薇
  • 企业建设电子商务网站的预期收益木方东莞网站建设技术支持
  • 贵阳网站设计多少钱腾讯云 怎样建设网站
  • 网站建设有哪些环节商城网站建站系统源码
  • 网站使用帮助内容信丰县建设局网站
  • 如皋做网站的公司网站图片有什么要求
  • 建立公司网站要多少钱东莞网站推广教程
  • 移动端的网站怎么做的中文域名可以做网站吗
  • 网站策划是做什么的备案的网站换空间
  • 做网站要租服务器在线设计平台崭露头角
  • 新手用jsp做网站WordPress分类获取子分类