DDR 频率为啥频繁跳动?

文摘   2024-07-11 18:23   广东  

关注+星号公众号,不容错过精彩

作者:HywelStar


今天调试代码过程中,突然发现DDR 频率偶尔在变动,难道是我的DDR 不稳定,布线问题?为了解决这个问题一探究竟。

问题现象

日志如下:

关键在于

[ 6052.262130] ddrc freq set to low bus mode

[ 6052.451790] ddrc freq set to high bus mode

日志过一会打印,偶尔又跳出打印。

问题分析

问题:

为什么DDR 的时钟一会设置低一会设置高,是哪里出现了什么问题么,不稳定么?

追踪打印日志位置:

"./drivers/soc/imx/busfreq-imx8mq.c"

set_high_bus_freq 是设置高频模式接口,哪里会调用?

发现是bus_freq_pm_notify调用,  这个函数处理系统进入和退出休眠时的总线频率调整。

set_high_bus_freq 函数的实现逻辑是:

  • enable 为 1 时:设置总线频率为高频模式,通常会涉及硬件寄存器设置、时钟频率调整等操作。
  • enable 为 0 时:恢复总线频率为低频模式,涉及恢复硬件寄存器和时钟频率等操作。

也就是说系统自动会进入休眠,造成ddr freq 设置成低模式情况。

结论

造成DDR 控制器的频率忽高忽低并非硬件问题,可能系统当前的负载和性能需求动态进行的,另外在休眠期和工作期都是存在一个动态的调整,这个也是正常的现象。以后遇到这种情况需要考虑频率切换原因可能是:

动态电压与频率调节 (DVFS):

节能策略:

负载变化:

另外对于CPU 频率也是同样道理,特别是对于设置这种低功耗模式,动态调整的模式下都可能出现这种情况。
查看内核配置CPU:果然选择的是POWERSAVE,当CPU频率降低,DDR控制器可能也跟着降低,内核中的 DVFS(动态电压与频率调节)机制通常会协同工作,以在性能和功耗之间取得平衡。


传送门:Linux CPU 状态与控制



码思途远
一位码农的日常分享,探索软件技术知识与新闻的数字十字路口。