当前位置: 首页 > 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/661776/

相关文章:

  • 邯郸网站设计怎么开发保定网络营销网站建设
  • 厦门市建设局网站住房保障专栏wordpress预览pdf
  • 潍坊网站建设求职简历网站商城首页怎么做吸引人
  • 织梦做的网站怎样网站上的logo怎么做
  • 花店网站模板做论坛网站 备案
  • 建怎么网站比较赚钱太原制作微信网站
  • 网站网站开发逻辑友情链接方面
  • 超大网站制作素材吴中区做网站
  • 服装租赁 网站 php微信运营推广方式
  • 如何做网站卖衣服公司建设网站需要注意什么
  • 高大上网站设计dede网站改成自适应
  • 请求php网站数据库上海正规网站定制
  • 网站的后台管理账号和密码哔哩哔哩网站免费进入
  • 网站seo课程网站 锚点链接怎么做
  • 云浮源峰网站建设工作室地址曲靖市建设局网站
  • 网站制作备案上线流程网站后台logo
  • 南京做网站具体需要多少钱如何实现网站生成网页
  • 上海做网站的小公司有哪些如何推广自己的网站
  • 潍坊城市建设官方网站深圳品牌官网
  • net网站开发JD除了WordPress等
  • 大型网站开发流程和步骤南昌网站建设模板网络公司
  • 东莞家用台灯东莞网站建设新手自学做网站多久
  • 网站赏析企业网站宣传方案
  • 做专门的表白网站大学生网站建设
  • 商城网站设计定制企业建站网站建站系统
  • 中山市网站制作建设网站只
  • 无锡中小企业网站建设网站建设的基本流程和步骤
  • 网站死链接所有的竞价托管公司
  • 网站的外链是怎么做的青岛做网站哪家做的好
  • 设计一套网站费用线上企业订单管理系统网站