我们的教授要求我们考虑嵌入式系统设计,其中缓存不能充分利用它们。我一直试图找到这样的设计,但还没找到。如果您知道这样的设计,可以提供一些技巧吗?
答案 0 :(得分:5)
缓存利用事实数据(和代码)展示locality。
因此,一个不具有本地性的嵌入式系统将无法从缓存中受益。
嵌入式系统有1MB内存和1kB缓存。 如果这个嵌入式系统使用短跳转访问内存,它将在相同的1kB内存区域内保持很长时间,这可以成功缓存。 如果这个嵌入式系统在这个1MB内的不同地方跳跃并经常这样做,那么就没有地方性和缓存会被严重使用。
另请注意,根据体系结构,您可以为数据和代码提供不同的缓存,也可以使用单个缓存。
如果您的嵌入式系统花费大部分时间访问相同的数据并且(例如)在适合缓存的紧密循环中运行,那么您将充分利用缓存。 如果您的系统类似于将从任何内存范围中获取随机数据的数据库,则无法使用缓存来充分利用它。 (因为应用程序没有展示数据/代码的位置。)
有时,如果您正在构建安全关键或任务关键型系统,您将希望您的系统具有高度可预测性。缓存会使您的代码执行变得非常不可预测,因为您无法预测某个内存是否被缓存,因此您不知道访问此内存需要多长时间。因此,如果禁用缓存,它可以让您更精确地判断程序的性能并计算最坏情况的执行时间。这就是在这种系统中禁用缓存的常见原因。
答案 1 :(得分:1)
我不知道你的背景是什么,但我建议你读一下“volatile”关键字在c语言中的作用。
答案 2 :(得分:1)
考虑缓存的工作原理。例如,如果您想要取消缓存,取决于缓存,您可能会尝试将您经常访问的数据放在0x10000000,0x20000000,0x30000000,0x40000000等处。每个位置只需要很少的数据就会导致缓存抖动和显着的性能损失。
另一个是缓存通常拉入“缓存行”单个指令获取可能导致8或16个或更多字节或字被读取。在被驱逐以引入另一个缓存行之前,平均而言,您使用一小部分缓存行的任何情况都会使缓存中的性能下降。
一般来说,你必须首先了解你的缓存,然后想出办法来击败性能增益,然后考虑可能导致这种情况的任何真实情况。并非所有缓存都是平等的,因此没有一个好的或坏的习惯或攻击适用于所有缓存。对于具有不同存储器的相同高速缓存或其前面的不同处理器或存储器接口或存储器周期也是如此。您还需要将系统视为一个整体。
编辑:
也许我回答错了问题。不是......充分利益。这是一个更简单的问题。嵌入式应用程序在什么情况下必须触摸缓存之外的内存(在初始填充之后)?进入主存储器会在“完全有利”中消除完整的单词。 IMO。
答案 3 :(得分:0)
缓存不提供优势,实际上是控制内存映射外设的障碍。协处理器,电机控制器和UART之类的东西通常只是处理器地址空间中的另一个存储位置。这些位置不是简单地存储值,而是在写入或读取时可以在现实世界中发生某些事情。
缓存会导致这些设备出现问题,因为当软件写入时,外设不会立即看到写入。如果高速缓存行永远不会被刷新,那么即使在CPU发送了数百个命令后,外设也可能永远不会实际接收到命令。如果将0xf0写入0x5432应该导致#3火花塞触发,或者右侧副翼向下倾斜2度,则缓存将延迟或停止该信号并导致系统失败。
同样,缓存可以防止CPU从传感器获取新数据。 CPU从地址重复读取,缓存继续发回第一次存在的值。在缓存的另一侧,传感器耐心地等待永远不会出现的查询,而CPU上的软件则疯狂地调整控制,这些控制无法校正永不改变的仪表读数。
答案 4 :(得分:0)
除了Halst几乎完整的答案之外,我还想提一个额外的案例,其中缓存可能远远不是一个优势。如果您有多核SoC,其中所有核心当然都有自己的缓存,并且根据程序代码如何利用这些核心 - 缓存可能非常无效。例如,如果由于不正确的设计或程序特定(例如,多核通信),RAM中的某些数据块被2个或更多内核同时使用,则可能发生这种情况。