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还是非常陌生,不知道怎么可能发生这个问题。

在测试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

 

我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
相关文章
|
算法
嵌入式ARM设计编程(五) 实现信号的FIR滤波操作
嵌入式ARM设计编程(五) 实现信号的FIR滤波操作
68 0
嵌入式ARM设计编程(五) 实现信号的FIR滤波操作
|
22天前
|
数据处理 编译器 数据库
x64 和 arm64 处理器架构的区别
x64 和 arm64 处理器架构的区别
450 0
【各种问题处理】X86架构和ARM架构的区别
【1月更文挑战第13天】【各种问题处理】X86架构和ARM架构的区别
|
22天前
|
缓存 API Android开发
一起学点ARM的微架构二?
一起学点ARM的微架构二?
92 1
|
1天前
|
Ubuntu Windows
ubuntu 安装vnc_vnc4server arm架构
ubuntu 安装vnc_vnc4server arm架构
|
13天前
|
弹性计算 编解码 运维
飞天技术沙龙回顾:业务创新新选择,倚天Arm架构深入探讨
基于「倚天710自研芯片+CIPU云原生基础设施处理器」组合的倚天ECS实例为解决算力挑战提供新思路。
|
14天前
|
弹性计算 编解码 运维
飞天技术沙龙回顾:业务创新新选择,倚天Arm架构深入探讨
阿里云、平头哥与Arm联合举办的飞天技术沙龙在上海举行,聚焦Arm Neoverse核心优势和倚天710计算实例在大数据、视频领域的应用。活动中,专家解读了倚天710的性能提升和成本效益,强调了CIPU云原生基础设施处理器的角色,以及如何通过软件优化实现资源池化和稳定性平衡。实例展示在视频编码和大数据处理上的性能提升分别达到80%和70%的性价比优化。沙龙吸引众多企业代表参与,促进技术交流与实践解决方案的探讨。
飞天技术沙龙回顾:业务创新新选择,倚天Arm架构深入探讨
|
21天前
|
消息中间件 存储 Apache
MQ产品使用合集之有RocketMQ arm架构的镜像吗
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
213 1
|
22天前
|
敏捷开发 数据可视化 物联网
云效产品使用常见问题之用ARM架构的机器意义不知道如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。