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.

[参考译文] AM6548:MCU 上的 AM6548 PDK Enet 多端口示例(R5F)- SR2.0

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1330922/am6548-am6548-pdk-enet-multiport-example-on-mcu-r5f---sr2-0

器件型号:AM6548

您好!

我正在尝试在 AM65x_IDK_EVM (SR2.x)上从 AM6548 PDK 8.02.00.21版本运行 Enet 多端口示例。 当我从 PDK 构建示例时、我获得了  

"c:\ti\pdk_am65xx_08_02_00_21\packages\ti\binary\enet_multiport_test_freertos\bin\am65xx_idk\enet_multiport_test_freertos_mcu1_0_release.xer5f"

当我尝试通过 CCS 加载此文件时、在运行 launch.js 之后、该应用程序似乎甚至没有命中应用起点、而只是位于存储器地址0x0000000C 处。  

我曾尝试将示例移植到自己的本地工具链、即使用 GCC 和基于 PDK 的连接器、但在运行示例时仅获得此效果:

Init Enet's OSAL and utils to use defaults
Init memory utils
Create clock and task for periodic tick
Create periodic tick task
Create periodic tick clock
Open Main UDMA driver
Open MCU UDMA driver

Init all peripheral clocks
----------------------------------------------
Enabling clocks!
Enabling clocks!
Enabling clocks!
Enabling clocks!
Enabling clocks!
Enabling clocks!

Init all configs
----------------------------------------------
cpsw-2g: init config
icssg0-p1: init config
icssg0-p2: init config
icssg1: init config
icssg2-p1: init config
icssg2-p2: init config

Open all peripherals
----------------------------------------------
cpsw-2g: Open enet


似乎我得到数据中止... 罪魁祸首往往不是 EnetUdma_memMgrAllocTdCqRingMemObj、它尝试从内存位置.bss:enet_dma_obj_mem (变量 gEnetUdmaTdCqRingObjMem)取消某些数据的队列

即 DDR。 这会导致随机发生数据中止、因为有时会发生、有时不会... 但只有在我逐步使用调试器时、有时才会成功。  
下面是操作顺序的详细说明:

首先、我们输入  EnetUdma_memMgrAllocTdCqRingMemObj (来自 enet_open 函数)

/*! TD Cq Ring memory object allocation function  */
void *EnetUdma_memMgrAllocTdCqRingMemObj(void)
{
    void *pTdCqRingMem = NULL;
    EnetUdma_TdCqRingObjMem *pTdCqRingMemObj;

    pTdCqRingMemObj = (EnetUdma_TdCqRingObjMem *)
                      EnetQueue_deq(&gEnetUdmaMemMgrObj.tdCqRingObjMemQ);
#if ENET_CFG_IS_ON(DEV_ERROR)
    Enet_assert(NULL != pTdCqRingMemObj);
#endif
    if (pTdCqRingMemObj != NULL)
    {
        pTdCqRingMem = (void *)&pTdCqRingMemObj->tdCqRingMemObj[0U];
        Enet_assert(ENET_UTILS_IS_ALIGNED(pTdCqRingMem, ENETDMA_CACHELINE_ALIGNMENT));
        memset(pTdCqRingMem, 0U, sizeof(uint64_t));
    }

    return pTdCqRingMem;
}
然后、我们输入 EnetQueue_DEQ
EnetQ_Node *EnetQueue_deq(EnetQ *queue)
{
    EnetQ_Node *node;
    uintptr_t key = EnetOsal_disableAllIntr();

    Enet_devAssert(queue->magic == ENET_Q_INIT_DONE,
                   "Queue is not initialized\n");

    node = queue->head;

    if (NULL != node)
    {
        queue->head = node->next;
        if (NULL == queue->head)
        {
            queue->tail = NULL;
        }

        queue->count--;
        node->next = NULL;
    }

    EnetOsal_restoreAllIntr(key);

    return node;
}
我们特别点击了"queue->head = node->next;"行中的数据中止处理程序,它正在将队列头向下移动,从 MSMC RAM 到 DDR

