文章预览
最近在调试 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); 但昨天修改完编译优化级别后,又一次出现了,汇编分
………………………………