本帖最后由 lymzzyh 于 2018-9-19 17:27 编辑 + k5 ^$ K6 `. S8 }2 P4 b
1 |! K, R4 Y; K- K, ^8 [, j+ \
库版本V1.7.2 文件 stm32f4xx_hal_sd.c * c* {3 j2 B2 E1 U5 z G
行数 503$ K1 ~0 {5 h; l
代码节选:
# v7 _; X7 r b8 ^- HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)& E# o( v) X5 q" M
- {$ l- q) r" w) b; G! j$ Y4 V
- SDIO_DataInitTypeDef config;
; L5 U4 J0 D' E* q' H: o3 T! } - uint32_t errorstate = HAL_SD_ERROR_NONE;
- Y" j8 o8 m4 x" a - uint32_t tickstart = HAL_GetTick();
7 k8 u$ ^6 B& T* @1 W - uint32_t count = 0U, *tempbuff = (uint32_t *)pData;
1 t L( I' I ~! L8 q; x! p% \ - /* ......... */ v4 ^3 _4 b/ H' z7 G8 I
- *tempbuff = SDIO_ReadFIFO(hsd->Instance);
1 o7 y% J: q9 L4 N" m& ^ - /* ......... */
# d6 F. e# w- V, h+ j Q - }
3 c: }) c0 x& J0 W$ f
复制代码 bug1: 此处pData 为u8 指针 强转 32位 编译后使用STM指令当pData未4字节对齐时将造成非对齐访问异常。, R( x) F/ G, R" m; u7 z
bug2: 若pData未4字节对齐,使用DMA模式时会强行向低地址进行4字节对齐造成向低地址的内存越界。
- R- H5 }/ x% H注:其中图示代码为bug1所出现的bug点,修复建议:检测对齐,发现未对齐时使用一个32位变量进行数据搬运。
+ T# I6 x# q9 ?( z5 }, lbug2未进行查找错误点 望ST工程师自行查找。, y# F1 Q$ k" a4 U6 t. s
0 `" P% h0 ]9 }% ^6 d' n
另:对于未知的字节流数据进行非数据等长指针的强制类型转换的这种低级错误发生的ST身上令我等非常失望,希望相关人员(大学生临时工)尽快修复
1 S& x; d: I* {% D1 n. D/ @" A/ L |
不关编译器的事情 指针强转是编译器无法预判是否对齐的 所以只能用STM指令去处理
回答三连:是这样的,暴露接口不对,该改
不过作为一个库,也确实应该考虑完善一些。
评分
查看全部评分
淡定一点,骚年
不不不 这是防喷手段 我已经帮喷子 喷过我自己了
评分
查看全部评分
到现在都没有FAE现身说法呢