TCM, AXIF CRAM 你好 我对内存的不同部分有些疑问。 我的设置: S32E288-975EVB S32 Design Studio 3.6.4 S32 调试探头 我创建了一个 S32E288 项目,我在其中标记了我想使用多个内核并将启动核心设置为 M33。然后,它为我创建了多个子项目,每个内核一个,总共有 5 个(M33、R52_0_0、R52_0_1、R52_1_0、R52_1_1),因为我是在锁步模式下运行它们的。我能够将启动核心二进制文件生成并刷新为 BLOB,以非易失性方式闪存和运行启动代码。 我现在正试图调出所有其他内核,以便非易失性使用,我想我已经成功打开了这些内核,但我缺少 RAM 中可运行的代码。 我从链接器文件中看到有多个内存部分,如 TCM-A、-B、-C、AXIM CRAM 部分、AXIF CRAM 部分等: * Target device: This linker is demo and it is using for device S32Z2xx and S32E2xx only
* Target core: core 0 cluster 0 (RTU0)
* Linker support for application running on RTU0 core0 only. It need to align with MPU default setup in core.c as well.
* Memory setting: Local ram of RTU0 (CRAM and DRAM)
*/
/*
* GCC Linker Command File:
* 0x30000000 0x3000FFFF 65536 ; RTU0_R52_0_TCM_A
* 0x30100000 0x30103FFF 16384 ; RTU0_R52_0_TCM_B
* 0x30200000 0x30203FFF 16384 ; RTU0_R52_0_TCM_C
* 0x31780000 0x317BFFFF 262144 ; RTU0_DRAM_0 (Fast Data 0)
* 0x317C0000 0x317FFFFF 262144 ; RTU0_DRAM_1 (Fast Data 1)
* 0x31800000 0x3187FFFF 524288 ; RTU0_DRAM_2 (Fast Data 2)
* 0x32100000 0x321FFFFF 1048575 ; RTU0_CRAM_0 (Code ram 0)
* 0x32200000 0x322FFFFF 1048575 ; RTU0_CRAM_1 (Code ram 1)
* 0x32300000 0x323FFFFF 1048575 ; RTU0_CRAM_2 (Code ram 2)
* 0x32400000 0x324FFFFF 1048575 ; RTU0_CRAM_3 (Code ram 3)
* 0x32500000 0x325FFFFF 1048575 ; RTU0_CRAM_4 (Code ram 4)
* 0x32600000 0x326FFFFF 1048575 ; RTU0_CRAM_5 (Code ram 5)
* 0x32700000 0x327FFFFF 1048575 ; RTU0_CRAM_6 (Code ram 6)
* 0x79900000 0x799FFFFF 1048575 ; RTU0_CRAM_0_AXIF (Code ram 0 AXIF)
* 0x79A00000 0x79AFFFFF 1048575 ; RTU0_CRAM_1_AXIF (Code ram 1 AXIF)
* 0x79B00000 0x79BFFFFF 1048575 ; RTU0_CRAM_2_AXIF (Code ram 2 AXIF)
* 0x79C00000 0x79CFFFFF 1048575 ; RTU0_CRAM_3_AXIF (Code ram 3 AXIF)
* 0x79D00000 0x79DFFFFF 1048575 ; RTU0_CRAM_4_AXIF (Code ram 4 AXIF)
* 0x79E00000 0x79EFFFFF 1048575 ; RTU0_CRAM_5_AXIF (Code ram 5 AXIF)
* 0x79F00000 0x79FFFFFF 1048575 ; RTU0_CRAM_6_AXIF (Code ram 6 AXIF)
* 0x4E400000 0x4E400FFF 4096 ; AE_SRAM
*/
HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x00001000;
ENTRY(Reset_Handler)
MEMORY
{
int_sram_no_cacheable_smu_m33 : ORIGIN = 0x250C0000, LENGTH = 0x0003C000 /* 240KB, needs to include int_results */
/*RTU0 ram section */
int_atcm_c0_0 : ORIGIN = 0x30000000, LENGTH = 0x00010000 /* 64K */
int_btcm_c0_0 : ORIGIN = 0x30100000, LENGTH = 0x00004000 /* 16K */
int_ctcm_c0_0 : ORIGIN = 0x30200000, LENGTH = 0x00004000 /* 16K */
int_atcm_c0_1 : ORIGIN = 0x30400000, LENGTH = 0x00010000 /* 64K */
int_btcm_c0_1 : ORIGIN = 0x30500000, LENGTH = 0x00004000 /* 16K */
int_ctcm_c0_1 : ORIGIN = 0x30600000, LENGTH = 0x00004000 /* 16K */
int_atcm_c0_2 : ORIGIN = 0x30800000, LENGTH = 0x00010000 /* 64K */
int_btcm_c0_2 : ORIGIN = 0x30900000, LENGTH = 0x00004000 /* 16K */
int_ctcm_c0_2 : ORIGIN = 0x30A00000, LENGTH = 0x00004000 /* 16K */
int_atcm_c0_3 : ORIGIN = 0x30C00000, LENGTH = 0x00010000 /* 64K */
int_btcm_c0_3 : ORIGIN = 0x30D00000, LENGTH = 0x00004000 /* 16K */
int_ctcm_c0_3 : ORIGIN = 0x30E00000, LENGTH = 0x00004000 /* 16K */
int_sram_dram_c0_0 : ORIGIN = 0x31780000, LENGTH = 0x00020000 /* 128KB DRAM0 */
int_sram_dram_c0_1 : ORIGIN = 0x317A0000, LENGTH = 0x00020000 /* 128KB DRAM0 */
int_sram_dram_c0_2 : ORIGIN = 0x317C0000, LENGTH = 0x00020000 /* 128KB DRAM1 */
int_sram_dram_c0_3 : ORIGIN = 0x317E0000, LENGTH = 0x00020000 /* 128KB DRAM1 */
int_sram_no_cacheable_c0_0 : ORIGIN = 0x31800000, LENGTH = 0x00010000 /* 64KB DRAM2, needs to include int_results */
int_sram_no_cacheable_c0_1 : ORIGIN = 0x31810000, LENGTH = 0x00010000 /* 64KB DRAM2, needs to include int_results */
int_sram_no_cacheable_c0_2 : ORIGIN = 0x31820000, LENGTH = 0x00010000 /* 64KB DRAM2, needs to include int_results */
int_sram_no_cacheable_c0_3 : ORIGIN = 0x31830000, LENGTH = 0x00010000 /* 64KB DRAM2, needs to include int_results */
int_sram_rtu0_shareable : ORIGIN = 0x31840000, LENGTH = 0x00040000 /* 256KB DRAM2 */
/* For code section there are 2 interface: AXI-M: Global port-bus which can use for loading image, access from inside/outside sub-system AXI-F: Read-only port-bus, faster interface for code access. For this demo we're using AXI-M to load image and AXI-F for code execution. */
int_sram_c0_0 : ORIGIN = 0x32100000, LENGTH = 0x001C0000 /* ~1.8MB */
ram_end_c0_0 : ORIGIN = 0x322C0000, LENGTH = 0x00000000 /* End of core 0_0 */
int_sram_c0_0_axif : ORIGIN = 0x79900000, LENGTH = 0x001C0000 /* ~1.8MB */
ram_end_c0_0_axif : ORIGIN = 0x79AC0000, LENGTH = 0x00000000 /* End of core 0_0 */
int_sram_c0_1 : ORIGIN = 0x322C0000, LENGTH = 0x001C0000 /* ~1.8MB */
ram_end_c0_1 : ORIGIN = 0x32480000, LENGTH = 0x00000000 /* End of core 0_1 */
int_sram_c0_1_axif : ORIGIN = 0x79AC0000, LENGTH = 0x001C0000 /* ~1.8MB */
ram_end_c0_1_axif : ORIGIN = 0x79C80000, LENGTH = 0x00000000 /* End of core 0_1 */
int_sram_c0_2 : ORIGIN = 0x32480000, LENGTH = 0x001C0000 /* ~1.8MB */
ram_end_c0_2 : ORIGIN = 0x32640000, LENGTH = 0x00000000 /* End of core 0_2 */
int_sram_c0_2_axif : ORIGIN = 0x79C80000, LENGTH = 0x001C0000 /* ~1.8MB */
ram_end_c0_2_axif : ORIGIN = 0x79E40000, LENGTH = 0x00000000 /* End of core 0_2 */
int_sram_c0_3 : ORIGIN = 0x32640000, LENGTH = 0x001C0000 /* ~1.8MB */
ram_end_c0_3 : ORIGIN = 0x32800000, LENGTH = 0x00000000 /* End of core 0_3 */
int_sram_c0_3_axif : ORIGIN = 0x79E40000, LENGTH = 0x001C0000 /* ~1.8MB */
ram_end_c0_3_axif : ORIGIN = 0x7A000000, LENGTH = 0x00000000 /* End of core 0_3 */ 我知道紧密耦合内存是 RAM 的一部分,甚至强烈建议从 TCM 运行代码,因为从 TCM 提取数据只需要一个周期。 因此: TCM-A、-B 和 -C 之间有什么区别? 为什么我不使用 TCM 或演示程序不使用 TCM 运行代码? SMU 核心能否写入 TCM? 此外,我还可以从我的 M33 项目 Project_Settings -> Startup_Code -> system.c 中看到,开启使用的内核实际上是通过SystemInit()实现的: Sys_StartSecondaryCores() /*================================================================================================*/
/**
* @brief Sys_StartSecondaryCores
* @details Function used to start the secondary cores
*/
/*================================================================================================*/
static void Sys_StartSecondaryCores(void)
{
/* Turn on partitions */
Sys_PartitionsTurnOn();
/* Configure Split-lock RTU0 if M33 core is boot core */
#if (defined(CORE_M33_0) && \
(defined(START_CR52_0_0) || defined(START_CR52_0_1) || defined(START_CR52_0_2) || defined(START_CR52_0_3)) \
)
#ifndef RTU0_R52_LOCKSTEP_MODE
IP_RTU0__GPR->CFG_CORE |= RTU_GPR_CFG_CORE_SPLT_LCK_MASK;
#endif
#endif
/* Configure Split-lock RTU1 */
#if (defined(START_CR52_1_0) || defined(START_CR52_1_1) || defined(START_CR52_1_2) || defined(START_CR52_1_3))
#ifndef RTU1_R52_LOCKSTEP_MODE
IP_RTU1__GPR->CFG_CORE |= RTU_GPR_CFG_CORE_SPLT_LCK_MASK;
#endif
#endif
/* Release secondary cores to exit reset */
#ifdef START_CR52_0_0
extern const uint32 __CORE_R52_0_0_START_ADDRESS;
IP_MC_ME->PRTN1_CORE0_ADDR = (uint32)&__CORE_R52_0_0_START_ADDRESS;
IP_MC_ME->PRTN1_CORE0_PCONF = 1;
IP_MC_ME->PRTN1_CORE0_PUPD = 1;
IP_MC_ME->CTL_KEY = 0x5AF0;
IP_MC_ME->CTL_KEY = 0xA50F;
while (!(IP_MC_ME->PRTN1_CORE0_STAT & MC_ME_PRTN1_CORE0_STAT_CCS_MASK)) {};
IP_MC_RGM->PRST_0[1].PRST_0 &= ~MC_RGM_PRST_0_PERIPH_65_RST_MASK;
while(IP_MC_RGM->PSTAT_0[1].PSTAT_0 & MC_RGM_PRST_0_PERIPH_65_RST_MASK);
#endif /*START_CR52_0_0*/
... 和 Sys_PartitionsTurnOn() 和 /**
* @brief Sys_PartitionsTurnOn
* @details Function used to turn on partitions
*/
/*================================================================================================*/
#if (defined(START_CR52_0_0) || defined(START_CR52_0_1) || defined(START_CR52_0_2) || defined(START_CR52_0_3) || \
defined(START_CR52_1_0) || defined(START_CR52_1_1) || defined(START_CR52_1_2) || defined(START_CR52_1_3) || defined(START_CM33_0) \
)
static void Sys_PartitionsTurnOn(void)
{
/* Turn on RTU0 partition if M33 core is boot core */
#if (defined(CORE_M33_0) && \
(defined(START_CR52_0_0) || defined(START_CR52_0_1) || defined(START_CR52_0_2) || defined(START_CR52_0_3)) \
)
/* Enable partition clock */
IP_MC_ME->PRTN1_PCONF |= MC_ME_PRTN1_PCONF_PCE_MASK;
IP_MC_ME->PRTN1_PUPD |= MC_ME_PRTN1_PUPD_PCUD_MASK;
IP_MC_ME->CTL_KEY = 0x5AF0;
IP_MC_ME->CTL_KEY = 0xA50F;
while (!(IP_MC_ME->PRTN1_STAT & MC_ME_PRTN1_STAT_PCS_MASK));
/* Release partition to exit reset */
IP_MC_RGM->PRST_0[1].PRST_0 &= ~MC_RGM_PRST_0_PERIPH_64_RST_MASK;
/* Disable OSS */
IP_MC_ME->PRTN1_PCONF &= ~MC_ME_PRTN1_PCONF_OSSE_MASK;
IP_MC_ME->PRTN1_PUPD |= MC_ME_PRTN1_PUPD_OSSUD_MASK;
IP_MC_ME->CTL_KEY = 0x5AF0;
IP_MC_ME->CTL_KEY = 0xA50F;
while(IP_MC_RGM->PSTAT_0[1].PSTAT_0 & MC_RGM_PRST_0_PERIPH_64_RST_MASK);
while(IP_MC_ME->PRTN1_STAT & MC_ME_PRTN1_STAT_OSSS_MASK);
/* Deactivate RTU0 fencing logic and enable SRAM interface */
IP_GPR3->RTU0FDC = 0U;
IP_RDC_0->RD1_CTRL_REG |= RDC_RD1_CTRL_REG_RD1_CTRL_UNLOCK_MASK;
IP_RDC_0->RD1_CTRL_REG &= ~RDC_RD1_CTRL_REG_RD1_INTERCONNECT_INTERFACE_DISABLE_MASK;
while(IP_RDC_0->RD1_STAT_REG & RDC_RD1_STAT_REG_RD1_INTERCONNECT_INTERFACE_DISABLE_STAT_MASK);
#endif
/* Turn on RTU1 partition */
#if (defined(START_CR52_1_0) || defined(START_CR52_1_1) || defined(START_CR52_1_2) || defined(START_CR52_1_3))
/* Enable partition clock */
IP_MC_ME->PRTN2_PCONF |= MC_ME_PRTN2_PCONF_PCE_MASK;
IP_MC_ME->PRTN2_PUPD |= MC_ME_PRTN2_PUPD_PCUD_MASK;
IP_MC_ME->CTL_KEY = 0x5AF0;
IP_MC_ME->CTL_KEY = 0xA50F;
while (!(IP_MC_ME->PRTN2_STAT & MC_ME_PRTN2_STAT_PCS_MASK));
/* Release partition to exit reset */
IP_MC_RGM->PRST_0[2].PRST_0 &= ~MC_RGM_PRST_0_PERIPH_128_RST_MASK;
/* Disable OSS */
IP_MC_ME->PRTN2_PCONF &= ~MC_ME_PRTN2_PCONF_OSSE_MASK;
IP_MC_ME->PRTN2_PUPD |= MC_ME_PRTN2_PUPD_OSSUD_MASK;
IP_MC_ME->CTL_KEY = 0x5AF0;
IP_MC_ME->CTL_KEY = 0xA50F;
while(IP_MC_RGM->PSTAT_0[2].PSTAT_0 & MC_RGM_PRST_0_PERIPH_128_RST_MASK);
while(IP_MC_ME->PRTN2_STAT & MC_ME_PRTN2_STAT_OSSS_MASK);
/* Deactivate RTU1 fencing logic and enable SRAM interface */
IP_GPR3->RTU1FDC = 0U;
IP_RDC_1->RD1_CTRL_REG |= RDC_RD1_CTRL_REG_RD1_CTRL_UNLOCK_MASK;
IP_RDC_1->RD1_CTRL_REG &= ~RDC_RD1_CTRL_REG_RD1_INTERCONNECT_INTERFACE_DISABLE_MASK;
while(IP_RDC_1->RD1_STAT_REG & RDC_RD1_STAT_REG_RD1_INTERCONNECT_INTERFACE_DISABLE_STAT_MASK);
/* Configure REMAP for NICs */
IP_RTU1__RTUM_NIC_D->REMAP = 0x02U;
IP_RTU1__RTUF_NIC_D->REMAP = 0x02U;
IP_RTU1__RTUP_NIC_B->REMAP = 0x02U;
IP_RTU1__RTUE_NIC_D->REMAP = 0x02U;
#endif
} 但我找不到所有 START_CR... 定义是在哪里定义的,以便真正开启内核。那是 S32 设计工作室的启动魔法吗? 当内存映射标记"Slave Addressed by Each of the Masters" 时,用颜色代码表示 SMU、RTU0 Master、RTU1 Master: image.png 这是否意味着只有标记的颜色管理器才能访问这部分内存?例如,当 R0-CPU0_ATCM 在 0x3000_0000 处为灰色时,这是否意味着当 SMU 试图读/写 0x3000_0000 时,会产生错误,或者会发生什么,或者它究竟意味着什么? Re: TCM, AXIF CRAM 嗨,HiddenSquid
1.TCM-A、-B 和 -C 之间有什么区别,各有哪些用途? > > > 您可以参阅附件文件,了解 TCM-A、-B 和 -C 的更多信息。
2.为什么我不使用 TCM 或演示程序不使用 TCM 运行代码? >>>请按照附件中的链接文件图片,找到用于 R52 核心的 TCM。
3.SMU 内核是否能写入 TCM? > > > 要让 Cortex-M33 内核访问 RTU Cortex-R52 内核的任何 TCM 的地址空间,必须首先执行额外配置,以确保访问操作正确。
希望这些信息能帮到你,我会继续核实你的其他问题。
BR
乔伊 Re: TCM, AXIF CRAM 你好,HiddenSquid
我已收到您的问题,并将帮助您进行检查。
BR
乔伊 Re: TCM, AXIF CRAM 嘿@Joey_z 谢谢您的答复!我有几个后续问题,实际上也是我自己找到的一些答案。 将 TCM A、B 和 C 用于预期目的之外的用途,是否有任何架构/硬件限制? 如果主要使用 TCM,那我为什么要使用 RTU0/1 的 CRAM 或动态随机存取存储器(DRAM) 部分? 那么,从 SMU 访问 TCM 需要执行的唯一配置是什么? 在相应的 R 内核上禁用缓存 禁用相应 R 内核的收集功能 >>>关于魔法定义: 它们主要分布在两处: 项目属性-> C/C+ 版本-> 设置-> 工具设置-> 标准 S32DS 汇编器-> 预处理器-> 定义的符号 项目属性-> C/C+ 版本-> 设置-> 工具设置-> 标准 S32DS C 编译器-> 预处理器-> 定义的符号 我尚未确认它们是仅在调试期间还是适用于每次版本,但是为每个版本定义它们是有意义的。 感谢您的帮助!
記事全体を表示