一. CACHE 功能
二. CACHE 库函数介绍
三. CACHE 配置
四. 参考文档
一. CACHE 功能
CACHE(缓存)主要作用是减少 CPU 读取主存时等待的时间。缓存的存在主要原因是因为 CPU与主存储器之间速度相差太大,如果没有缓存的存在,CPU 直接访问速度很慢的主存储器,则会导致等待时间较长,从而导致整体执行效率下降。不把主存储器做成与缓存一样的速度,是因为那样价格可能会非常的昂贵。所以采用一个容量较小但是速度极高的缓存来提前加载数据,以减少 CPU 等待时间,既提高了速度又节约了成本。
i.MX RT1180 是双核异构 MCU,包含一个 Cortex-M7 和一个 Cortex-M33 内核,M7 有 32KB DCACHE 和 32KB ICACHE, M33 有 16KB DCACHE 和 16B ICACHE, ICACHE 是指令缓存,当 CPU 加载指令时会首先从 ICACHE 中加载,如果 ICACHE 中没有所需指令再从 ROM 中去读取指令。DCACHE 是数据缓存,当我们读取变量的数据时,首先会尝试从 DCACHE 中获取数据,如果 DCACHE 中有该变量则直接从 DCACHE 中读取,如果 DCACHE 中没有再从 RAM 中去读取数据。
i.MX RT1180 的 XCACHE 位于 AMBA AHB Input bus 和 output bus 之间,如下图所示:
XCACHE 针对 AMBA AHB 总线系统设计的特性和组成部分。它提供了针对缓存模式的灵活选择,包括缓存回写、缓存写透和非缓存模式,同时还提供了用于实现缓存功能的 RAM 连接以及用于访问缓存编程模型的外围接口。这些设计使得 XCACHE 能够有效地与 AMBA AHB 总线系统集成,提供高效的缓存功能以优化系统性能。
二. CACHE 库函数介绍
有关 CACHE 的函数位于 SDK 目录 devices\MIMXRT1189\drivers\cm33 或者 devices\MIMXRT1189\drivers\cm7 下的 fsl_cache.c、 fsl_cache.h 文件中。
函数名称 |
函数功能 |
XCACHE_EnableCache |
使能 Cache |
XCACHE_DisableCache |
禁用 Cache |
XCACHE_InvalidateCache |
使 Cache 无效 |
XCACHE_InvalidateCacheByRange |
使对应地址的 Cache 无效 |
XCACHE_CleanCache |
清除 Cache |
XCACHE_CleanCacheByRange |
清除对应地址的 Cache |
XCACHE_CleanInvalidateCache |
清除并无效 Cache |
XCACHE_CleanInvalidateCacheByRange |
清除并无效对应地址的 Cache |
ICACHE_InvalidateByRange |
使对应地址的 ICache 无效 |
DCACHE_InvalidateByRange |
使对应地址的 DCache 无效 |
DCACHE_CleanByRange |
清除对应地址的 DCache |
DCACHE_CleanInvalidateByRange |
清除并无效对应地址的 DCache |
三. CACHE 配置
Cortex-M33 执行以下连个函数使能 System cache 和 code cache,
/* Enable code & system cache */
XCACHE_EnableCache(XCACHE_PS);
XCACHE_EnableCache(XCACHE_PC);
以下为在 Hello world 例程中在运行 FFT 运算前拉高引脚电平,在运算结束后拉低引脚电平的例子,用于测试不开启和开启 cache 的效果。
#define TEST_LENGTH_SAMPLES 2048
extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES];
static float32_t testOutput[TEST_LENGTH_SAMPLES/2];
/* ------------------------------------------------------------------
* Global variables for FFT Bin Example
* ------------------------------------------------------------------- */
uint32_t fftSize = 1024;
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;
arm_cfft_instance_f32 varInstCfftF32;
/* Reference index at which max energy of bin ocuurs */
uint32_t refIndex = 213, testIndex = 0;
int main(void)
{
float32_t maxValue;
// char ch;
/* Init board hardware. */
BOARD_ConfigMPU();
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
// PRINTF("hello world.\r\n");
/* Enable code & system cache */
XCACHE_EnableCache(XCACHE_PS);
XCACHE_EnableCache(XCACHE_PC);
// XCACHE_DisableCache(XCACHE_PS);
// XCACHE_DisableCache(XCACHE_PC);
while (1)
{
// ch = GETCHAR();
// PUTCHAR(ch);
RGPIO_PortSet(RGPIO4, 1UL << (27U));
arm_cfft_init_f32(&varInstCfftF32,fftSize);
/* Process the data through the CFFT/CIFFT module */
arm_cfft_f32(&varInstCfftF32, testInput_f32_10khz, ifftFlag, doBitReverse);
/* Process the data through the Complex Magnitude Module for
calculating the magnitude at each bin */
arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);
/* Calculates maxValue and returns corresponding BIN value */
arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);
RGPIO_PortClear(RGPIO4, 1UL << (27U));
}
}
四. 参考文档
RT1180 参考手册