初级会员

- 积分
- 184
- 金钱
- 184
- 注册时间
- 2018-10-24
- 在线时间
- 23 小时
|
本帖最后由 kanChange 于 2023-1-6 17:42 编辑
前几天发了帖子,没啥回复(可能是我没编辑好),充分认识到靠人不如靠自己。一顿子编译下载,单步,然后百度,知识量暴增。
说回正题,IDMA/MDMA出问题一般就是DCache的问题。调试FatFS的时候就发现,无论直接用IDMA还是加MDMA,都会出问题。要不mount不上,要不就是读文件出问题。
我一般是用的原子的malloc思路分配的buffer,而原子一般是开Cache + WT的。
但是,原子的malloc是没有MPU保护的,会被DCache缓存。我的思路是常用AXISRAM的malloc资源直接配置成不缓存。
这样DMA传输就不会出问题了。
但即使是这样,也还是有可能出问题。像FatFS这样的东西,读SDCard的时候有时是直接读到f_read输入的buffer里面,但是也会用文件系统的buf[]。
这样如果文件系统的buf[]是在栈上的,那一样会出问题。这样需要暴力解决这个问题,读SDCard前调用SCB_InvalidateDCache()清cache。
如果工程的主RAM在DTCM上,我试过用MDMA应该不需要SCB_InvalidateDCache(),不知道稳不稳定就是了。毕竟DTCM/Cache的运行速度和CPU一样,AXISRAM只有200MHz。
我现在测试在DTCM上,跑wav播放器没啥问题。
再优化一下,如果输入buffer已经用MPU保护起来了,那就不需要MDMA了,但是和SDMMC总线不通的还是得用MDMA。比如,buffer在DTCM上。
|
|