This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
TI exprits、您好!
在 BYD SA5中,我们遇到了一个非常奇怪的问题,我们配置了主域 MSRam,
在前面的数据包中、我们已经提到了这一点。
我们在0x80000中放置了一些文本段、我们在 RAT 函数中绑定了该文本段
#define CSL_MCU_ARMSS_RAT_CFG_BASE (0x40f90000UL) #define MSRAM_RAT_REGION_INDEX 10U #define MSRAM_RAT_REGION_BASE (0x4F02000000UL) #define MSRAM_RAT_REGION_SIZE (0x80000UL) #define MSRAM_RAT_REGION_LOCAL_BASE (0x80000UL) void Rat_Msram512KBInit(void) { bool ratRetVal; CSL_RatTranslationCfgInfo translationCfg; uint32_t index = MSRAM_RAT_REGION_INDEX; /* Add RAT configuration to access address > 32bit address range */ translationCfg.translatedAddress = MSRAM_RAT_REGION_BASE; translationCfg.sizeInBytes = MSRAM_RAT_REGION_SIZE; translationCfg.baseAddress = (uint32_t)MSRAM_RAT_REGION_LOCAL_BASE; ratRetVal = CSL_ratConfigRegionTranslation((CSL_ratRegs *)CSL_MCU_ARMSS_RAT_CFG_BASE, index, &translationCfg); if (ratRetVal == false) { UART_printf("\nFailed to configure the RAT index %d address 0x%lx\n", index, translationCfg.translatedAddress); } }
00080000 00080000 00033020 00033020 rwx 00080000 00080000 00033020 00033020 rwx .main_Msram
但目前我们做了一些压力测试,发现,有时 SBL 将数据从临时存储器复制到主域 msram
某些文本在主域 MSARAM 中不正确、但 DDR 和 MCU msam 中的文本都是正确的。
如 0x81fb4中的文本应为
正确数据就像波纹管一样
81f9c: 03 10 a0 e3 mov r1, #3 ; ACTL_Parking_DW.is_P4U_OUT_SC = ACTL_Parking_IN_P4U_OUT_PSM_SC; 81fa0: c1 01 c4 e5 strb r0, [r4, #449] ; ACTL_Parking_DW.A_SIG_APA_PARKING_TYPE_SELD = ACTL_Parking_ACTL_PARKINGOUT; 81fa4: a5 01 c4 e5 strb r0, [r4, #421] 81fa8: 01 00 a0 e3 mov r0, #1 ; ACTL_Parking_DW.is_P4U_CTRL_ON_SC = ACTL_Parking_IN_P4U_OUT_SC; 81fac: b1 11 c4 e5 strb r1, [r4, #433] ; ACTL_Parking_DW.A_SIG_SET_DASW_MANEUVER_MODE = ACTL_Parking_ACTL_DASW_MM_PO; 81fb0: 9c 01 c4 e5 strb r0, [r4, #412] ; } 81fb4: 34 d0 8d e2 add sp, sp, #52 81fb8: f0 8f bd e8 pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} 81fbc: 00 f0 20 e3 nop ; if (((uint32_T)ACTL_Parking_DW.is_P4U_FAILURE_SC != 81fc0: b5 01 d4 e5 ldrb r0, [r4, #437] ; IN_P4U_5FAILURE_ST_FAILURETO_OF) && ((((uint32_T) 81fc4: 01 00 50 e3 cmp r0, #1
我直接读取存储器、发现从0x81fa0到0x81fbc 有32个字节已更改为0、
我们还检查主域 MSRAM 中的文本、
有许多地方已经改变了
如这里所示
如这里所示
如这里所示
所有更改的大小为32字节、应该是文本代码、但变为0、是否存在高速缓存问题或 DMA 问题?
我们可以将主域 SRAM 用于 MCU 文本代码吗? 您能否说明一下在 MCU 域中使用主域 MSRAM 的方法没有问题、您能否就此向您的 IP 设计团队核实。
您好、TI 专家!
似乎当我们改变主域 msram 的 MPU 配置时,情况已经消失了。
但是在 SBL 代码中、在复制每个段之后都有一个 SBL_DCacheClean 函数、用于确保高速缓存被写回内存。
fp_readData((void *)(uintptr_t)(section.addr), srcAddr, section.size); #if defined(BUILD_MCU1_0) SBL_DCacheClean((void *)(uintptr_t)(section.addr), section.size); #endif
但在这种情况下、这似乎不能与主域 MSRAM 配合使用。 为什么会 发生此问题、并且通过使用 RAT 转换模块在 MCU 域中使用主域 msram 是否安全?
您好、Han、
本质上、上述更改将使该区域为非缓存区域、因此 问题似乎与缓存有关。 您在缓存清理函数中使用的地址是什么? 是 RAT 映射地址还是原始物理地址?
此致、
Brijesh
您好、Han、
但上面的代码并不负责新添加的 RAT 映射、对吧? 有一个代码用于映射 ATCM 和 BTCM 存储器、而不是 OCM 存储器。
此致、
Brijesh
您是指此代码?所以缓存清理函数输入地址必须是正确的物理地址?
case MCU4_CPU1_ID: atcmSize = sblAtcmSize(); btcmSize = sblBtcmSize(); /*Remap TCM address from R5 local to SoC memory map*/ if (section.addr < (SBL_MCU_ATCM_BASE + atcmSize)) { /* Get offset into ATCM */ SBL_log(SBL_LOG_MAX, "Translating coreid %d local ATCM addr 0x%x to ", CoreId, section.addr); section.addr = section.addr - SBL_MCU_ATCM_BASE; section.addr = SocAtcmAddr[CoreId - MCU1_CPU0_ID] + section.addr; SBL_log(SBL_LOG_MAX, "SoC MCU ATCM addr 0x%x\n", section.addr); } else if ((section.addr >= SBL_MCU_BTCM_BASE) && (section.addr < (SBL_MCU_BTCM_BASE + btcmSize))) { /* Get offset into BTCM */ SBL_log(SBL_LOG_MAX, "Translating coreid %d local BTCM addr 0x%x to ", CoreId, section.addr); section.addr = section.addr - SBL_MCU_BTCM_BASE; section.addr = SocBtcmAddr[CoreId - MCU1_CPU0_ID] + section.addr; SBL_log(SBL_LOG_MAX, "SoC MCU BTCM addr 0x%x\n", section.addr); } else { /* To remove MISRA C error */ } break;
但是主域物理地址是64位地址
您好、Han、
是的、这是真的、我们无法访问 R5F 上的48位地址、这就是为什么我们需要在 CPU 尝试访问此存储器时使用 RAT 映射地址的原因。
正因为如此、此代码需要稍作更改、当它复制到该 OCM 存储器时、它需要使用 RAT 映射地址、当前 SBL 中不处理此问题、您需要使用此代码。
您能否首先确认此更改已出现在 SBL 的 RPRC 解析器代码中?
此致、
Brijesh
您好 Jadav、
一定会有一些错误、在我们的 MCU 链接器文件中、我们已经将其写入 rat 地址、而不是物理地址、这使得 SBL_DChacheClean 函数输入地址已经是我认为的 RAT 地址。