硬汉嵌入式论坛

 找回密码
 立即注册
查看: 326|回复: 5
收起左侧

[DMA] 在调试dma的时候遇到的和cache mpu相关的一些问题

[复制链接]

4

主题

6

回帖

18

积分

新手上路

积分
18
发表于 2024-2-22 23:39:22 | 显示全部楼层 |阅读模式

    之前看硬汉老哥的视频时候听到,关于使用cache时候时候可能出现数据一致性问题,之前没有特别重视,今天好像碰到这方面的问题了,不是特别明白,求大佬们帮我分析一下为啥。


条件:我是在dmamux定时器触发与dma输出16路脉冲的程序上改的,我dma设置成循环模式,一字节,没开fifo,用了这个函数
[C] 纯文本查看 复制代码
HAL_DMA_Start_IT(&DMA_Handle, 0x24000000, 0x24010000,8);
,定时器是一直开着的。

DMA的配置,两块内存初始,还有自动运行和按下按键之后的图在下面。


碰到的问题:按理来说dma会不停的往0x24010000这个地址搬运数据,我选择一直运行,我刚开始发现他确实搬数据过去了,就是自动运行那个图。然后我按下按键会往0x24010000这个地址写16个ff,就是按下按键那个图。
         第一时间没察觉出什么不对,然后突然想到我dma是一直触发的,为什么他的前八个字节会是八个ff,不应该是源地址的数据吗。然后我打开dma的寄存器监控,我划红圈的地方,我看他isr还有ndtr数量一直在变,好像dma也没停下来啊,我就开始纳闷,到底是哪里出了问题。然后我突然想起来之前学mpu时候硬汉老哥提到的一致性问题。我就去看了mpu的设置,axi sram还真的开的是最高性能,allocated全开了。然后我就去把设置改了一下,共享,cache,buf全给关了,用了那个normal里面性能最低的模式。然后再去调试发现结果正确了,就是下面那个正确的图。
         但是现在问题又来了,为什么改了mpu之后他结果能正确啊,cache不是和cpu一起的吗,dma不是没有用到cpu吗。按理来说cache的策略应该不会影响到dma搬数据吧,不知道是哪个环节出的问题,请大佬们指点我一下





自动运行和按下按键

自动运行和按下按键

初始状态

初始状态

DMA的配置

DMA的配置

按完按键

按完按键

正确结果

正确结果
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-2-23 09:42:37 | 显示全部楼层
你的CPU往DMA的发送缓冲区写数据,这个是有写Cache参与的。如果Cache命中,会实际写入到你的Cache里面,没有更新到实际的SRAM里面
回复

使用道具 举报

4

主题

6

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-23 12:45:11 | 显示全部楼层
eric2013 发表于 2024-2-23 09:42
你的CPU往DMA的发送缓冲区写数据,这个是有写Cache参与的。如果Cache命中,会实际写入到你的Cache里面,没 ...

老哥,cpu往dma发送缓冲区写数据是在什么时候进行的啊,dma什么时候会用到cpu啊
回复

使用道具 举报

4

主题

6

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-23 13:04:38 | 显示全部楼层
eric2013 发表于 2024-2-23 09:42
你的CPU往DMA的发送缓冲区写数据,这个是有写Cache参与的。如果Cache命中,会实际写入到你的Cache里面,没 ...

老哥,我又去试了一下,按完按键之后目标地址就是16个ff,然后我又弄了个按键,试了一下分别运行cleaninvalidate,clean,invalidate的结果,cleaninvalidate的结果是正确结果跟上面图一样,但是后面两个都有些问题,clean之后没有反应,还是16个ff,invalidate之后是03020100 07060504 00000000 00000000,后面的八个ff也变成00了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-2-23 13:36:26 | 显示全部楼层
WenShan 发表于 2024-2-23 12:45
老哥,cpu往dma发送缓冲区写数据是在什么时候进行的啊,dma什么时候会用到cpu啊

你这个代码不是GPIO输出脉冲吗,也就是DMA将你RAM里面的数据发送到GPIO输出寄存器。

RAM里面数据初始化是需要CPU参与的。
回复

使用道具 举报

4

主题

6

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-23 13:41:03 | 显示全部楼层
eric2013 发表于 2024-2-23 13:36
你这个代码不是GPIO输出脉冲吗,也就是DMA将你RAM里面的数据发送到GPIO输出寄存器。

RAM里面数据初始 ...

啊不是啊,我只是在这个例子上面改的,改成memtomem,从0x24000000发到0x24010000
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 11:07 , Processed in 0.235681 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表