IAP跳转的地址判断,为什么是0x2FFE0000 或者 0xFF000000 之类?

if(((*(vu32*)(app_addr+4))&0xFF000000)==0x08000000)
if(((*(vu32*)ck_addr)&0x2FFE0000)==0x20000000)

参看过ST官方文档或者原子的IAP大概都知道这个问题,做地址跳转前会有一个检查栈顶是否合法的条件判断。(sram rom 的地址空间段 根据实际取,这里例举的是st和gd的芯片)

1.首先FLASH的地址范围是0X08000000开始的。所以我们从内存上取出来的数据也应该是这个范围里,这里做检查程序地址是否合法。对于app_addr+4 , 结合图片一看,自然一目了然了。由于我们只需要判断是不是0x08000000,所以只需要 &0xFF000000 ,后面的地址会根据使用增长变化 ,但是它的最高位肯定是08 ,可以看看数据手册的flash空间大小起始地址等。因此最高位逻辑与的是FF

2.st系列或者国内的大部分替代st芯片,其实内部的sram和rom地址都差不多,以st为128Kb为例,堆栈地址的空间是0x20000000 - 0x2001FFFF,所以我们逻辑与上0x2FFE0000是没问题的,本身最大就是0x2001FFF,(不用管SP的bit16 - 0,只需要检查bit27-17)如果判断出来超过了就有问题。另外如果你是512Kb的sram,那么就该写 0x2FF80000,512Kb的就是0x20000000 - 0x2007FFFF不用管SP的bit18 - 0,只需要检查bit27-19

if(((*(vu32*)ck_addr)&0x2FF80000)==0x20000000)

64K一般就是对比 0x2FFF0000不用管SP的bit15 - 0,只需要检查bit27-16

if(((*(vu32*)ck_addr)&0x2FFF0000)==0x20000000)
注1:查了下历史,ST32最早的时候内部ram的大小基本在128Kb以内,官方的IAP_DEMO也是写的
这一句,小于128的使用0x2FFE0000也基本没问题,就一直在沿用,也是为什么很多列子看
到的都是这个的原因。最好还是按照自己实际的修改。注2:判断条件是((*(vu32*)ck_addr)&0x2FFE0000) 必须是栈地址没有超过128,而且堆
空间占用太大了的话,超了128,那么栈的地址也只能从128以后的位置开始,这种情况也必须修
改判断的条件值。(PS 用512Kb SRAM 的那位老兄也真是奢侈啊!!!),总之既要检查自己
代码的SRAM使用大小,也要检查芯片本身的SRAM大小,两者结合修改。

个人记录002--IAP程序做跳转的时候检查栈顶地址问题,(ck_addr0x2FFE0000)==0x20000000相关推荐

  1. IAP 程序 跳转问题

    问题: STM32F407 未加下面  清除所有中断标志位:IAP无法跳转到APP: 原因:开了定时器,配置了中断,在执行时为清除中断,导致程序无法跳转: void flash_load_applic ...

  2. stm32 IAP APP 相互跳转实验 (keil4 jlink STM32F407ZE

    1.实验目标:   STM32 IAP学习时,希望有一个快捷的方式去实验IAP与APP之间的相互跳转. 1)验证IAP跳转至APP    2)验证APP通过软件reset跳转至IAP (避免再一开始就 ...

  3. sql 只取一条记录_后端程序员必备:书写高质量SQL的30条建议

    前言 本文将结合实例demo,阐述30条有关于优化SQL的建议,多数是实际开发中总结出来的,希望对大家有帮助. 1.查询SQL尽量不要使用select *,而是select具体字段. 反例子: sel ...

  4. uniapp生成小程序码仿商品小程序码跳转到商品详情

    uniapp生成小程序码仿商品小程序码跳转到商品详情 之前在网上找了下没有相关教程去生成小程序商品小程序码微信扫码直接跳转到小程序详情页面,今天我们就用uniapp来实现这个,其实微信小程序端方法大致 ...

  5. 小程序页面跳转传递对象

    背景:今天在做小程序页面跳转时,遇到一个需要传递对象的情况.在这里记录一下. 基本方法:先把对象转换成JSON格式,然后跳转之后又从JSON转换回来. 使用的函数:JSON.stringify():对 ...

  6. python可以做测试软件吗_Python如何给你的程序做性能测试

    问题 你想测试你的程序运行所花费的时间并做性能测试. 解决方案 如果你只是简单的想测试下你的程序整体花费的时间, 通常使用Unix时间函数就行了,比如: bash % time python3 som ...

  7. 去除警告,打电话,发信息,应用程序之间跳转,打印沙盒路径,字符串名字转换方法,包装导航控制器等的代码...

    从偏好设置中读取值: 打电话代码: 发信息代码: 打印沙盒路径代码: 应用程序之间跳转代码: 跳转到苹果商店代码: 去除警告代码: 根据字符串名称转换成相对应方法的代码: #import " ...

  8. 7 个让您需要渐进式 Web 应用程序做项目开发的理由

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 自从渐进式Web应用程序(PWA)诞生以来,许多公司已开始利用这个新平台来增强用户体验并扩展新的用户群.其中 ...

  9. iOS App跟小程序之间跳转

    移动应用拉起小程序是指用户可以通过接入该功能的第三方移动应用(APP)跳转至某一微信小程序的指定页面,完成服务后跳回至原移动应用(APP). App和小程序互相跳转: 1)App主动发起小程序卡片分享 ...

最新文章

  1. 处理程序“WebServiceHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
  2. 交换网络安全防范系列五之802.1x-基于端口的网络访问控制技术
  3. python车辆管理系统_Python简易版停车管理系统
  4. linux+nm+内容详解,【Linux】nm命令中符号类型详解
  5. 计算机公式or,AND、OR函数详解_Excel公式教程
  6. android 豆瓣客户端 视频
  7. CentOS 7 安装 配置 Nginx + PHP
  8. SpringBoot之lombok引入后@Data无法生成getset方法
  9. java调python代码_java调用python代码
  10. IMWeb小白-诗歌作业
  11. 《Linux运维实战:搭建自己的Confluence知识管理系统》
  12. 网易云信服务监控平台实践
  13. OGG故障集锦(一)
  14. 织梦ajax登录界面,dede织梦后台登陆成功后又跳转到登陆页面
  15. pandas dataframe drop函数
  16. 另类玩法,使用 REST API 操作 RabbitMQ
  17. 跨专业考研学生的三个问题
  18. DBeaver显示Unknown database错误
  19. SVN提交代码时全选文件
  20. 第09篇:Spring声明式事务的实现方式

热门文章

  1. C++中头文件(.h)和源文件(.cpp)都应该写些什么
  2. [spring源码学习]六、IOC源码-BeanFactory和factory-bean
  3. python turtle库画画
  4. eclipse导入python文件夹_eclipse+pydev 怎么导入已有的python项目
  5. scala面向对象基础---类继承和特质
  6. 关于gcc -m32 -o 编译错误: /usr/bin/ld: cannot find -lgcc
  7. 从学校家长委员会谈开去
  8. 一位外包女程序员的心酸史和无奈
  9. aws cloudformation 堆栈集的创建和使用
  10. 酷我CEO雷鸣:差异化服务是制胜关键