专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
今天看啥  ›  专栏  ›  嵌入式微处理器

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

嵌入式微处理器  · 公众号  ·  · 2024-06-24 14:47
    

文章预览

最近在调试 can 通信,因为 c8t6 flash 很小,而鱼鹰培训工程完成的驱动越来越多,导致 flash 不足,因此把 bsp 的优化级别设置成 -O2。然而,谁知道在串口输入数据时直接 hardfault 了: 进一步跟踪发现问题出在这条代码中: uint32_t  cnt = *((  uint32_t *)pinfo->pdma_cnt_rx);  // 出错代码 ..... pinfo->last_dma_cnt = cnt; 这条代码最开始是这样: uint16_t  cnt = *((  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); 但昨天修改完编译优化级别后,又一次出现了,汇编分 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览