ADSP21489工程中LDF文件配置详解

article/2025/9/26 9:42:21

一直都没有搞懂LDF文件是怎么回事,后续翻到这个文档<cces-LinkerUtilities-manual.pdf>才认真的看了一下


 先搞懂ADSP21489的片上RAM空间大小是5Mbit

5Mbit        = 160k字的32位数据

                = 320k 字的16位数据

                = 106.7k字的48位指令(或40位数据)或不同大 小字的组合

只要不超过5 Mb。所有存储器都可以通过16 位、32位、48位或64位字访问。支持16位浮点存储格式, 片内可存储的数据量得以加倍。32位浮点与16位浮点之间 的转换通过单指令执行。虽然每个存储器模块都可以存储 代码和数据的组合,但如果让一个模块存储数据,利用 DM总线进行传输,让另一个模块存储指令和数据,利用 PM总线进行传输,则存取效率最高。

上面紫色字段的个人理解:

        16bit,32bit,48bit word 可以再片上RAM上混用,但是最好是相同的word存储在一起.片上存储器可以存储数据和代码,然后模块和模块分开,存储数据的模块就存储数据,存储指令的就存储指令,数据就使用DM进行标识使用DM总线速度最快,而指令则用PM进行标识

疑惑点:为什么会有16bit float?


 ADSP21489片上RAM存储物理地址分成4个模块

BLOCK0: 
48bit  
 0x0008 C000–0x0009 3FFF
32bit
 0x0009 2000–0x0009 DFFF
16bit
 0x0012 4000–0x0013 BFFF

BLOCK1: 
48bit  
 0x000A C000–0x000B 3FFF
32bit
 0x000B 2000–0x000B DFFF
16bit
 0x0016 4000–0x0017 BFFF

BLOCK2: 
48bit  
 0x000C 0000–0x000C 5554
32bit
 0x000C 0000–0x000C 7FFF
16bit
 0x0018 0000–0x0018 FFFF

BLOCK3: 
48bit  
 0x000E 0000–0x000E 5554
32bit
 0x000E 0000–0x000E 7FFF
16bit
 0x001C 0000–0x001C FFFF


看到存储地址这里,又不得不讲一下ADSP21489的boot kernel

   ** Notes:
   ** 1) The interrupt Vector Table (IVT) code is placed in internal memory
   **    by default and has to use ISA (NW, 48 bit) instructions.
   ** 2) The loader kernel uses 256 ISA instructions from the start of the 
   **    IVT. The final action it does is to load the application code to these
   **    address overwriting it's own code. The application code in these
   **    addresses therefore must also be ISA instructions. Do not put 
   **    VISA (SW) instructions in these 256 locations.
   ** 3) IVT一直存放片上RAM
   ** 4) ASDP2148处理器上电或复位后启动从boot kernel启动,通过DMA通道自动传输到处理器的RAM,384-word 32bit or 256word(48bit)

下面是原文介绍(不翻译了,我觉得英文自己理解更带劲)

At power-up, after the chip reset, the booting process includes the following steps.
1. Based on the boot type, an appropriate DMA channel is automatically configured for a 384-word (32-bit)
transfer or a 256-word (48-bit) transfer. This transfer boot-loads the boot kernel program into the processor
memory.
2. The boot kernel runs and loads the application executable code and data.
3. The boot kernel overwrites itself with the first 256 (48-bit) words of the application at the end of the booting
process. After that, the application executable code starts running.

 就是解释一下:  384word(32bit) = 384*32bit刚好等于256word(48bit) = 256*48bit

第三点:引导程序完成后会重写前面的256word(48bit)空间内容,为啥要重写?没理解


在开始ldf文件之前再介绍了解一下

