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.

[参考译文] TMS570LS3137:意外的 HALcoGen MPU 后台区域使能功能行为

Guru**** 2390755 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LS3137

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1409157/tms570ls3137-unexpected-halcogen-mpu-background-region-enable-function-behaviour

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGEN

工具与软件:

我一直在试验 MPU 后台区域、并且已经注意到、 从 sys_mpu.asm 中调用 HALcoGen 的_mpuEnableBackgroundRegion_()函数似乎 执行与我所期望的相反的操作、并且禁用后台区域。 如 ARMv7-A/ARMv7-R 参考手册所述、  BR 位设为0时、MPU 的行为就像存在在任何访问时生成后台故障存储器中止的后台区域。"

 mpuEnableBackgroundRegion_()函数设置 SCTLR。 通过"Orr  r0、 r0、#0x20000"将 BR 位更改成了1。 对 与已配置 MPU 区域不对应的存储器地址执行读取或写入操作时、默认情况下不会生成 TMS570LS3137数据表(例如:0x80000000)中表6.9.2中定义的数据中止、则不会生成数据中止。 删除对 _mpuEnableBackgroundRegion_()的调用时(即:SCTLR。 BR 为0)、则生成数据中止。

只是想确认此行为是否符合预期并且我的理解是向后的、或者 在本例中 HALCoGen 的"启用"和"禁用"术语是否向后(参考 ARM 参考手册)。

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Tyler Bailey:

    是否可以共享您的项目以在我结束时重新创建问题?

    ——
    谢谢、此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jagadish:

    我对迟交的答复表示歉意。 很抱歉、我无法分享完整的项目、但以下是重新创建问题所需的详细信息:

    1.  使用 FreeRTOS 为 TMS570LS3137创建一个 HALCoGen 项目。
    2. 在 os_port.c 中、进行以下详细更改、以使用 sys_mpu.h 中由 HALCoGen 提供的 MPU 函数启用 MPU 后台区域的情况下、执行从 EMIF CS0区域的读取操作:
      1. static void prvSetupDefaultMPU( void )
        {
        	/* make sure MPU is disabled */
        	prvMpuDisable();
        
        	/* First setup the entire flash for unprivileged read only access. */
        	prvMpuSetRegion(portUNPRIVILEGED_FLASH_REGION,  0x00000000, portMPU_SIZE_4MB | portMPU_REGION_ENABLE, portMPU_PRIV_RO_USER_RO_EXEC | portMPU_NORMAL_OIWTNOWA_SHARED);
        
        	/* Setup the first 32K for privileged only access.  This is where the kernel code is
        	placed. */
        	prvMpuSetRegion(portPRIVILEGED_FLASH_REGION,  0x00000000, portMPU_SIZE_32KB | portMPU_REGION_ENABLE, portMPU_PRIV_RO_USER_NA_EXEC | portMPU_NORMAL_OIWTNOWA_SHARED);
        
        	/* Setup the the entire RAM region for privileged read-write and unprivileged read only access */
        	prvMpuSetRegion(portPRIVILEGED_RAM_REGION,  0x08000000, portMPU_SIZE_512KB | portMPU_REGION_ENABLE, portMPU_PRIV_RW_USER_RO_EXEC | portMPU_NORMAL_OIWTNOWA_SHARED);
        
        	/* Default peripherals setup */
        	prvMpuSetRegion(portGENERAL_PERIPHERALS_REGION,  0xF0000000,
        					portMPU_SIZE_256MB | portMPU_REGION_ENABLE | portMPU_SUBREGION_1_DISABLE | portMPU_SUBREGION_2_DISABLE | portMPU_SUBREGION_3_DISABLE | portMPU_SUBREGION_4_DISABLE,
        					portMPU_PRIV_RW_USER_RW_NOEXEC | portMPU_DEVICE_NONSHAREABLE);
        
        	/* Privilege System Region setup */
        	prvMpuSetRegion(portPRIVILEGED_SYSTEM_REGION,  0xFFF80000, portMPU_SIZE_512KB | portMPU_REGION_ENABLE, portMPU_PRIV_RW_USER_RO_NOEXEC | portMPU_DEVICE_NONSHAREABLE);
        	
        	/* START ADDED FOR TEST 1. */
        	_mpuEnableBackgroundRegion_();
        	/* END ADDED FOR TEST 1. */
        
        	/* Enable MPU */
        	prvMpuEnable();
        
        	/* START ADDED FOR TEST 2. */
        	// Perform a read at EMIF CS 0
        	uint8_t data = *(uint8_t*)(0x80000000U);
        	/* END ADDED FOR TEST 2. */
        }
    3. 在 CCS 中调试经修改的代码时、在执行从 EMIF 存储器读取操作的行上添加一个断点。 单步执行该断点时、不会发生数据中止。
    4. 现在、要对禁用 MPU 背景区域的情况进行测试、请按如下方式修改 prvSetupDefaultMPU()函数:
      1. static void prvSetupDefaultMPU( void )
        {
        	/* make sure MPU is disabled */
        	prvMpuDisable();
        
        	/* First setup the entire flash for unprivileged read only access. */
        	prvMpuSetRegion(portUNPRIVILEGED_FLASH_REGION,  0x00000000, portMPU_SIZE_4MB | portMPU_REGION_ENABLE, portMPU_PRIV_RO_USER_RO_EXEC | portMPU_NORMAL_OIWTNOWA_SHARED);
        
        	/* Setup the first 32K for privileged only access.  This is where the kernel code is
        	placed. */
        	prvMpuSetRegion(portPRIVILEGED_FLASH_REGION,  0x00000000, portMPU_SIZE_32KB | portMPU_REGION_ENABLE, portMPU_PRIV_RO_USER_NA_EXEC | portMPU_NORMAL_OIWTNOWA_SHARED);
        
        	/* Setup the the entire RAM region for privileged read-write and unprivileged read only access */
        	prvMpuSetRegion(portPRIVILEGED_RAM_REGION,  0x08000000, portMPU_SIZE_512KB | portMPU_REGION_ENABLE, portMPU_PRIV_RW_USER_RO_EXEC | portMPU_NORMAL_OIWTNOWA_SHARED);
        
        	/* Default peripherals setup */
        	prvMpuSetRegion(portGENERAL_PERIPHERALS_REGION,  0xF0000000,
        					portMPU_SIZE_256MB | portMPU_REGION_ENABLE | portMPU_SUBREGION_1_DISABLE | portMPU_SUBREGION_2_DISABLE | portMPU_SUBREGION_3_DISABLE | portMPU_SUBREGION_4_DISABLE,
        					portMPU_PRIV_RW_USER_RW_NOEXEC | portMPU_DEVICE_NONSHAREABLE);
        
        	/* Privilege System Region setup */
        	prvMpuSetRegion(portPRIVILEGED_SYSTEM_REGION,  0xFFF80000, portMPU_SIZE_512KB | portMPU_REGION_ENABLE, portMPU_PRIV_RW_USER_RO_NOEXEC | portMPU_DEVICE_NONSHAREABLE);
        	
        	/* START ADDED FOR TEST 1. */
        	_mpuDisableBackgroundRegion_();
        	/* END ADDED FOR TEST 1. */
        
        	/* Enable MPU */
        	prvMpuEnable();
        
        	/* START ADDED FOR TEST 2. */
        	// Perform a read at EMIF CS 0
        	uint8_t data = *(uint8_t*)(0x80000000U);
        	/* END ADDED FOR TEST 2. */
        }
    5. 当在 CCS 中调试经修改的代码时、再次在执行从 EMIF 存储器中读取的操作的行上添加一个断点。 单步执行该断点时、会发生数据中止。

    这些结果说明了我所述的反向行为、当 MPU 后台区域"启用"时、不会发生数据中止、这与我对于 TMS570LS3137的 Cortex-R4F MPU 的相关详细信息所期待的正好相反。

    谢谢!

    Tyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tyler:

    感谢您的代码、我将详细介绍、并会尽快提供更新。

    ——
    谢谢、此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tyler:

    很抱歉,延迟响应,我在这段时间的其他问题被卡住了。

    我找到了一些东西:

    我想您应该需要禁用区域1才能测试后台区域启用检查:

    请参阅核心参考手册中突出显示的以下句子:

    您能否再次通过禁用区域1来测试 BR 位的行为?

    ——
    谢谢、此致、
    Jagadish。