i.MX RT1180 XCACHE 介绍与配置

一. 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 参考手册

技术文档

类型标题档案
推广文件Data Sheet

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能