Default Memory Segments and Sections for SHARC Processors
SHARC 处理器默认的内存段
默认内存段的名字有以下三个特点
• The prefix mem
• The name of the memory that the segment is in, for example, block0 for internal memory block 0, or sdram for external memory. There can be multiple segments for each such memory.
• The type of data or code that the segment is intended for, for example pm48 for 48-bit instructions words or dm32 for 32-bit data words
总结就是: mem前缀,pm48表示48位语句,dm32表示32位数据字
另外还有指定的内存部分
• mem_iv_code: This segment covers the interrupt vector table at the start of internal memory block 0.在block0内存上中断向量表的位置
• seg_init: Used for compressed data created by the memory initialization tool meminit. (See -meminit for more information.) 用于初始化被内存初始化工具meminit 创建的压缩数据
输出段(Output Sections)
输出段名字特点
• The prefix dxe
• The memory name of the segment that the output section is mapped to, for example, block0 for internal memory block 0 or sdram for external memory • An indication of what the output section is used for, for example nw_code for normal word code, bsz for zero-initialized data, or cpp_ctors for C++ constructor lists
• Optionally, a priority, for example, prio0, prio1, and so on. This is used when multiple input sections of the same sort need to be mapped to the same segment in a particular order, whereby lower numbers are mapped first.
总结就是dxe开头,带有prio0或1,2,3...之类的就是0的优先级最高,最先map, cpp_ctors表示C++构造函数列表
bsz表示初始化0的数据
nw_code正常字宽code
例如:
dxe_block0_sw_code_prio0 (short字映射到内存块0高优先级)for short word code mapped to internal memory block 0 with high priority
dxe_sdram_cpp_ctors for C++ constructor lists mapped to SDRAM.
输入内存段(Input Sections)
For historical reasons, the names of many of these start with prefix seg where one might expect sec.

        默认的.ldf文件映射了许多输入部分,允许对在内存中放置代码和数据的位置进行一些控制;请参阅SHARC处理器表的内存输入部分。

存储空间分布表

MEMORY
{/* ADSP-21489 MEMORY MAP.**** The SHARC 21489 has 5Mbit RAM in total.**** -------------------------- BLOCK 0 ---------------------------------------** 0x0008 C000 to 0x0009 3FFF  Normal word (48) Space (1.5 Mbit RAM)** 0x0009 2000 to 0x0009 DFFF  Normal word (32) Space (1.5 Mbit RAM)** 0x0012 4000 to 0x0013 BFFF  Short word  (16) Space (1.5 Mbit RAM)**** Notes:** 1) The interrupt Vector Table (IVT) code is placed in internal memory**    by default and has to use ISA (NW, 48 bit) instructions.** 2) The loader kernel uses 256 ISA instructions from the start of the **    IVT. The final action it does is to load the application code to these**    address overwriting it's own code. The application code in these**    addresses therefore must also be ISA instructions. Do not put **    VISA (SW) instructions in these 256 locations.*/mem_iv_code             { TYPE(PM RAM) START(0x0008C000) END(0x0008C0A7) WIDTH(48) }mem_block0_nwco         { TYPE(PM RAM) START(0x0008C0A8) END(0x0008C0FF) WIDTH(48) }mem_block0_sw16         { TYPE(SW RAM) START(0x00124300) END(0x0013BFFF) WIDTH(16) }/*** -------------------------- BLOCK 1 ---------------------------------------** 0x000A C000 to 0x000B 3FFF  Normal word (48) Space (1.5 Mbit RAM)** 0x000B 2000 to 0x000B DFFF  Normal word (32) Space (1.5 Mbit RAM)** 0x0016 4000 to 0x0017 BFFF  Short word (16)  Space (1.5 Mbit RAM)*/mem_block1_dm32         { TYPE(DM RAM) START(0x000B2000) END(0x000BDFFF) WIDTH(32) }/*** -------------------------- BLOCK 2 ---------------------------------------** 0x000C 0000 to 0x000C 5554  Normal word (48) Space (1 Mbit RAM)** 0x000C 0000 to 0x000C 7FFF  Normal word (32) Space (1 Mbit RAM)** 0x0018 0000 to 0x0018 FFFF  Short word (16) Space (1 Mbit RAM)*/mem_block2_pm32         { TYPE(PM RAM) START(0x000C0000) END(0x000C7FFF) WIDTH(32) }/*** -------------------------- BLOCK 3 ---------------------------------------** 0x000E 0000 to 0x000E 5554  Normal word (48) Space (1 Mbit RAM)** 0x000E 0000 to 0x000E 7FFF  Normal word (32) Space (1 Mbit RAM)** 0x001C 0000 to 0x001C FFFF  Short word (16)  Space (1 Mbit RAM)*/mem_block3_dm32         { TYPE(DM RAM) START(0x000E0000) END(0x000E7FFF) WIDTH(32) }mem_sram                { TYPE(DM RAM ASYNCHRONOUS) START(0x0C000000) END(0x0C01FFFF) WIDTH(8) }mem_flash               { TYPE(DM RAM ASYNCHRONOUS) START(0x04000000) END(0x043FFFFF) WIDTH(8) }/*$VDSG<insert-new-memory-segments>                          *//* Text inserted between these $VDSG comments will be preserved */mem_block0_dm32         { TYPE(DM RAM) START(0x0009DA00) END(0x0009DFFF) WIDTH(32) }   mem_block3_dm48         { TYPE(DM RAM) START(0x000E0000) END(0x000E17FF) WIDTH(48) }mem_sdram_dmda1         { TYPE(DM RAM) START(0x00660000) END(0x00666BFF) WIDTH(16) }        /*$VDSG<insert-new-memory-segments>                          */} /* MEMORY */

