【发布时间】:2018-07-31 17:31:19
【问题描述】:
我想让基于 imx6s 的主板上的 CPU 频率不变。即使是 WFI 呼叫也不应该受到影响。到目前为止,我看到处理器处于 WFI 模式期间 CPU 频率显着下降。
根据technical reference manual for imx6s低功耗模式,处理器将在WFI之后转移,由CLPCR寄存器的LPM位配置(第855页)。我已将 LPM 位设置为 0x0,即所谓的 RUN 模式。据我了解,这应该足以不让处理器进入任何类型的睡眠模式(imx 上的等待或停止)。
这背后还有别的原因吗?我在这里错过了什么吗?
假设我使用非linux自定义环境。
附录(我测量的方式和内容):
实验如下所示: 1. 使用 WFI
p1 = ArmPmuGetCpuCycles()
Sleep(100 miliseconds) <- here it goes to WFI
p2 = ArmPmuGetCpuCycles()
p2 - p1 = 600 microseconds
2。没有 WFI
p1 = ArmPmuGetCpuCycles()
Sleep(100 miliseconds) <- WFI is removed
p2 = ArmPmuGetCpuCycles()
p2 - p1 = 100 miliseconds
【问题讨论】:
-
不清楚你想要实现什么。有低功耗时钟以固定频率在所有模式下处于活动状态。您是否想要更高的时基来测量更精细的粒度,但要在睡眠模式转换期间进行?此外,有些事情取决于硬件设计(什么时候有电源,什么晶体/OSC可用)。还有,linux-kernel这个标签有点误导人?
-
@artlessnoise “您是否想要更高的时基来测量更精细的颗粒,但要在睡眠模式转换期间” - 是的。我希望在 WFI 转换期间启用 CPU 时钟,因为我使用 PMU 计数器进行时间测量。而且我不知道两者之间是否有 Sleep() 。我使用 PMU 计数器,因为它是系统中最快的时钟源。关于 linux-kernel 标签 - 请忽略它。
-
这是反直觉的,并不是任何普通人都想要的,所以我希望芯片设计人员可能不允许它来防止错误。为什么要使用
WFI并保持 CPU 时钟启用。这违背了WFI的目的?如果它用于调试并且您具有物理访问权限,则可以使用 GPIO 切换和范围。增量应该非常准确。 -
这并没有违背 WFI 的目的,因为 WFI 不仅仅是关于 CPU 时钟的日落。您可能希望保留 CPU 时钟以避免任何类型的延迟。 “我希望芯片设计人员可能不允许它防止错误” - 正如我之前所说 - CLPCR 寄存器中 LPM 位 = RUN 模式的含义是什么? (见问题正文)。
-
WFI是为了节约能源。保持 CPU 时钟处于活动状态不会节约能源,尤其是当 CPU 处于静态时。我猜 DDR 没有被访问,但保持 CPU 时钟处于活动状态可能并不比缓存中的自旋循环多多少能量。这些模式在文档的其他地方定义; RUN 是最高功率的“睡眠”模式。请参见第 817 页。您可以使用 CCGR 启用 EPIT 并将其用作时间源。 ARM 内核是硬编码的,因此飞思卡尔/恩智浦无法(轻松)配置逻辑。如果可能,请查看 ARM 文档,而不是 NXP。