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.

[参考译文] CCS/TDA2PXEVM:如何为 Linux 配置 A15的 DDR 存储器?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/924375/ccs-tda2pxevm-how-can-i-caculate-the-ddr-memory-of-a15-for-linux

器件型号:TDA2PXEVM

工具/软件:Code Composer Studio

我在  vsdk3.4中使用 A15 for Linux、我使用"TDA2Px 1024MB Linux "。如何在 mem_segure_define_linux.xs 中配置 A15 for Linux 的 DDR 存储器?

我在 Linux 中键入了"free"、发现 Linux 的总内存为535072。它与我计算的 me_seg_defination_linux.xs 不同 。

以下是 Linux 中的日志:

缓存的已用可用共享缓冲区总数
MEM:535072 177668 357404 8192 4848 66964
/+缓冲器/高速缓存:105856 429216
交换:0 0 0

以下是 mem_segure_define_linux.xs 的一部分:

/*   内核 内部 存储 器资源的分配 */
DSP1_L2_SRAM_ADDR           = 0x40800000;
DSP1_L2_SRAM_SIZE           = 288*KB;

DSP2_L2_SRAM_ADDR           = 0x41000000;
DS2_L2_SRAM_SIZE           = 288*KB;

EVE1_SRAM_ADDR              = 0x42000000;
EVE1_SRAM_SIZE              = 1*MB;

EVE2_SRAM_ADDR              = 0x42100000;
EVE2_SRAM_SIZE              = 1*MB;

/* DDR3 内存 映射 1.5GB */
/*********
                   所需的按大小地址用于                  可高速缓存
A15-Linux            64MB    0x8000000
SR1 + NDK 、         336MB    0x84000000  SR1+NDK                    对 所有 内核都是
IPU2-BIOS            80MB    0x99000000  Vision-SDK FWK ( 12 MB 孔)
IPU1-BIOS            32MB    0x9e000000  IPU2 内核                 是 IPU1  
DSP1-BIOS            64MB    0xA1000000  无线电 (+ 分析 算法)  16MB 不可高速缓存 -   无线电需要
DSP2-BIOS            32MB    0xA3000000  SRV 算法                  对 DSP2是
A15、 IPU1/2、 DSP1/2  32MB    0xA0000000  SR0                       不 适用于 所有 内核
EVE                  64MB    0xA5000000
SR2_base_ADDR                0xA9000000
A15-Linux                    0xC0000000 (  交错结束)
(小部分 /
DDR3_ADDR                   = 0x8000000;
DDR3_size                   = 1024*MB;
DDR3_Linux_MEM_OFFSET       = 64*MB;

/* 前 512 MB - 缓存 */
DDR3_base_ADDR_0            = 0x8000000;
DDR3_base_size_0            = 448*MB + DDR3_LINUX_MEM_OFFSET;


/*      第二 个内存 段的起始地址 应为  16MB 对齐。
 *              此对齐是 EVE 使用的单个16MB 映射必须执行的操作
 * 映 射 SR0  、REMOTE_LOG_MEM 段。
 否则  需要   修改* tlb_config_eveX.c  
 *
DDR3_base_ADDR_1            = 0xA0000000;
DDR3_base_size_1            = 512*MB;

/*        在  不同 内核上运行的不同组件的地址和大小定义 */
NDK_START_ADDR              = DDR3_BASE_ADDR_0 + DDR3_Linux_MEM_OFFSET;
NDK_MEM_SIZE                =   2*MB
SR1_FRAME_buffer_size       = 330*MB;
/*SR1_FRAME_buffer_size       = 413*MB;*/
SR1_buff ecc_ASIL_size      =   4*KB;
SR1_buy_ecc_qm_size        =   4*KB;
SR1_buff 非 ECC_ASIL_SIZE  =   4*KB;

var ipummSupport = java.lang.System.getenv ("IPUMM_include");

/* 保持  IPU1 和 IPU2 具有 相同 的代码 和 数据 大小、
 * 这 允许  选择 任何 IPU 子系统 作为 主 IPU 内核 */