问题1:

mem_block0_sw16的含义

表示片上空间block0段定义为16bit时的存储空间,ADSP21489片上的5Mbit RAM大小一共被分配成4个block,存储分配如下

BLOCK 0 = 1.5Mbit

BLOCK 1 = 1.5Mbit

BLOCK 2 = 1Mbit

BLOCK 3 = 1Mbit

合计5Mbit 

问题2:DM和PM的表面意义就是数据和程序空间的意思,但是数据空间是指的存储数据,那么程序空间是指在RAM上存储程序代码吗?

问题3:解释一下在ldf中的section是啥意思

#pragma section("ss_fw_code_fast")
void DelayMs(int nCount)
{int i = 0;for (i = 0; i < nCount; i++){NOP;}
}

在LDF文件中又经常看见如下

INPUT_SECTIONS( $OBJECTS(iv_code) )INPUT_SECTIONS( $OBJS_LIBS(seg_int_code seg_init seg_pmco) )

这里个人理解借用TI DSP的cmd文件进行理解一下

{ input_sections } —— 输入段,其语法如下:花括号“{}”中是输入段名。这里对输入段和输出段做一个区分,每一个C语言文件经过编译都会生成若干个段,多个汇编语言或C语言文件生成的段大都是同名的,常见的的段有如.cinit、.ebss等,这些都属于输入段。这些归属于不同文件的输入段,在CMD文件的指示下,会被链接器链接在一起生成输出段。
 

问题4:解释一下在ldf中的INPUT_SECTIONS( $OBJS_LIBS(seg_int_code_sw seg_int_code) )中各种美元符$后的标志的意思

$OBJS_LIBS(seg_int_code seg_init seg_pmco)

 $OBJECTS(ss_block0_data) $LIBRARIES(ss_block0_data)

os_mem1 {INPUT_SECTIONS($OBJECTS(program))
} >mem1
os_mem2 {INPUT_SECTIONS($OBJECTS(program))
} >mem2

找了一下原文解释

In the above example, if some of the input sections included in $OBJECTS(program) do not fit in os_mem1,
the linker will try to map them into os_mem2.

在上述示例中,如果$OBJECTS(program)中包含的一些输入部分不适合os_mem1,链接器将尝试将它们映射到os_mem2。

写这里最后还补充一次一个完整的写法说明

      #define IV_CODE dxe_iv_codeIV_CODE PM{/* iv_code表示一个输入端(中断向量代码)  						*/	/* INPUT_SECTIONS() 就是表示后面的对象内容放置到执行文件中		*//* mem_iv_code表示指定code存放在该内存段上					*//* IV_CODE也就是dxe_iv_code,看到dxe的前缀就知道是输出段 		*/INPUT_SECTIONS( $OBJECTS(iv_code) )} > mem_iv_code