Queue->head 位于0x7002E820 (MSMC),node->next 位于0x81D39980 (DDR),为什么会发生这种情况?

我的问题是... 为什么构建的 MCU 示例不起作用? 为什么我看到 Enet DMA 驱动程序代码中发生了该错误?

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

    尊敬的 Ben:

    感谢您的提问。

    我会检查一下、然后回复给您。

    同时、您可以查看 E2E 常见问题解答吗?

    此致

    阿什瓦尼

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

    尊敬的 Ashwani:  

    通过查看 E2E 常见问题解答、我不确定构建和加载该工程时犯了什么错误。 Enet 多端口示例没有 CCS 示例工程、因此我刚刚使用 make 生成。  

    为了便于参考、我可以通过 CCS 加载其他示例应用、例如 UART 示例。

    谢谢。

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

    感谢 Benjamin Roytburd、

    但我们不支持 PDK。

      相关指导、请参阅以下 E2E 常见问题解答。

    此致

    阿什瓦尼

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

    我认为这里有一点误解、我参考此 TI 软件版本的示例:

    https://www.ti.com/tool/PROCESSOR-SDK-AM65X

    具体来说、本版本:

    https://www.ti.com/tool/download/PROCESSOR-SDK-RTOS - AM65X/09.01.00.02


    以及版本08.02.00.21。  

    不知道为什么您不支持去年12月发布的 SDK。 我指的是 pdk_am65xx_09_01_00_02软件文件夹、 该文件夹来自 ti-processor-sdk-rtos-am65xx-09_01_00_02安装。  

    E2E 常见问题解答中甚至还提供了此 SDK 先前版本的引用。  

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

    12月发布的 PDK 非常适合解决一个客户有关 USB 驱动程序的问题。  因此、Ashwani 一般认为是对的、我们不再支持 PDK 和 TI RTOS。 MCU+ SDK (相对于 PDK 进行了大幅功能修整)是我们将尽最大努力支持的全部内容。 如果这是新设计、我们强烈建议您评估 AM64。  

    在 AM65上、如果您可以更靠近 Linux、建议您选择使用。  

    此致

    穆库尔  

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

    VxWorks 24.03是否仍然存在此问题? 根据 https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1326955/am6548-am6548-sr2-0-unhandled-exception-from-el1/ 、我假定这个项目中使用了 VxWorks。

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

    啊,我看到你的意思穆库尔,道歉的误解.

    Pekka 这与 VxWorks 无关、我指的是一个独立的 R5F/FreeRTOS 应用程序、该应用程序在调试模式下通过 Code Composer Studio 加载。  

    没有在目标上运行 HLOS。 我希望能够在 AM6548的 MCU 上运行 ENET 示例、如果此处提供任何指导、我将不胜感激。

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

    本杰明、您好!

    首先、对于我们目前可以在这里支持的内容感到困惑、我们深表歉意。 我将采取一些措施来更新 https://www.ti.com/tool/download/的 PROCESSOR-SDK-RTOS AM65X-AM65X 信息、以便预先指出提供的代码没有 TI 支持。

    如 Mukul 所述、受支持的 MCU+ SDK 比以前的 RTOS SDK 具有简化的 FeatureSet。 它看起来与 R5F 网络(使用 CPSW 或 PRU 以太网)在简化的 FeatureSet 中不同: https://software-dl.ti.com/mcu-plus-sdk/esd/AM65X/09_01_00_04/docs/api_guide_am65x/RELEASE_NOTES_09_01_00_PAGE.html

    我可以将您的线程重新分配给 MCU+团队的成员、看看他们是否有关于 RTOS 代码调试的任何一般指导、但我们无法为您提供更多支持。 如 Mukul 所述、如果 AM64x 也适合您的用例、我们将能够在该器件上提供更多支持。

    此致、

    尼克

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

    感谢 Nick 的解释、我想 Enet 代码调试我可以自行解决、但如果问题的第一部分得到帮助、我觉得它属于 PDK/MCU+ SDK 的范围。 非常感谢重新分配给 MCU+团队。

    重申一下、为什么我为 MCU (尤其是 ENET)构建了一些示例、当通过 CCS 加载 时、从未命中 main、而在加载到 R5F 时仅在0x0000000C 处停止?  

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

    实际上、我确实在 PDK 中找到了有关如何构建/加载 enet_multiport 示例的文档、并非常严格地遵循了以下说明:
    https://software-dl.ti.com/processor-sdk-rtos/esd/AM65X/09_01_00_02/exports/docs/pdk_am65xx_09_01_00_02/docs/userguide/am65xx/modules/enet.html#enet-multiport
    但即使在 CCS 加载到固件中时、

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

    尊敬的 Benjamin:

    我怀疑 R5F 内核无法从从异常表读取的复位地址读取指令。 异常表中的这个复位地址是通常名为`c_int00`的启动例程的地址。 然后、此启动例程会调用应用程序的主函数。

    您能否使用 CCS 的内存浏览器共享从地址0x0 (异常表地址)开始的存储器内容?

    此致、

    普拉桑特

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

    尊敬的 Benjamin:

    不确定为什么 main 是在 DDR 中。  [/报价]

    我认为这应该是可以的。 启动例程将配置 MPU、因此无论在何处加载 main 函数都没有关系。 我在这里发现的有趣的是段` freertosrstvectors`没有加载到 ATCM。

    根据我对 AM64x 器件的了解、引导加载程序会设置 MMR 中的 R5F 引导矢量、从而告知异常表的位置为0x0。 相应地、每个应用的`.vectors`段都加载到 ATCM 地址0x0、以便一切正常工作。 我想对于 AM65x 来说、这应该也是一样的。

    我不 `确定它是否会起作用、但您可以尝试将 vectors.freertosrstvectors`分配给 ATCM (MCU0_ATCM 不使用)吗?

    如果这不起作用、请 使用 CCS 的内存浏览器共享从地址0x0 (异常表地址)开始的存储器内容。

    此致、

    普拉桑特

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

    我们稍微进一步开发了这个应用程序,但我们仍然没有运行 main 函数,我们现在位于内存地址0x7014D154的 Hwip_data_abort_handler_c ()函数。  

    这是内存浏览器显示的内容、  

    0x00000000	__TI_static_base__, _freertosresetvectors
    0x00000000	E59FF018	E59FF018	E59FF018	E59FF018	E59FF018	E59FF018	E59FF018	E59FF018
    0x00000020	c_int00_addr
    0x00000020	41C3F8CC
    0x00000024	undefInst_addr
    0x00000024	7014D0B0
    0x00000028	swi_addr
    0x00000028	7014D1A8
    0x0000002C	preAbort_addr
    0x0000002C	7014D0E0
    0x00000030	dataAbort_addr
    0x00000030	7014D368
    0x00000034	rsvd_addr
    0x00000034	7014D080
    0x00000038	irq_addr
    

    现在、我在_c_int00例程中遇到了失败的情况、接下来会尝试调试一个位。  

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

    在单步执行_c_int00时遇到一些问题、是否有其他段应该位于 TCM 中?

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

    尊敬的 Benjamin:

    .stack 段的加载地址似乎可疑。 您是否可以尝试将.stack 分配给 MSMC3、看看这是否有帮助。

    此致、

    普拉桑特

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

    很好! 将堆栈移到 MSMC 让我们进入 main! 似乎当 FreeRTOS 调度程序启动时、我们会再次访问数据中止处理程序(特别是 OS_START)。 也许还有另一个部分需要转移到 MSMC?

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

    尊敬的 Benjamin:

    尝试将每个栈段.*stack 分配给 MSMC3,看看这是否有用。

    此致、

    普拉桑特

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

    这似乎没有实现、但做的是基本上将除 ENET 存储器部分之外的所有内容都移入 MSMC。 我现在可以访问 EnetMem_init (),但当尝试在 gRingMemArray 上执行 memset 时,我遇到了关于异常处理程序的数据,该数据位于 .bss :ENET_DMA_RING_MEMPOOL 节。 链接器脚本现在看起来是这样的:

    /*----------------------------------------------------------------------------*/
    /* r5f_linker_freertos.lds                                                    */
    /*                                                                            */
    /* (c) Texas Instruments 2021, All rights reserved.                           */
    /*                                                                            */
    
    --retain="*(.bootCode)"
    --retain="*(.startupCode)"
    --retain="*(.startupData)"
    --retain="*(.irqStack)"
    --retain="*(.fiqStack)"
    --retain="*(.abortStack)"
    --retain="*(.undStack)"
    --retain="*(.svcStack)"
    
    --fill_value=0
    --stack_size=0x4000
    --heap_size=0x8000
    --entry_point=_freertosresetvectors
    
    -stack  0x4000  /* SOFTWARE STACK SIZE */
    -heap   0x8000  /* HEAP AREA SIZE      */
    
    /*-------------------------------------------*/
    /*       Stack Sizes for various modes       */
    /*-------------------------------------------*/
    __IRQ_STACK_SIZE   = 0x1000;
    __FIQ_STACK_SIZE   = 0x0100;
    __ABORT_STACK_SIZE = 0x0100;
    __UND_STACK_SIZE   = 0x0100;
    __SVC_STACK_SIZE   = 0x0100;
    
    /*--------------------------------------------------------------------------*/
    /*                               Memory Map                                 */
    /*--------------------------------------------------------------------------*/
    MEMORY
    {
        /*--- Refer the user guide for details on persistence of these sections ---*/
        /*------------ Also, when these memories can be used by apps --------------*/
        MCU0_ATCM_NOT_USED          (R)     : ORIGIN = 0x00000000 LENGTH = 0x00007FFF
        MCU0_BTCM_NOT_USED          (R)     : ORIGIN = 0x41010000 LENGTH = 0x00007FFF
        /*----------- Used by SBL, can be used after APPs is started --------------*/
        MCU_MSRAM_RSVD_UNUSED       (R)     : ORIGIN = 0x41C00000 LENGTH = 0x00000200
        MCU_MSRAM_RSVD_SBL          (RWIX)  : ORIGIN = 0x41C00200 LENGTH = 0x0003DE00
    
        VECTORS                     (RWIX)  : ORIGIN = 0x41C3E000 LENGTH = 0x00000100
        RESET_VECTORS               (RWIX)  : ORIGIN = 0x41C3E100 LENGTH = 0x00001000
        OCMC_RAM                    (RWIX)  : ORIGIN = 0x41C3F100 LENGTH = 0x00040F00
    
        /*====================== COMPUTE_CLUSTER0_MSMC_SRAM =======================*/
        MSMC3                       (RWIX)  : ORIGIN = 0x70000000 LENGTH = 0x001EFC00
        /*---------- The ORIGIN  and LENGTH  is determined by board cfg, ----------*/ 
        /*------------------ refer user guide for details -------------------------*/
        MSMC3_RSVD_DMSC             (RWIX)  : ORIGIN = 0x701F0000 LENGTH = 0x00001000
    
        /*========================== AM65xx DDR LOCATION ==========================*/
        DDR0                        (RWIX)  : ORIGIN = 0x80000000 LENGTH = 0x7FFFFFE4
    
    }
    
    /*--------------------------------------------------------------*/
    /*                     Section Configuration                    */
    /*--------------------------------------------------------------*/
    SECTIONS
    {
        .intc_text               : {} palign(8)      > VECTORS
        .freertosrstvectors      : {} palign(8)      > MCU0_ATCM_NOT_USED /*RESET_VECTORS*/
        .bootCode                : {} palign(8)      > OCMC_RAM
        .startupCode             : {} palign(8)      > OCMC_RAM
        .startupData             : {} palign(8)      > OCMC_RAM, type = NOINIT
        .text                    : {} palign(8)      > MSMC3
        GROUP {
            .text.hwi    : palign(8)
            .text.cache  : palign(8)
            .text.mpu    : palign(8)
            .text.boot   : palign(8)
        }                                            > MSMC3
        .const                   : {} palign(8)      > MSMC3
        .rodata                  : {} palign(8)      > MSMC3
        .cinit                   : {} palign(8)      > MSMC3
        .pinit                   : {} palign(8)      > MSMC3
        .bss                     : {} align(8)       > MSMC3 /*DDR0*/
        .far                     : {} align(8)       > MSMC3 /*DDR0*/
        .data                    : {} palign(128)    > MSMC3
        .sysmem                  : {} align(8)       > MSMC3
        .data_buffer             : {} palign(128)    > MSMC3 /*DDR0*/
        .bss.devgroup*           : {} align(8)       > MSMC3 /*DDR0*/
        .const.devgroup*         : {} align(8)       > MSMC3 /*DDR0*/
        .boardcfg_data           : {} align(128)     > MSMC3
        .stack      : {}                            align(8)    > MSMC3 (HIGH) /*DDR0*/  
    
        .irqStack   : {. = . + __IRQ_STACK_SIZE;}   align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__IRQ_STACK_START)
        RUN_END(__IRQ_STACK_END)
    
        .fiqStack  	: {. = . + __FIQ_STACK_SIZE;}   align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__FIQ_STACK_START)
        RUN_END(__FIQ_STACK_END)
    
        .abortStack : {. = . + __ABORT_STACK_SIZE;} align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__ABORT_STACK_START)
        RUN_END(__ABORT_STACK_END)
    
        .undStack  	: {. = . + __UND_STACK_SIZE;}   align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__UND_STACK_START)
        RUN_END(__UND_STACK_END)
    
        .svcStack  	: {. = . + __SVC_STACK_SIZE;}   align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__SVC_STACK_START)
        RUN_END(__SVC_STACK_END)
    
        /* DMA packet info (metadata), packet data and UDMA ring and desc memory */
        .bss:ENET_DMA_DESC_MEMPOOL (NOLOAD) {} ALIGN (128) > DDR0
        .bss:ENET_DMA_RING_MEMPOOL (NOLOAD) {} ALIGN (128) > DDR0
        .bss:ENET_DMA_PKT_MEMPOOL  (NOLOAD) {} ALIGN (128) > DDR0
        .bss:ENET_DMA_OBJ_MEM      (NOLOAD) {} ALIGN (128) > DDR0
        .bss:ENET_DMA_PKT_INFO_MEMPOOL (NOLOAD) {} ALIGN (128) > DDR0
    
        /* for ICSSG MEM */
        .bss:ENET_ICSSG_OCMC_MEM (NOLOAD) {} ALIGN (128) > MSMC3
    
        /* Used in Switch configuration tool */
        .serialContext     (NOLOAD) {} ALIGN (128) > DDR0
    
        /* SA sections */
        .scBufs         : {} align(8)   > DDR0
        .saSrcBuffers   : {} align(8)   > DDR0
        .saDstBuffers   : {} align(8)   > DDR0
    }
    
    


    奇怪的是  gRingMemArray 位于 DDR 中、我们似乎无法在不触发数据中止处理程序的情况下对其执行操作。 这是 enet_appmemutils.c 中的第423行、

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

    我想 MPU 配置缺少一个 DDR 区域。 您能否检查 DDR MPU 配置是否已完成?

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

    似乎正在完成此操作、使用 ti\drv\enet\examples\build\am65xx\R5_mpu_default.c 中使用的 MPU 配置:

    const CSL_ArmR5MpuRegionCfg  gCslR5MpuCfg[CSL_ARM_R5F_MPU_REGIONS_MAX] =
    {
        {
            /* Region 0 configuration: complete 32 bit address space = 4Gbits */
            .regionId         = 0U,
            .enable           = 1U,
            .baseAddr         = 0x0U,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_4GB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 1U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)FALSE,
            .cachePolicy      = 0U,
            .memAttr          = 0U,
        },
        {
            /* Region 1 configuration: ATCM memory */
            .regionId         = 1U,
            .enable           = 1U,
            .baseAddr         = 0x0U,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_32KB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 2 configuration: ATCM memory as cacheble */
            .regionId         = 2U,
            .enable           = 1U,
            .baseAddr         = 0x41000000U,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_32KB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 3 configuration: BTCM memory as cacheble */
            .regionId         = 3U,
            .enable           = 1U,
            .baseAddr         = 0x41010000U,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_32KB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_NON_CACHEABLE,
            .memAttr          = 0U,
        },
        {
            /* Region 4 configuration: 512 KB OCMC RAM as cacheble */
            .regionId         = 4U,
            .enable           = 1U,
            .baseAddr         = 0x41C00000,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_512KB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 5 configuration: 2 MB MCMS3 RAM as cacheble */
            .regionId         = 5U,
            .enable           = 1U,
            .baseAddr         = 0x70000000,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_2MB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 6 configuration: 2 GB DDR RAM */
            .regionId         = 6U,
            .enable           = 1U,
            .baseAddr         = 0x80000000,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_2GB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
    };



    在 CCS 中、我能够使用"Memory Browser"修改 DDR 存储器的内容

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

    有趣的是、 当尝试在 CCS 中查看 gRingMemArray 时、它实际上并不具有内存地址。  

    当尝试观察&gRingMemArray 时、CCS 提示"An error occurred at &(gRingMemArray)"、我甚至无法查看数组的内容。  

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

    有趣的是、我可能错过了一些内容、示例似乎现在加载了以下链接器配置:

    /*----------------------------------------------------------------------------*/
    /* r5f_linker_freertos.lds                                                    */
    /*                                                                            */
    /* (c) Texas Instruments 2021, All rights reserved.                           */
    /*                                                                            */
    
    --retain="*(.bootCode)"
    --retain="*(.startupCode)"
    --retain="*(.startupData)"
    --retain="*(.irqStack)"
    --retain="*(.fiqStack)"
    --retain="*(.abortStack)"
    --retain="*(.undStack)"
    --retain="*(.svcStack)"
    
    --fill_value=0
    --stack_size=0x4000
    --heap_size=0x8000
    --entry_point=_freertosresetvectors
    
    -stack  0x4000  /* SOFTWARE STACK SIZE */
    -heap   0x8000  /* HEAP AREA SIZE      */
    
    /*-------------------------------------------*/
    /*       Stack Sizes for various modes       */
    /*-------------------------------------------*/
    __IRQ_STACK_SIZE   = 0x1000;
    __FIQ_STACK_SIZE   = 0x0100;
    __ABORT_STACK_SIZE = 0x0100;
    __UND_STACK_SIZE   = 0x0100;
    __SVC_STACK_SIZE   = 0x0100;
    
    /*--------------------------------------------------------------------------*/
    /*                               Memory Map                                 */
    /*--------------------------------------------------------------------------*/
    MEMORY
    {
        /*--- Refer the user guide for details on persistence of these sections ---*/
        /*------------ Also, when these memories can be used by apps --------------*/
        MCU0_ATCM_NOT_USED          (R)     : ORIGIN = 0x00000000 LENGTH = 0x00007FFF
        MCU0_BTCM_NOT_USED          (R)     : ORIGIN = 0x41010000 LENGTH = 0x00007FFF
        /*----------- Used by SBL, can be used after APPs is started --------------*/
        MCU_MSRAM_RSVD_UNUSED       (R)     : ORIGIN = 0x41C00000 LENGTH = 0x00000200
        MCU_MSRAM_RSVD_SBL          (RWIX)  : ORIGIN = 0x41C00200 LENGTH = 0x0003DE00
    
        VECTORS                     (RWIX)  : ORIGIN = 0x41C3E000 LENGTH = 0x00000100
        RESET_VECTORS               (RWIX)  : ORIGIN = 0x41C3E100 LENGTH = 0x00001000
        OCMC_RAM                    (RWIX)  : ORIGIN = 0x41C3F100 LENGTH = 0x00040F00
    
        /*====================== COMPUTE_CLUSTER0_MSMC_SRAM =======================*/
        MSMC3                       (RWIX)  : ORIGIN = 0x70000000 LENGTH = 0x001EFC00
        /*---------- The ORIGIN  and LENGTH  is determined by board cfg, ----------*/ 
        /*------------------ refer user guide for details -------------------------*/
        MSMC3_RSVD_DMSC             (RWIX)  : ORIGIN = 0x701F0000 LENGTH = 0x00001000
    
        /*========================== AM65xx DDR LOCATION ==========================*/
        DDR0                        (RWIX)  : ORIGIN = 0x80000000 LENGTH = 0x7FFFFFE4
    
    }
    
    /*--------------------------------------------------------------*/
    /*                     Section Configuration                    */
    /*--------------------------------------------------------------*/
    SECTIONS
    {
        .intc_text               : {} palign(8)      > VECTORS
        .freertosrstvectors      : {} palign(8)      > MCU0_ATCM_NOT_USED /*RESET_VECTORS*/
        .bootCode                : {} palign(8)      > OCMC_RAM
        .startupCode             : {} palign(8)      > OCMC_RAM
        .startupData             : {} palign(8)      > OCMC_RAM, type = NOINIT
        .text                    : {} palign(8)      > MSMC3
        GROUP {
            .text.hwi    : palign(8)
            .text.cache  : palign(8)
            .text.mpu    : palign(8)
            .text.boot   : palign(8)
        }                                            > MSMC3
        .const                   : {} palign(8)      > MSMC3
        .rodata                  : {} palign(8)      > MSMC3
        .cinit                   : {} palign(8)      > MSMC3
        .pinit                   : {} palign(8)      > MSMC3
        .bss                     : {
            *(.bss)
            *(.bss.*)
        } align(8)       > DDR0 /*DDR0*/
        .far                     : {} align(8)       > MSMC3 /*DDR0*/
        .data                    : {} palign(128)    > MSMC3
        .sysmem                  : {} align(8)       > MSMC3
        .data_buffer             : {} palign(128)    > MSMC3 /*DDR0*/
        .bss.devgroup*           : {} align(8)       > MSMC3 /*DDR0*/
        .const.devgroup*         : {} align(8)       > MSMC3 /*DDR0*/
        .boardcfg_data           : {} align(128)     > MSMC3
        .stack      : {}                            align(8)    > MSMC3 (HIGH) /*DDR0*/  
    
        .irqStack   : {. = . + __IRQ_STACK_SIZE;}   align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__IRQ_STACK_START)
        RUN_END(__IRQ_STACK_END)
    
        .fiqStack  	: {. = . + __FIQ_STACK_SIZE;}   align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__FIQ_STACK_START)
        RUN_END(__FIQ_STACK_END)
    
        .abortStack : {. = . + __ABORT_STACK_SIZE;} align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__ABORT_STACK_START)
        RUN_END(__ABORT_STACK_END)
    
        .undStack  	: {. = . + __UND_STACK_SIZE;}   align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__UND_STACK_START)
        RUN_END(__UND_STACK_END)
    
        .svcStack  	: {. = . + __SVC_STACK_SIZE;}   align(8)    > MSMC3 (HIGH) /*DDR0*/
        RUN_START(__SVC_STACK_START)
        RUN_END(__SVC_STACK_END)
    
        /* DMA packet info (metadata), packet data and UDMA ring and desc memory */
        .bss:ENET_DMA_DESC_MEMPOOL (NOLOAD) {} ALIGN (128) > DDR0
        .bss:ENET_DMA_RING_MEMPOOL (NOLOAD) {} ALIGN (128) > DDR0
        .bss:ENET_DMA_PKT_MEMPOOL  (NOLOAD) {} ALIGN (128) > DDR0
        .bss:ENET_DMA_OBJ_MEM      (NOLOAD) {} ALIGN (128) > DDR0
        .bss:ENET_DMA_PKT_INFO_MEMPOOL (NOLOAD) {} ALIGN (128) > DDR0
    
        /* for ICSSG MEM */
        .bss:ENET_ICSSG_OCMC_MEM (NOLOAD) {} ALIGN (128) > MSMC3
    
        /* Used in Switch configuration tool */
        .serialContext     (NOLOAD) {} ALIGN (128) > DDR0
    
        /* SA sections */
        .scBufs         : {} align(8)   > DDR0
        .saSrcBuffers   : {} align(8)   > DDR0
        .saDstBuffers   : {} align(8)   > DDR0
    }
    
    

    我能够通过所有初始化和开放例程实现这一目标! 我认为这足以关闭目前这个主题、至少