0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

遇见一个编译优化导致的bug

鱼鹰谈单片机 来源:鱼鹰谈单片机 2024-08-12 17:26 次阅读

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

作者:鱼鹰Osprey

ID :emOsprey

最近在调试 can 通信,因为 c8t6 flash 很小,而鱼鹰培训工程完成的驱动越来越多,导致 flash 不足,因此把 bsp 的优化级别设置成-O2,谁知道在串口输入数据时直接 hardfault 了:

图片

进一步跟踪发现问题出在这条代码中:

uint32_tcnt=*((uint32_t*)pinfo->pdma_cnt_rx);// 出错代码
.....
pinfo->last_dma_cnt = cnt;

这条代码最开始是这样

uint16_tcnt=*((uint16_t*)pinfo->pdma_cnt_rx);

因为我的last_dma_cnt 变量是 16 bit,我想节省一下 ram 空间,因为实际上 DMA 的计数器也只使用了 16 bit。

uint16_t        last_dma_cnt;       // used in dma

但是测试时发现出现 hardfault 了,通过汇编分析发现是非四字节对齐访问 dma 外设,后面通过修改代码,强制使用 32 bit 访问,就再也没出现问题了。

uint32_t cnt = *(( uint32_t*)pinfo->pdma_cnt_rx);

但昨天修改完编译优化级别后,又一次出现了,汇编分析发现还是对齐问题,因为0x4002005c 这个地址确实是 DMA 的计数器地址。

只是再优化后,没按我的要求 32bit 访问,而是自作主张使用16bit访问,因为它发现 cnt 这个变量操作的地方都是 16 bit,想当然的给我在取值时也给我直接优化成 16 bit 访问。

图片

这样一来,由于 DMA 不支持 2 字节访问指令,因此直接 hardfault 了。为了解决这个优化问题,可以直接使用 volatile 关键字,保证编译器在取值时按照 4 字节对齐访问,如下:

uint32_t cnt = *((volatile uint32_t*)pinfo->pdma_cnt_rx);  // must: volatile uint32_t
汇编代码
0x0800BCA6 6800      LDR      r0,[r0,#0x00]

图片

完结撒花!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CAN通信
    +关注

    关注

    5

    文章

    93

    浏览量

    17803
  • 串口
    +关注

    关注

    14

    文章

    1540

    浏览量

    76099
  • 代码
    +关注

    关注

    30

    文章

    4730

    浏览量

    68264
  • 编译
    +关注

    关注

    0

    文章

    650

    浏览量

    32784

原文标题:遇见一个编译优化导致的 bug

文章出处:【微信号:emOsprey,微信公众号:鱼鹰谈单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【GCC编译优化系列】前后编译的两版本固件bin大小不样?

    【GCC编译优化系列】前后编译的两版本固件bin大小不样,怎么办?
    的头像 发表于 09-09 09:01 4499次阅读
    【GCC<b class='flag-5'>编译</b><b class='flag-5'>优化</b>系列】前后<b class='flag-5'>编译</b>的两版本固件bin大小不<b class='flag-5'>一</b>样?

    RISC-V中优化导致的问题案例

    本文介绍优化导致的问题案例
    的头像 发表于 06-08 10:02 662次阅读
    RISC-V中<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>优化</b><b class='flag-5'>导致</b>的问题案例

    IDF4.2.1的编译优化bug导致panic怎么处理?

    == 0) && (status.st_utx_out == 0));} 它是inline函数。我们都认为inline关键字,会告诉编译器内联此函数,于是它的代码
    发表于 06-21 10:55

    推荐时序优化的软件~~

    Hi,以前在学校的时候就经常遇见时序收敛的问题,尤其是改RTL好麻烦啊。工作以后和朋友们起做了时序优化的软件,叫InTime,希望可以帮助有相同问题的朋友。^_^我们搞了免费试用的
    发表于 05-11 10:55

    编译优化导致USART波特率配置错误,请问这是为什么?如何解决?

    菜鸟枚,遇到问题上网找不到答案,只好自己尝试,请大神指教。 问题描述:配置USART的波特率为38400,结果无法成功接收数据,检查后发现波特率配置寄存器BRR错误, 编译优化导致
    发表于 07-06 03:05

    由于InnoDB MVCC导致的并发BUG介绍

    [原]记录由于InnoDB MVCC导致的并发BUG
    发表于 07-17 09:46

    IAR编译优化等级设置介绍

    有限时可选择针对代码大小进行优化,对应用实时响应要求较高的情形则应选择针对代码运行速度进行优化。且需注意在项目调试过程中不应将优化等级设置的过高,因高度优化
    发表于 11-21 17:36

    IAR9202编译优化导致代码流程出错

    遇到IAR编译优化的问题:本想在profile中write callback中做特征值的有效性检查,却发现编译
    发表于 03-05 07:46

    rt-studio bug导致编译失败如何解决

    我使用rt-studio 编译工程 , 使用左上角的构建功能 编译成功,但是如果是由旁边的重新构建,就会报错,错误如下样的文件,使用构建就可以,重新构建就不可以,而且在使用重新构建后,再使用构建
    发表于 11-08 10:19

    rt-studio bug导致编译失败如何处理?

    我使用rt-studio 编译工程 , 使用左上角的构建功能编译成功,但是如果是由旁边的重新构建,就会报错,错误如下 样的文件,使用构建就可以,重新构建就不可以,而且在使用重新构建后,再使用构建
    发表于 04-27 10:54

    编译器_keil的优化选项问题

    keil编译器的优化选项针对ARM,对STM32编译优化的问题
    发表于 02-25 14:18 3次下载

    微软又证实Bug Windows 10或导致无法访问互联网

    据外媒报道称,微软证实了新的Bug,那就是Windows 10存在可能导致无法访问互联网
    的头像 发表于 03-28 11:20 2240次阅读

    冗余电路导致BUG

      昨天解了BUG低级错误导致BUG
    的头像 发表于 05-14 15:28 858次阅读
    <b class='flag-5'>一</b><b class='flag-5'>个</b>冗余电路<b class='flag-5'>导致</b>的<b class='flag-5'>BUG</b>

    编译器的优化选项

    程序首先要保证正确性,在保证正确性的基础上,性能也是重要的考量。要编写高性能的程序,第,必须选择合适的算法和数据结构;第二,应该编
    的头像 发表于 11-24 15:37 842次阅读
    <b class='flag-5'>编译</b>器的<b class='flag-5'>优化</b>选项

    Android编译优化之混淆配置

    为了使用java8及后续java新版本的特性,Google增加了编译过程—脱糖(desugaring),但这步会导致更长的编译时间,这
    的头像 发表于 12-21 09:21 1977次阅读
    Android<b class='flag-5'>编译</b><b class='flag-5'>优化</b>之混淆配置