ARM非对齐操作异常解决过程

在测试MF固件时,发生一个非常诡异的异常,代码如下:

    CLR_DBG_Commands::Monitor_EraseMemory* cmd = (CLR_DBG_Commands::Monitor_EraseMemory*)msg->m_payload;

    debug_printf("EraseMemory addr=0x%08x len=%d\r\n", cmd->m_address, cmd->m_length);

指定第二行代码时,会跳到异常处理程序,发生了6号异常(用法异常Usage Fault) 我对ARM还是非常陌生,不知道怎么可能发生这个问题。 在今天之前,这行代码执行了无数次也未曾出错,最近也没有修改该函数或者相关函数的代码,昨天倒是大量修改了其它代码。 1,百度找资料 关键点是用法异常Usage Fault,以此为关键字搜索。有资料(http://www.docin.com/p-633872264.html)指出,用法异常包括:执行未定义指令、非对齐操作、除零。 前后两个显然不可能,中间这个非对齐操作倒是引起了我的注意。因为阅读MFPK代码的时候看到很多对齐操作的设计。 2,Keil调试 在Keil中调试这两行代码

0x080071DA 6A74      LDR      r4,[r6,#0x24]
  1350:         debug_printf("EraseMemory addr=0x%08x len=%d\r\n", cmd->m_address, cmd->m_length); 
  1351:  
0x080071DC A012      ADR      r0,{pc}+4  ; @0x08007228
0x080071DE E9D41200  LDRD     r1,r2,[r4,#0]
0x080071E2 F001FD93  BL.W     debug_printf (0x08008D0C)

抛出异常的是0x080071DE这一行,代码是LDRD r1,r2,[r4,#0],大意是把r4开始,偏移#0的数据加载到r1,下一个字加载到r2 从寄存其中看到,r4此时是0x200006D2,这是半字对齐而不是字对齐。 奇怪了,MDK为啥编译一个半字对齐的呢? 回到第一行代码的msg->m_payload,它是关键。因为它就是0x200006D2,如果r4没有字对齐,那么肯定跟这个msg->m_payload有关。 我们看看msg->m_payload是哪里分配的! 3,寻根 从代码中看到msg->m_payload来自msg->m_payload = pThis->m_receptionBuffer; 而m_receptionBuffer的声明

    COM_HANDLE    m_port;
    UINT8         m_receptionBuffer[ 2048 ];
    UINT32        m_flags;
    UINT32        m_lastPacketSequence;
    WP_Controller m_controller;

到这里,就明白了! 因为我昨天把typedef INT32 COM_HANDLE;改为了typedef INT16 COM_HANDLE; 非对齐操作相关资料 http://www.docin.com/p-218037008.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python爬虫与数据挖掘

Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结

前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式、BeautifulSoup、Xpath、CSS选择器分别抓取京东网的商品信...

16810
来自专栏逸鹏说道

Jupyter-Notebook版的博客园美化

文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html

17920
来自专栏知道一点点

走进AngularJs(二) ng模板中常用指令的使用方式

  通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的。ng的模板真...

16420
来自专栏ytkah

整理的dedecms标签大全,方便查找

  平时用dedecms开发经常会用到一些标签,特别是首页、栏目页、内容页,这些页面都会用到标签的调用,比如title、keywords、description...

29650
来自专栏liuchengxu

怎么写一个好的 Git commit message

网络上很多关于 commit message 的想法都来源于 tpope,在他看来,一个好的 Git commit messge 应该是这样的:

8220
来自专栏IMWeb前端团队

组件化开发--实践记录与总结

组件的规范可在组件实现时通过代码风格和格式来约束,也可通过基类扩展来强制规范。所以,当组件都是通过同一个基类扩展而来时,在那个基类上就可以很方便地统一组件规范,...

27770
来自专栏chafezhou

程序员探案之被吃掉的串口数据

19340
来自专栏农夫安全

浅析XSS的几种测试方法

0x00 背景 最近看到一个好玩的xss社区,准备通过几个经典的关卡来剖析一下XSS,本文仅提供经典案例。 试玩链接:http://tr.secevery...

35080
来自专栏谭伟华的专栏

Vue 组件开发实践之 scopedSlot 的传递

在使用Vue开发我们的vhtml-ui的组件库的过程中遇到了组件嵌套组件时需要传递scopedSlot的情况,官方的文档和教程目前还没有比较明确的指引,所以摸着...

4K20
来自专栏点滴积累

Cesium几个案例介绍

前言 本文为大家介绍几个Cesium的Demo,通过这几个Demo能够对如何使用Cesium有进一步的了解,并能充分理解Cesium的强大之处和新功能。其他的无...

5.6K50

扫码关注云+社区

领取腾讯云代金券