微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Cortex M处理器中提取指令

如何解决如何在Cortex M处理器中提取指令

据我了解,Cortex M0 / M3处理器只有一个存储空间来保存指令和数据,并且只能通过存储总线接口进行访问。因此,如果我理解正确,则处理器必须在每个时钟周期读取一条新指令以进入流水线,但这意味着总线将始终忙于读取指令,以便如何同时读取数据(对于加载字/存储字指令,例)? 此外,从内存中读取指令的延迟是多少?因为如果不是一个周期,那么处理器必须不断地自行停止,直到提取下一条指令为止,那么如何处理它?

谢谢

解决方法

是的,这是发生的情况,处理器停滞了很多,无论是大型处理器还是小型处理器,充其量都是难上加难(尽管其中一些管道在cortex-ms上很浅,但是管道化)但是)。

我使用过的许多部件以及大多数供应商都接触过,闪存的速度是内核的一半时钟速度,因此即使在零等待状态下,您也只能每隔一个时钟获得一条指令(平均而言,如果一次获取一个半字,一次获取一个字(许多内核提供),那么理想的情况是每两个时钟两个指令或每个时钟两个指令。 thumb2当然会受到打击。 ST肯定有一个带有高级营销名称的prefetcher / cacher东西,做得很好。其他人可能也会提供这种服务,或者只是依靠不同部门提供的服务。

不同的皮质具有不同的总线混合。我讨厌von-Neumann / Harvard的参考文献,因为实际的哈佛建筑几乎没有实际用途,因此,“修饰的”形容词意味着他们可以做任何事情,并试图吸引在学校任教的人们认为哈佛意味着表演。总线上可能有多个事务,并且有不同数量的总线,当您进入并释放外围设备,apb1时钟控制ahb2时钟控制等的时钟时,这很明显。外围设备,闪存等。但是我们可以运行来自sram的代码,所以它不是哈佛。忘掉哈佛和冯·诺依曼的术语,只关注实际的实现。

总线文档和核心文档一样容易获得。如果您购买了正确的fpga板,则可以要求免费评估一个内核,然后您可以就其实际工作情况获得更近距离的个人看法。

一天结束时会有一些并行性,但是在许多芯片上,闪存的速度是一半,因此,如果您不每次获取两次,或者有其他解决方案,那么您几乎无法做到这一点,并且如果您具有其他相同的总线访问权限,则经常会停顿。同样,在许多此类芯片上,外设的运行速度无法与内核一样快,因此仅会导致停顿,但是即使外设以相同的时钟运行,也并不意味着其绕过csr或数据访问的速度与sram一样快,所以你在那里也会招致失速。

没有理由假设您从这些部件中获得的每个时钟性能指令只有一个全尺寸的arm或x86或其他。

虽然有一些重要的细节没有记录,只有在您获得内核时才能看到,但每个内核和总线上都有文档,以使您大致了解如何调整代码以更好地执行代码或调整对代码的期望会真正地表演。我知道我已经在这里和其他地方演示了这一点,即使使用ST还是很容易看到Flash和sram之间的性能差异,并且要花更多的时间才能执行基准测试。

您的问题在某些方面太过广泛了,cortex-m0和m3完全不同,一个是第一个推出并带有功能的滴水,另一个是针对大小进行调整的,并且通常只包含较少内容必须以这种方式竞争。那么,等待时间到底是多久?等等,严格来说,这就是芯片公司和芯片公司内部的一家人,因此对所有cortex-m产品的疑问非常广泛,对该问题有数十种不同的答案。 ARM制造内核而不是芯片,芯片供应商制造芯片并从各个地方购买IP并制造自己的产品,该芯片的一小部分可能是他们从处理器供应商那里购买的ip。

,

您所描述的被称为“冯·诺伊曼瓶颈”,在具有共享数据和程序存储器的纯冯·诺伊曼架构的机器中,访问通常是交错的。但是,您可能想查看“修改后的哈佛体系结构”,因为这基本上就是这里使用的内容。后备存储就像在von Neumann机器中一样被共享,但是指令和数据获取路径像在哈佛机器中一样是分开的,并且至关重要的是它们具有单独的缓存。因此,如果指令或数据获取导致缓存命中,则不会发生内存获取,并且没有瓶颈。

恐怕您的问题的第二部分没有多大意义,因为按照指令周期来谈论指令获取时间是没有意义的。根据定义,如果指令提取由于某种原因而延迟,则该指令(和后续指令)的执行必须延迟。通常,这是通过将NOP插入管道中直到下一条指令准备就绪(称为“使管道冒泡”)来完成的。

,

re:第2部分:可以对指令提取进行流水线处理,以隐藏部分/全部提取延迟。 Cortex-M3具有带3字FIFO的预取单元。 https://developer.arm.com/documentation/ddi0337/e/introduction/prefetch-unit(最多可容纳6个16位Thumb指令。)

该缓冲区还可以在数据加载/存储时以相互竞争的配置(不是哈佛拆分总线,并且没有数据或指令高速缓存)在配置中提供指令。

此预取当然是推测性的;丢弃在树枝上。 (它非常简单和小巧,不值得进行分支 prediction 尝试在解码之前甚至从即将到来的指令流包含分支的情况下尝试从正确的位置进行提取。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。