IPU2_START_ADDR             = 0x99000000;
/*IPU2_START_ADDR             = 0x9e000000;*/
IPU2_CODE_SIZE              =   10*MB;
if (ipummSupport ="yes" ) {
  IPU2_DATA_SIZE            =  60*MB;
否则 {
  IPU2_DATA_SIZE            =  20*MB;

IPU1_START_ADDR             = 0x9e000000;
IPU1_0_CODE_SIZE            =   8*MB;
IPU1_0_DATA_SIZE            =  21*MB;

DSP1_START_ADDR             = 0xA1000000;
DSP1_CODE_SIZE              =   2*MB;
DSP1_DATA_SIZE              =  24*MB;

DSP2_START_ADDR             = 0xA3000000;
dsp2_code_size              =   2*MB;
dsp2_data_size              =  10*MB;

/*      第二 个内存 段的起始地址 应为  16MB 对齐。
 *              此对齐是 EVE 使用的单个16MB 映射必须执行的操作
 * 映 射 SR0  、REMOTE_LOG_MEM 段。
 否则  需要   修改* tlb_config_eveX.c  
 *
 *   remote_log_size+system_ipc_shm_size+link_stats_size+的大小
 *         HDVPSS_DESC_SIZE+SR0_SIZE
 * 必须     是 MB 的倍数
 *
remote_log_size             =  256*KB;
System_IPC_SHM_SIZE         =  512*KB;
LINK_STATS_SIZE             =  512*KB;
HDVPSS_DESC_SIZE            = 1024*KB;
sr0_size                    = 1024*KB;
TRACE_BUF_LEN               =  384*KB;
EXC_DATA_LEN                =   64*KB;
PM_DATA_LEN                 =  512*KB;
OPENVX_SHM_SIZE             =    2*MB;

/*     EVE 内存的起始地址 必须  为16MB 对齐。  *
EVE_START_ADDR              = 0xA5000000;
/* EVE vecs 空间 应  与  16MB 边界对齐,  如果 可能 ,请尝试  适应
 *     以16MB 为单位的整个 vecs+code+data 段。    在这种情况下  、只需一  个 TLB 映射  
 *  足够  映射    EVE 的 vecs+code+data。
 如果             这些 EVE 存储器段中的任何一个或、则需要修改 tlb_config_eveX.c
 * 修改了 SR1_FRAME_BUFFER_MEM 段  。
 *
EVE1_VECS_SIZE              = 0.5*MB;
EVE1_CODE_SIZE              =   2*MB;
EVE1_DATA_SIZE              =13.5*MB;
EVE2_VECS_SIZE              = 0.5*MB;
EVE2_CODE_SIZE              =   2*MB;
EVE2_DATA_SIZE              =13.5*MB;

TOTAL_MEM_SIZE              = (DDR3_SIZE);


/*  NDK         MEM 和 SR1_FRAME 都使用单个 Linux MEM 孔
 * 所以 这两   个段 应该   是一个连续的、  没有  任何间隙
 *
NDK_MEM_ADDR                = NDK_START_ADDR
SR1_buff ECC ASIL_ADDR      = NDK_MEM_ADDR               + NDK_MEM_SIZE;
SR1_buff ECC QM_ADDR        = SR1_buff ECC_ASIL_ADDR     + SR1_buff ECC_ASIL_SIZE;
SR1_buff 非 ECC_ASIL_ADDR  = SR1_buff ECC_QM_ADDR       + SR1_buff ECC_QM_SIZE;
SR1_FRAME_buffer_ADDR       = SR1_buffer_non_ecc_ASIL_ADDR + SR1_buffer_non_ecc_ASIL_size;

IPU2_CODE_ADDR              = IPU2_START_ADDR;
IPU2_DATA_ADDR              = IPU2_CODE_ADDR        + IPU2_CODE_SIZE;

DSP1_CODE_ADDR              = DSP1_START_ADDR;
DSP1_DATA_ADDR              = DSP1_CODE_ADDR        + DSP1_CODE_SIZE;

IPU1_0_CODE_ADDR            = IPU1_START_ADDR;
IPU1_0_DATA_ADDR            = IPU1_0_CODE_ADDR      + IPU1_0_CODE_SIZE;

DSP2_CODE_ADDR              = DSP2_START_ADDR;
DSP2_DATA_ADDR              = DSP2_CODE_ADDR        + DSP2_CODE_SIZE;

/*     IPU1的非缓存段 */
/*      第二 个内存 段的起始地址 应为  16MB 对齐。
 *              此对齐是 EVE 使用的单个16MB 映射必须执行的操作
 * 映 射 SR0  、REMOTE_LOG_MEM 段。
 否则  需要   修改* tlb_config_eveX.c  
 *
sr0_ADDR                    = ddr3_base_ADDR_1 + 1*MB; // 为     DSP 的虚拟队列保留1MB - 这 在   IPC 虚拟队列中已硬编码 */
REMOVE_LOG_ADDR             = SR0_ADDR              + SR0_SIZE;
LINK_STATS_ADDR             = REMOLE_LOG_ADDR       + REMOLE_LOG_SIZE;
System_IPC_SHM_ADDR         = LINK_STATS_ADDR       + LINK_STATS_SIZE;
HDVPSS_DESC_ADDR            = SYSTEM_IPC_SHM_ADDR   + SYSTEM_IPC_SHM_SIZE;
if (java.lang.System.getenv ("OPENVx_include")="yes")
    OPENVX_SHM_ADDR         = HDVPSS_DESC_ADDR      + HDVPSS_DESC_SIZE;
    TRACE_BUF_BASE          = OPENVX_SHM_ADDR       + OPENVX_SHM_SIZE;
其他
    TRACE_BUF_BASE          = HDVPSS_DESC_ADDR      + HDVPSS_DESC_SIZE;

EXC_DATA_BASE               = TRACE_BUF_BASE        + TRACE_BUF_LEN;
PM_DATA_BASE                = EXC_DATA_BASE         + EXC_DATA_LEN;

/* EVE vecs 空间 应  与  16MB 边界对齐,  如果 可能 ,请尝试  适应
 *     以16MB 为单位的整个 vecs+code+data 段。    在这种情况下  、只需一  个 TLB 映射  
 *  足够  映射    EVE 的 vecs+code+data。
 如果             这些 EVE 存储器段中的任何一个或、则需要修改 tlb_config_eveX.c
 * 修改了 SR1_FRAME_BUFFER_MEM 段  。
 *

EVE1_VECS_ADDR              = EVE_START_ADDR
EVE1_CODE_ADDR              = EVE1_VECS_ADDR        + EVE1_VECS_SIZE;
EVE1_DATA_ADDR              = EVE1_CODE_ADDR        + EVE1_CODE_SIZE;
EVE2_VECS_ADDR              = EVE1_DATA_ADDR        + EVE1_DATA_SIZE;
EVE2_CODE_ADDR              = EVE2_VECS_ADDR        + EVE2_VECS_SIZE;
EVE2_DATA_ADDR              = EVE2_CODE_ADDR        + EVE2_CODE_SIZE;

VAR A15TargetOS = java.lang.System.getenv ("A15_target_OS");
if (A15TargetOS ="QNX" ) {
  /* 由    A15 HLOS QNX*/处理的共享区域  
  SR2_base_ADDR         = 0xBA300000;
  SR2_size              = 90*MB;
否则 {
  /* 由    A15 HLOS Linux*/处理的共享区域
  SR2_base_ADDR         = 0xA9000000;
  SR2_SIZE              = 0x4000000;

函数 getMemSegmentDefinition_external (内核)
    var 内存 = 新 阵列();
    VAR 索引 = 0;

    MEMORY [index++] = ["IPU1_0_CODE_MEM"、 {
            注 释: "IPU1_0_CODE_MEM",
            名称    : “IPU1_0_CODE_MEM”,
            基地址    : IPU1_0_CODE_ADDR,
            len     : IPU1_0_code_size
        ]];
    MEMORY [index++] = ["IPU1_0_DATA_MEM"、 {
            注 释: "IPU1_0_DATA_MEM",
            名称    : "IPU1_0_DATA_MEM",
            基地址    : IPU1_0_DATA_ADDR,
            len     : IPU1_0_data_size
        ]];
    MEMORY [index++] = ["NDK_MEM"、 {
            注 释: "NDK_MEM"、
            名称    : "NDK_MEM"、
            Base    : NDK_MEM_ADDR,
            Len     : NDK_MEM_SIZE
        ]];
    MEMORY [index++] = ["IPU2_CODE_MEM"、 {
            注 释: "IPU2_CODE_MEM"、
            名称    : “IPU2_CODE_MEM”,
            基本    : IPU2_CODE_ADDR,
            Len     : IPU2_CODE_SIZE
        ]];
    MEMORY [index++] = ["IPU2_DATA_MEM"、 {
            注 释: "IPU2_DATA_MEM",
            名称    : “IPU2_DATA_MEM”,
            Base    : IPU2_DATA_ADDR,
            len     : IPU2_DATA_SIZE
        ]];
    MEMORY [index++] = ["DS1_CODE_MEM"、 {
            注 释: "DSP1_CODE_MEM",
            名称    : "DSP1_CODE_MEM",
            Base    : DSP1_CODE_ADDR,
            Len     : DSP1_CODE_SIZE
        ]];
    MEMORY [index++] = ["DS1_DATA_MEM"、 {
            注 释: "DSP1_DATA_MEM",
            名称    : "DSP1_DATA_MEM",
            Base    : DSP1_DATA_ADDR,
            Len     : DSP1_DATA_SIZE
        ]];

    memory[index++] = ["dsp2_code_MEM"、 {
            注 释: "DSP2_CODE_MEM",
            名称    : "DSP2_CODE_MEM",
            基本    : dsp2_code_ADDR,
            len     : dsp2_code_size
        ]];
    memory[index++] = ["dsp2_data_MEM"、 {
            注 释: "DSP2_DATA_MEM",
            名称    : "DSP2_DATA_MEM",
            Base    : DSP2_DATA_ADDR,
            len     : dsp2_data_size
        ]];

    MEMORY [index++] = ["EVE1_VECS_MEM"、 {
            注 释: "EVE1_VECS_MEM",
            名称    : “EVE1_VECS_MEM”,
            基本    : EVE1_VECS_ADDR,
            Len     : EVE1_VECS_SIZE
        ]];
    MEMORY [index++] = ["EVE1_CODE_MEM"、 {
            注 释: "EVE1_CODE_MEM",
            名称    : “EVE1_CODE_MEM”,
            基本    : EVE1_CODE_ADDR,
            Len     : evE1_code_size
        ]];
    MEMORY [index++] = ["EVE1_DATA_MEM"、 {
            注 释: "EVE1_DATA_MEM",
            名称    : “EVE1_DATA_MEM”,
            Base    : EVE1_DATA_ADDR,
            len     : evE1_data_size
        ]];
    MEMORY [index++] = ["EVE2_VECS_MEM"、 {
            注 释: “EVE2_VECS_MEM”,
            名称    : “EVE2_VECS_MEM”,
            基本    : EVE2_VECS_ADDR,
            Len     : EVE2_VECS_SIZE
        ]];
    MEMORY [index++] = ["EVE2_CODE_MEM"、 {
            注 释: "EVE2_CODE_MEM",
            名称    : “EVE2_CODE_MEM”,
            基本    : EVE2_CODE_ADDR,
            len     : eve2_code_size
        ]];
    MEMORY [index++] = ["EVE2_DATA_MEM"、 {
            注 释: "EVE2_DATA_MEM",
            名称    : “EVE2_DATA_MEM”,
            Base    : EVE2_DATA_ADDR,
            len     : eve2_data_size
        ]];
    MEMORY [index++] = ["SR1_FRAME_BUFFER_MEM"、 {
            注 释: "SR1_FRAME_BUFFER_MEM",
            名称    : “SR1_FRAME_BUFFER_MEM”,
            基址    : SR1_FRAME_BUFFER_ADDR,
            len     : SR1_FRAME_buffer_size
        ]];
    memory[index++] = ["SR1_buff ecc_ASIL_MEM"、 {
            注 释: "SR1_buff ECC_ASIL_MEM"、
            名称    : "SR1_buff ECC_ASIL_MEM",
            基本    : SR1_buff ECC_ASIL_ADDR,
            len     : SR1_buff ecc_ASIL_size
    ]];
    MEMORY [index++] = ["SR1_buff ecc_qm_MEM"、 {
            注 释: "SR1_buff ECC_QM_MEM"、
            名称    : “SR1_buff”、“ECC_QM_MEM”
            基址    : SR1_buff ECC_QM_ADDR,
            Len     : SR1_buff ECC QM 大小
    ]];
    MEMORY [index++] = ["SR1_buff 非 ECC_ASIL_MEM"、 {
            注 释: "SR1_buff non_ecc_ASIL_MEM"、
            名称    : “SR1_buff”、“NON_ECC_ASIL_MEM”、
            基本    : SR1_buff 非 ECC_ASIL_ADDR,
            len     : SR1_buff 非 ECC_ASIL_SIZE
    ]];
    MEMORY [index++] = ["SR0"、 {
            注 释: “SR0”,
            名称    : “SR0”,
            Base    : SR0_ADDR,
            Len     : SR0_SIZE
        ]];
    MEMORY [index++] = ["HDVPSS_DESC_MEM"、 {
            注 释: "HDVPSS_DESC_MEM",
            名称    : "HDVPSS_DESC_MEM",
            基本    : HDVPSS_DESC_ADDR,
            Len     : HDVPSS_DESC_SIZE
        ]];
    MEMORY [index++] = ["remote_log_MEM"、 {
            注 释: "remote_log_MEM",
            名称    : “REMOTE_LOG_MEM”,
            Base    : remote_log_ADDR,
            len     : remote_log_size
        ]];
    memory[index++] = ["link_stats_MEM"、 {
            注 释: "link_stats_MEM"、
            名称    : “LINK_STATS_MEM”,
            Base    : LINK_STATS_ADDR,
            len     : link_stats_size
        ]];
    MEMORY [index++] = ["system_IPC_SHM_MEM"、 {
            注 释: "system_ipc_shm_MEM",
            名称    : "System_IPC_SHM_MEM",
            Base    : SYSTEM_IPC_SHM_ADDR、
            len     : system_ipc_shm_size
        ]];
    if (java.lang.System.getenv ("OPENVx_include")="yes")
    {
        MEMORY [index++] = ["OPENVX_SHM_MEM"、 {
                注释: "OPENVX_SHM_MEM"、
                名称: "OPENVX_SHM_MEM"、
                基址: OPENVX_SHM_ADDR、
               Len:  OPENVX_SHM_SIZE
        ]];
    }

    xdc.print ("#!!!   内核 是 [" + 内核 +"]!!!"    );

    MEMORY [index++] = ["DSP1_L2_SRAM"、 {
            注释: "DSP1_L2_SRAM"、
            名称: "DSP1_L2_SRAM"、
            基址: DSP1_L2_SRAM_ADDR、
            Len:  DSP1_L2_SRAM_SIZE
        ]];
    MEMORY [index++] = ["DSP2_L2_SRAM"、 {
            注释: "DSP2_L2_SRAM"、
            名称: "DSP2_L2_SRAM"、
            基本: DS2_L2_SRAM_ADDR、
            Len:  DSP2_L2_SRAM_SIZE
        ]];
    MEMORY [index++] = ["trace_BUF"、 {
            注释: "trace_BUF"、
            名称: "trace_BUF"、
            base: trace_BUF_BASE、
            Len:  trace_BUF_LEN、
        ]];
    MEMORY [index++] = ["EXC_DATA"、 {
            注释: "EXC_DATA"、
            名称: "EXC_DATA"、
            Base: EXC_DATA_BASE、
            Len:  EXC_DATA_LEN、
        ]];
    MEMORY [index++] = ["PM_DATA"、 {
            注释: "PM_DATA"、
            名称: "PM_DATA"、
            Base: PM_DATA_BASE、
            Len:  Pm_DATA_LEN、
        ]];
    MEMORY [index++] = ["SR2_MEM"、 {
            注释: "SR2_MEM"、
            名称: "SR2_MEM"、
            基地址: SR2_base_ADDR、
            Len:  SR2_SIZE、
        ]];

    返回 (内存);

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

    您好!

    请浏览以下文档、以更好地了解存储器映射

    VISION_SDK/docs/FeatureSpecificUserGuides/VisionSDK_UserGuide_MemoryMap.pdf

    谢谢

    加维拉尤