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

企业网站建设指导思想网页设计公司简介范文

企业网站建设指导思想,网页设计公司简介范文,中国风 wordpress,宜家在线设计项目场景: 在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/562691/

相关文章:

  • php网站微信登录怎么做wordpress 720云
  • 网站建设 案例展示做外文翻译的网站
  • 容桂网站制作动态哪个公司制作企业网站
  • 淘宝建设网站的目的是什么城乡与建设厅网站
  • p2p理财网站开发框架信息服务平台网站名称
  • 宁波手机网站开发公司六安网站
  • 租号网站是怎么做的wordpress 提交审批
  • 定制开发网站如何报价哪些网站不能备案
  • 北京做网站好wordpress标签关注
  • dedecms建站教程网站制作 温州
  • 响应式网站的原理怎样做网页游戏网站
  • 北京运营推广网站建设网站推广怎么做
  • 购物网站排名前十wordpress的安装注意
  • 免费背景图片素材网站大城 网站
  • 如何使用wordpress制作网站wordpress内网
  • 怎么做本地网站公司网站背景图片
  • 做网站需要公司吗网络规划设计师视频教程百度云
  • 开发公司和物业公司签协议seo排名点击报价
  • 网站侧面的虚浮代码永久免费个人网站注册
  • 网站建设包括内容wordpress 好用加速插件
  • 网站太花哨利用虚拟主机建设企业网站实验报告
  • 网站策划做营销推广搭建棋牌工具
  • html5响应式网站制作网络软文投放
  • 网站被挂黑后果导航站wordpress
  • 关于网站建设的申请报告中国在数码网站注册域名好>
  • 深圳网站建设的基本知识商丘建设厅网站首页
  • 办办网登陆石家庄网站排名优化哪家好
  • 主机屋vps网站助手使用阿里云建网站
  • 网站移动适配怎么做网站建设要不要学编码
  • linux系统做网站绍兴seo外包公司