问题5:PM和SW是什么意思

PM - program memory, contains 6 bytes per word.
DM - data memory, contains 4 bytes per word.
DATA64 - contains 8 bytes per word.
SW - contains 2 bytes per word. ---- __SHORT_WORD_CODE__
问题6:ldf中一些关键的段,不可修改


http://chatgpt.dhexx.cn/article/jUYFLBl5.shtml

相关文章

服务器mdf ldf文件,数据库mdf和ldf文件上传到服务器

数据库mdf和ldf文件上传到服务器 内容精选 换一换 使用DLI提交SQL作业查询数据。基本流程如下&#xff1a;步骤1&#xff1a;登录华为云步骤2&#xff1a;上传数据至OBS步骤3&#xff1a;登录DLI管理控制台步骤4&#xff1a;创建队列步骤5&#xff1a;创建数据库步骤6&#xff…

BUSMASTER LDF编辑工具制作LDF文件

本文摘要&#xff1a;本文章介绍如何使用BUSMASTER V3.2.2软件中的LDF编辑工具制作LDF文件 使用软件&#xff1a;BUSMASTER V3.2.2 -> LDF Editor 软件下载地址&#xff1a; https://download.csdn.net/download/m0_50669075/85190261 以下叙述的步骤只是为了描述清晰&a…

mdf ldf 导入 mysql_mdf和ldf导入数据库

Sql Server 错误5123/5120 附加数据库错误 Microsoft Sql Server 在附加数据库时&#xff0c;重装了系统并重命名主机名 或者 使用windows身份登陆 都有可能造成这个结果在Vista 或者Windows7下可能会报这样的错误 原因是对想要附加的数据库文件(.mdf)和日志文件(.ldf) 没有操作…

LDF文件步骤及内容详解

LDF文件第一部分——ldf文件配置 LIN_description_file; //LIN描述文件 LIN_protocol_version 2.1;//LIN协议版本 LIN_language_version 2.1; //LIN语言版本 LIN_speed 19.2 kbps; //LIN的通信速度 第一部分是必不可少的&#xff0c;属于全局定义。我们可以把等号左边…

LDF转Excel;LDF转位定义;Excel转LDF;Excel转位定义;MatrixCreat(二)之LDF文件创建

LDF文件创建 一、摘要1.描述2.关键字 二、什么是LDF文件三、LDF创建环境四、LDF创建过程1.软件运行2.新建LDF文件3.修改主节点信息4.修改从节点信息5.新建描述信号6.新建信号消息7.新建报文信息8.新建调度表9.新建其他信息 五、MatrixCreat工具六、其他七、参考 一、摘要 1.描…

LDF转Excel;LDF转位定义;Excel转LDF;Excel转位定义;MatrixCreat(三)之LDF文件详解

LDF文件详解 一、摘要1.描述2.关键字 二、为什么要了解LDF文件三、LDF文件构成1.版本2.波特率3.节点信息4.信号信息5.诊断信号信息6.报文消息7.诊断报文消息8.从节点信息9.调度表10.描述信息11.信号描述关联 四、LDF文件解析1.解析版本2.解析节点信息3.解析调度表4.解析报文消息…

LIN数据库文件LDF介绍及使用

LIN总线的项目接触的很少,今天结合CANoe官方文档和自己的理解,浅谈下LIN总线的数据库文件LDF LDF文件 LDF,LIN description file,LIN总线描述性文件,使用LIN 规范中定义的LIN配置语言 创建或编辑LDF文件,需要打开Vector LDF Explorer工具,有三种方式: 通过电脑系统找到…

系统级性能分析工具 — Perf详解讲解

从2.6.31内核开始&#xff0c;Linux内核自带了一个性能分析工具perf&#xff0c;能够进行函数级与指令级的热点查找。通过它&#xff0c;应用程序可以利用 PMU&#xff0c;tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread)&…

