我正在尝试使用CPU皮质m4模拟STM32机器的时钟控制。 STM32 reference manual中提供了时钟,由HCLK提供给内核的时钟。
RCC用AHB时钟(HCLK)除以8来馈送Cortex系统定时器(SysTick)的外部时钟。SysTick可以与此时钟或Cortex时钟(HCLK)一起工作,该时钟可以在SysTick控件中配置和状态寄存器。
现在,QEMU已经对Cortex m4进行了仿真,而我将其用于STM32仿真。我的困惑是,我应该提供我为STM32开发的“ HCLK”时钟频率,以将时钟脉冲发送到皮质m4还是皮质-m4本身设法拥有自己的HCLK时钟频率为168MHz的时钟?还是时钟频率不同?
如果我必须将此频率传递给皮质m4,该怎么办?
答案 0 :(得分:2)
QEMU的仿真通常不会尝试仿真以兆赫兹速率发送脉冲的实际时钟线(这效率极低)。而是当来宾对计时器设备进行编程时,计时器设备的模型会设置一个内部QEMU计时器,以在适当的持续时间后触发(然后,该处理程序将引发中断线或执行任何模拟硬件行为的必要操作)。持续时间是根据访客已写入设备寄存器的值以及时钟频率应为的值来计算的。
QEMU没有任何基础设施来处理诸如可编程时钟分频器或“时钟树”之类的东西,该时钟树围绕SoC路由时钟信号(可以添加一个,但尚无人解决)。取而代之的是,计时器设备通常要么以硬编码的频率编写,要么可以编写为具有QOM属性,以允许由开发者使用的电路板或SoC模型代码来设置频率。
特别是对于Cortex-M模型中的SysTick设备,当前实现将为其使用的QEMU计时器编程,其持续时间与以下频率对应:
(应将system_clock_scale全局设置为NANOSECONDS_PER_SECOND / clk_frq_in_hz。)
1MHz只是一个愚蠢的硬编码值,没人愿意费心去改进它,因为我们还没有遇到需要的客户代码。 system_clock_scale全局函数很笨重,但是可以正常工作。
这都不影响仿真的QEMU CPU的速度(即,在给定的时间段内执行了多少条指令)。默认情况下,QEMU CPU将“尽可能快地”运行。您可以使用-icount选项来指定您希望CPU以相对于实时的特定速率运行,这隐式地设置了“ cpu频率”,但这只能粗略地设置平均值-一些指令会以一种不太可预测的方式比其他人快得多。通常,QEMU的理念是“尽快运行来宾代码”,并且我们不会尝试任何接近周期精确或时间紧迫的仿真。
答案 1 :(得分:1)
答案 2 :(得分:0)
一个旧线程和一个经常被问到的问题,所以这应该可以帮助你们中的一些人尝试模拟皮层系统。
如果在启动时使用 .dtb,那么可以在您的 .dts 中添加一行 clock-frequency = <value>;
并重新编译它。这确实会提高皮质处理器的速度。显然,价值是一个很大的数字。