目录
1.链接文件有什么用?
2.文件结构和语法解析
2.1 文件结构
2.2 语法解析
3.小结
玩惯了ld文件,突然让搞lsl文件,被其中花里胡哨的语法搞晕了,例如:
memory cpu0_dlmu
{
mau = 8;
size = 64k;
type = ram;
map cached (dest=bus:sri, dest_offset=0x90000000, size=64k);
map not_cached (dest=bus:sri, dest_offset=0xb0000000, size=64k,priority=8);
}
1.链接文件有什么用?
确定当前目标处理的内核硬件架构,例如逻辑地址和物理地址的偏移等; 确定当前系统的memory位置,例如RAM、ROM首地址和长度等; 确定代码数据放到memory的什么位置,这也是我们主要关心的点,控制数据代码到指定位置;
2.文件结构和语法解析
2.1 文件结构
内核架构的定义:帮助linker将目标内核的逻辑地址转换为物理地址,可能还包括中断向量表、栈的定义等,一般来说编译器会把这个定义好,例如tc1v1_6_2.lsl; 派生的定义:主要是用于描述内部总线定义、memeory定义等; 处理器的定义:用于定义单核还是多核,以及对应内核实例 段的定义:控制自定义段的具体位置
2.2 语法解析
mau:Minimal Addressable Units,最小可寻址单元,对Tricore来说就是1 byte,对应数字 8; type:指定memory类型,常见的如rom,ram,nvram(任意时刻都可以修改),blockram map:该关键字将源地址转为目的地址,具体映射关系如下:
space => space space => bus bus => bus memory => bus
memory mem_name
{
type = xx;
mau = xx;
size = 64k;
map map_name ( map_description );
}
memory dsram0 // Data Scratch Pad Ram
{
mau = 8;
size = 240k;
type = ram;
map (dest=bus:tc0:fpi_bus, dest_offset=0xd0000000, size=240k, priority=8);
map (dest=bus:sri, dest_offset=0x70000000, size=240k);
}
map (dest=bus:tc0:fpi_bus, dest_offset=0xd0000000, size=240k, priority=8)
map (dest=bus:sri, dest_offset=0x70000000, size=240k);
memory cpu0_dlmu
{
mau = 8;
size = 64k;
type = ram;
map cached (dest=bus:sri, dest_offset=0x90000000, size=64k);
map not_cached (dest=bus:sri, dest_offset=0xb0000000, size=64k);
}
section_setup ::my_space
{
reserved address range
stack definition
heap definition
copy table definition
start address
space reference restrictions
input section modifications
section reference restrictions
MPU data table
}
group (run_addr = mem:A/map_name)
3.小结
首先定义一块memory,使用语法memory name{ },指定map地址,mau,size; 在section_layout里用group定义运行地址,如有必要定义加载地址; 代码里在待处理的数据或者代码前后添加限定符#pragma,或者__attribute__ ((section ".name"))