【问题标题】:Timer supply to CPU in QEMUQEMU 中向 CPU 提供定时器
【发布时间】:2019-11-13 03:54:54
【问题描述】:

我正在尝试使用 CPU cortex m4 模拟 STM32 机器的时钟控制。它在STM32 reference manual 中提供,提供给内核的时钟是由 HCLK 提供的。

RCC 以除以 8 的 AHB 时钟 (HCLK) 为 Cortex 系统定时器 (SysTick) 的外部时钟供电。SysTick 可以使用此时钟或 Cortex 时钟 (HCLK),可在 SysTick 控件中配置和状态寄存器。

现在 Cortex m4 已经被 QEMU 仿真了,我在 STM32 仿真中使用它。我的困惑是我是否应该提供我为 STM32 开发的“HCLK”时钟频率以将时钟脉冲发送到 cortex m4 或 cortex -m4 本身设法拥有自己的时钟,HCLK 时钟频率为 168MHz?还是时钟频率不同?

如果我必须将此频率传递给皮质 m4,我该怎么做?

【问题讨论】:

    标签: c embedded-linux stm32 qemu cortex-m


    【解决方案1】:

    Systick 由多路复用器提供,您可以选择 AHB 总线时钟或除以 8 个系统定时器时钟

    【讨论】:

    • 我认为您所指的参考手册是其他一些 STM32 变体,因为对于 STM32407,此寄存器不存在。我的问题更多地与如何将这个实现与 qemu 联系起来
    • @ChandrikaJoshi 我认为你是个 ARM 程序员新手。该寄存器存在于所有 Cortex 设备中,它是内核 的一部分。但是要阅读它,您需要阅读编程手册,而不是描述外围设备的参考手册
    • 是的,这是我第一个关于硬件仿真和处理 ARM 处理器的项目。你能指导我看编程手册吗?谢谢。
    • @ChandrikaJoshi 它和 RM 在同一个地方。去 STH STM 网页,找到你的微。在“资源”中,您将拥有所有文件。顺便说一句,为 uC 使用模拟器只是浪费时间。 Buj Nucleo 板并使用真正的硬件
    【解决方案2】:

    QEMU 的仿真通常不会尝试仿真以兆赫速率发送脉冲的实际时钟线(这会非常低效)。相反,当来宾对定时器设备进行编程时,定时器设备的模型会设置一个内部 QEMU 定时器以在适当的持续时间后触发(然后处理程序会引发中断线或执行任何必要的操作以模拟硬件行为)。持续时间是根据客户写入设备寄存器的值以及时钟频率的值计算得出的。

    QEMU 没有任何基础设施来处理诸如可编程时钟分频器或在 SoC 周围路由时钟信号的“时钟树”(可以添加一个,但还没有人使用它)。相反,定时器设备通常要么使用硬编码频率编写,要么可能被编写为具有 QOM 属性,该属性允许由创建它们的板或 SoC 模型代码设置频率。

    特别是对于 Cortex-M 模型中的 SysTick 设备,当前实现将对它使用的 QEMU 定时器进行编程,其持续时间对应于以下频率:

    • 1MHz,如果客户机已将 CLKSOURCE 位设置为 1(处理器时钟)
    • 如果客户已将 CLKSOURCE 设置为 0(外部参考时钟),则板模型已通过 'system_clock_scale' 全局变量(例如 mps2 板的 25MHz)进行配置

    (system_clock_scale 全局应设置为 NANOSECONDS_PER_SECOND / clk_frq_in_hz。)

    1MHz 只是一个愚蠢的硬编码值,没有人愿意改进它,因为我们还没有遇到过关心的客户代码。 system_clock_scale 全局是笨重的,但可以工作。

    这些都不会影响模拟 QEMU CPU 的速度(即它在给定时间段内执行多少指令)。默认情况下,QEMU CPU 将“尽可能快地”运行。您可以使用 -icount 选项指定您希望 CPU 以相对于实时的特定速率运行,这隐含地设置了“cpu 频率”,但这只会粗略地设置一个平均值——一些指令将以一种不太可预测的方式运行得比其他人快得多。一般来说,QEMU 的理念是“尽可能快地运行客户代码”,我们不会尝试任何接近周期精确或其他时间紧迫的仿真。

    自 2020 年起更新:QEMU 现在有一些 API 和基础架构用于对时钟树进行建模,这些内容记录在源代码树的 docs/devel/clocks.rst 中。这基本上是上述概念的正式版本,使一个设备更容易告诉另一个设备“我的时钟频率现在是 20MHz”,而无需像“system_clock_scale”全局变量或 ad-hoc QOM 属性这样的黑客攻击。

    【讨论】:

    • 这正是我想知道的。非常感谢@Peter。我想知道是否有任何文档可以让我获得有关模拟平台的此类信息?
    • 另外,如果我想比较实时时钟和 cpu 时钟和主机时钟的差异,我该怎么做? QEMU 中是否有任何选项 - 监视器?或者我将不得不点击一个变量并打印它?
    【解决方案3】:

    一个老话题和一个经常被问到的问题,所以这应该可以帮助你们中的一些人尝试模拟皮层系统。

    如果在启动时使用 .dtb,那么在您的 .dts 中,可以在“计时器”块中添加一行 clock-frequency = <value>; 并重新编译它。这确实会提高皮层处理器的速度。显然,价值是一个很大的数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多