Perfetto工具集之traced_perf

1.Perf工具概览 linux中包含了众多性能分析工具&#xff0c;perf&#xff08;特指linux-tools perf&#xff09;工具是2009年在linux内核2.6.31中引入的一个工具。它的主要功能是可以跟踪hardware performance counter(PMU)、tracepoints、software performance counter(hrtime…

perf工具使用

perf研究总结 最近在天数搞一个性能的工具&#xff0c;需要抓callstack 包括用户态和内核的太调用栈&#xff0c;那么就顺便研究了一下perf工具。做了一个简单的总结。 perf --help 显示具体的命令&#xff0c;每个命令如何使用&#xff0c;再perf cmd --help会显示 参考链…

Linux系统性能监控分析工具perf

文章目录 一、perf 工具下载1.在centos7下离线安装2.安装flex3.安装bison 二、设置环境变量三、用MobaXterm 在linux和windows之间上传/下载文件1.连接服务器2.上传文件3.下载 四、perf原理1.perf的使用2.perf简单介绍3.常用命令格式1.perf list2.perf top3.perf stat4.perf pr…

perf工具简介+火焰图制作与解读

perf工具简介火焰图制作与解读 1、perf工具简单原理 perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统&#xff0c;它提供一个性能分析框架&#xff0c;比如硬件&#xff08;CPU、PMU(Performance Monitoring Unit)&#xff09;功能和软件(软件计数器…

perf record/report

性能优化 性能优化通常分为两个阶段&#xff1a;性能分析、性能优化 性能分析&#xff1a;查找性能瓶颈、热点代码&#xff0c;分析引发性能问题的原因。性能优化&#xff1a;基于性能分析&#xff0c;进行性能优化。包括&#xff1a;算法优化&#xff08;空间复杂度和时间复…

perf命令使用

转载申明&#xff1a;本文转载自http://www.brendangregg.com/perf.html 请大家看了之后如果要转载一定要注上这个地址&#xff01;&#xff01;&#xff01; perf Examples The Linux perf_events T-shirt These are some examples of using the perf Linux profiler, which …

Linux perf probe 的使用(三)

文章目录 前言一、Dynamic Tracing二、kprobes2.1 perf kprobe 的使用2.2 kprobe Arguments3.3 tcp_sendmsg()3.3.1 Kernel: tcp_sendmsg()3.3.2 Kernel: tcp_sendmsg() with size3.3.2 Kernel: tcp_sendmsg() line number and local variable 三、uprobes的使用3.1 perf uprob…

linux 性能分析工具perf

perf 性能监控分析工具 perf 工具下载 https://cdn.kernel.org/pub/linux/kernel/tools/perf/v5.9.0/perf-5.9.0.tar.gz 离线安装 tar -xvf perf-5.9.0.tar.gz cd perf-5.9.0 cd tools/perf/ make sudo cp perf /usr/local/bin检查 $ /usr/local/bin/perf --version perf…

linux 性能分析工具——perf

Perf 简介 Perf 是用来进行软件性能分析的工具。 通过它&#xff0c;应用程序可以利用 PMU&#xff0c;tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread)&#xff0c;也可以用来分析内核的性能问题&#xff0c;当然也可以…

专题:性能调优之工具---perf

1. Linux Perf简介 1.1 Perf是什么 Perf 是内置于Linux 内核源码树中的性能剖析&#xff08;profiling&#xff09;工具。它基于事件采样原理&#xff0c;以性能事件为基础&#xff0c;支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热…

perf基本使用与简单介绍

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言perf简单介绍常用命令格式perf listperf record/reportperf topperf statperf pr…

Linux perf 命令的使用(一)

文章目录 前言一、perf简介二、perf子命令简介三、perf工作模式3.1 计数3.2 采样 参考资料 前言 系统级性能优化通常包括两个阶段&#xff1a;性能剖析&#xff08;performance profiling&#xff09;和代码优化。 &#xff08;1&#xff09;性能剖析的目标是寻找性能瓶颈&…