【简介】
本地S32K3 系列的芯片内部的MCM (Miscellaneous Control Module )模块,以下是S32K3 手册中对MCM 的功能描述。

从上述描述可以看出MCM 包含了local memory 的属性描述信息和浮点运算的异常管理,芯片设计时为每个核心配置了一个MCM模块,从以下的寄存器地址信息也可知,MCM的地址为固定地址,这个地址也可以看出对应的地址映射到了arm 的私有总线地址,每个核心访问的为各自独立的的MCM模块。

E008 0000 从ARM-M 架构的文档中可以看出地址映射到了私有的总线的地址范围中,每个核心访问地址访问的为自己的私有地址。

【MCM 的 Local memory descriptors 信息】
MCU中可以获取当前的local memory 的信息,什么是local memory 可以从下图获取到答案,实际上就是单独可以被CPU访问的memory 空间,对应芯片设计时的Cache 和 TCM 的memory 空间。

从上述memory 的descriptors 类型描述支持以下的5种类型。

每种类型的信息对应一个寄存器

我们可以读取上述寄存器来获取当前芯片的local memory 的信息,LMEM_DESC 寄存器中描述了当前memmory 的类型 大小信息,及对应的memory 的属性信息,对应寄存器的定义如下:


本地添加如下测试代码来解析LMEM_DESC寄存器来获取memory 的信息。
void MCM_local_memory_info(MCM_CM7_Type * mcm)
{
for(uint8_t i =0; i < 5; i++)
{
uint32_t tmp;
if(mcm->LMEM_DESC[i] & MCM_CM7_LMEM_DESC_LMV_MASK)
{
/* Local Memory Descriptor */
LOG_I("Local Memory Descriptor %d: %08lX", i, mcm->LMEM_DESC[i]);
/* Memory Type */
tmp = (mcm->LMEM_DESC[i] & MCM_CM7_LMEM_DESC_MT_MASK) >> MCM_CM7_LMEM_DESC_MT_SHIFT;
LOG_I("[TYPE] %s", (tmp == 0U) ? "TCM"
: (tmp == 1U) ? "DTCM"
: (tmp == 2U) ? "I-cache"
: (tmp == 3U) ? "D-cache"
: "Unknown");
/* Memory Size */
tmp = (mcm->LMEM_DESC[i] & MCM_CM7_LMEM_DESC_LMSZ_MASK) >> MCM_CM7_LMEM_DESC_LMSZ_SHIFT;
if(tmp > 0U)
{
LOG_I("[SIZE] %d KB", (1U << (tmp - 1U)));
}
else
{
LOG_I("[SIZE] 0 KB");
}
/* Cache ways */
tmp = (mcm->LMEM_DESC[i] & MCM_CM7_LMEM_DESC_WY_MASK) >> MCM_CM7_LMEM_DESC_WY_SHIFT;
LOG_I("[L1 CACHE WAYS] %ld", tmp);
/* Data width */
tmp = (mcm->LMEM_DESC[i] & MCM_CM7_LMEM_DESC_DPW_MASK) >> MCM_CM7_LMEM_DESC_DPW_SHIFT;
LOG_I("[DATA WIDTH] %d bits", (tmp == 2U) ? 32
: (tmp == 3U) ? 64 : 0);
}
}
} 在core0 和 core1 上运行上述测试程序打印local memory 信息如下,跟324 的实际配置也是一致的。

core1 读取结果如下

上述core0/1获取的信息和下图的信息也是匹配的

我要赚赏金
