本跳转程序靠bug运行,请不要优化

来源:公众号【鱼鹰谈单片机】

作者:鱼鹰Osprey

ID   :emOsprey

6a9a23bc45952e36d969a8da101573b0.png

图片来源于网络

绝大多数产品开发,软件一般都会设计成 boot + app 的形式,这是方便后续软件更新,否则更新会变成一个很麻烦的事情。

网上随处可见的跳转程序大概如下:

#define APP_START_ADDR          0x08040000 


void jump2app()
{
  typedef void (*func_app_start)(void);
   
  __disable_irq();
  
  func_app_start app_start = (func_app_start) (*(__IO  uint32_t*) (APP_START_ADDR + 4));
  
  __set_MSP(*(__IO  uint32_t*) (APP_START_ADDR));// 设置栈顶地址


  app_start();
}

大多数情况下,该程序跳转正常,但当你改变了编译器优化级别时,可能直接就 hardfault 了。

此时你会莫名其妙,为什么???

从鱼鹰18年接触到 boot 知识以来,都觉得这样的跳转程序理所当然,并且也没出现过问题,直到最近修改了优化级别,发现程序直接hardfault 了,根本没跳转到 app 中,才发现了这里隐藏的 bug。

调试发现,app_start 这个函数指针变成了异常值,但鱼鹰查看 0x08040000  处的内存空间值是正常的。那只能是代码问题了。

因此结合汇编和在线调试,终于发现,执行 __set_MSP 这条语句前 app_start 的值是正常的,执行后,这个值就异常了。

再结合 C 语言关于栈、局部变量的知识,立刻就知道是因为重新设置栈顶地址,但汇编代码不变,但是从新栈位置偏移取函数地址,因此跳转失败。

如:

1baf82682f246f901cab49d3de5719ee.png

新栈的位置,变量的值是未知的,用它进行跳转,失败是必然的。

但是为什么大部分情况下程序没有问题呢?

这是因为跳转程序很简单,局部变量少,那么这个 app_start 局部变量编译器可能就不会从栈中分配,而直接用一个寄存器存储数据,而寄存器是不受栈顶位置影响的,自然程序能跳转了。

但我们不能让程序运行正常与否由编译器随机决定,因此我们要避免这个 bug,让程序不管在何种优化级别函数多复杂的情况下,依然可以正常运行,因此还是有必要进行优化的。

最简单的方法,就是把这个 app_start 局部变量变成全局变量。这样变量就不会受到栈顶位置影响,自然可以避免了。

如:

#define APP_START_ADDR          0x08040000 


void jump2app()
{
  typedef void (*func_app_start)(void);
   
  __disable_irq();
  
  static func_app_start app_start = (func_app_start) (*(__IO  uint32_t*) (APP_START_ADDR + 4));
  
  __set_MSP(*(__IO  uint32_t*) (APP_START_ADDR));// 设置栈顶地址


  app_start();
}

如有更好的优化方法,欢迎留言讨论。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多奥淘宝客程序V6.2简称淘客程序,采用PHP+TOP/API2.0架构,代码与界面的分离,支持模板切换,完全免费升级无忧。多奥淘宝客程序有以下六大特点: 1. 卓越的访问速度和负载能力 并使用了强大的文件缓存机制,让淘宝客程序的网络瓶颈降到最低,使程序的执行效果更高、速度极快,同时也有效的降低了API调用的次数,降低了因为API超频而调用不到数据的情况。 2. 搜索引擎优化处理 解决了淘宝客API站搜索引擎不收录的问题,采用DIV+CSS制作的页面,采用对部分链接内容加密过滤等技术,对搜索引擎更加友好。后台自定义标题关键词等功能更是能极大的提高网站的标题内容的个性化,对搜索引擎收录非常有帮助。 3. 简洁的程序代码 不仅追求简洁的代码,也追求实用完善的功能。众多功能在后台管理都预设开关,管理员根据需要可以方便切换。 4. 大方美观的模板 实现代码与界面的分离,支持模板切换。程序提供多个大方美观的模板提供下载,用户也可以定制自己喜欢的样式。 5. 安全的架构 对用户的输入都进行严格的安全控制。对各种恶意的注入、跨站攻击等都有防御手段。 6. 免费开源升级无忧 程序代码开源并提供免费升级。简单易用,容易进行二次开发。做一个有技术支持的纯粹免费淘宝客程序。 【6.2更新】 1.进一步优化缓存删除机制,默认每天5点-6点之间进行自动清除过期缓存。 2.APP超限造成的失败率太高,总是报警问题。 3.增加伪原创配置,对搜索引擎收录有所帮助。 4.商品详情前后可以设置伪原创混淆内容,利于SEO。 4.增加图片伪本地化,可以伪造本地地址,流量充足的可以使用。 5.增加网址中文编码的切换设置。 6.增加商品页SEO设置的可用变量。 7.优化程序产品详情代码,提高核心运行效率。 8.修正模版1整合织梦文章首页调用不显示的BUG。 【6.1更新】 1.修正淘宝TOP平台BUG引起的部分商品点击“立即到淘宝购买”跳S8问题。 2.修正选择价格范围后翻页丢失的BUG。 3.后台关键词导航里,增加“关键词随机数”设置,如果设置不为0,将随机取关键词。 4.后台高级设置里,增加“首页页面更新时间”设置,可以设置综合首页的更新速度。 5.后台增加整合配置,可以根据需求设置是否整合文章及论坛系统。可以直接调用DISCUZ论坛、织梦文章、“DISCUZ x2”论坛和“wordpress”的功能。只需要在配置中心指定文章系统安装目录即可调用。此调用方式,是直接读取相关数据库显示,完全独立开,不需要生成文件啥的。指定好目录就可以自动读取数据库。也可以自由安装到任意目录,可以任意更换模板。并且可以自动兼容对应文章系统的UTF-8或者GBK编码。 对于织梦、DISCUZ、“DISCUZ x2”论坛和“wordpress的各种问题,一概不予回答,自行去对方官网查询教程 6.修正密码找回文件 7.去掉了跳转页的提交按钮和转向链接 8.增加服务器切换注释 9.店铺链接增加了加密处理 【运行环境】 1:Windows 平台:IIS/Apache + PHP(V5.0以上) 2:Linux/Unix 平台:Apache + PHP(V5.0以上) 开启伪静态功能需要服务器支持伪静态(rewrite)组件。 开启缓存需要300M+空间,不开启缓存100M空间。 后台地址/admin 后台帐号:admin 后台密码:adminadmin 后台恢复密码备用文件,文件名password.php.lock。需要恢复密码,将这个文件改名为password.php,访问即可修改密码。改完后记得改后缀。 演示:http://www.zazt8.com 本程序免费无商业版,有什么问题及建议可以去淘宝客程序推广交流论坛http://www.duoao.cn/或淘宝客推广高手交流QQ群:176440164(公益群广告止步,验证信息:淘客程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值