请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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、
]];
返回 (内存);
}