谷动谷力

 找回密码
 立即注册
查看: 417|回复: 0
打印 上一主题 下一主题
收起左侧

中科蓝讯 ram.ld 文件浅析

[复制链接]
跳转到指定楼层
楼主
发表于 2024-9-11 23:52:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
中科蓝讯 ram.ld 文件浅析

今天对中科蓝讯 AB530x SDK 的 ram.ld 文件进行一个大致的分析。 大家可以在本文介绍的同时结合 ram.ld 文件、map.txt 文件两个一起看,方便理解。 希望对大家了解中科蓝讯的储存分配有所帮助。
1、ENTRY 命令
ENTRY 命令将符号 _start 的值设置为入口地址,入口地址是进程执行的第一条指令在进程地址空间的地址(比如, ENTRY(Reset_Handler) 表示进程最开始从复位中断服务函数处执行)。
2、MEMORY 命令:

MEMORY 命令分配了内部 Flash 和 RAM 的起始地址和大小,如 init 就是其中一个区,起始地址为 __base,大小为 512 字节;
注意,这些区的起始地址并不是自上而下按各区大小递增的。
3、SECTIONS 命令
先看如下两个图,图一是 SECTIONS 命令的具体内容可查看 ram.ld 文件; 图二是链接结果,可在路径 app\projects\standard\Output\bin 下找到 map.txt 文件打开:

注意,以下的介绍将用中文数字一、二、三....... 来表示上图二中的圆圈数字;
    1)A 对应 一 为输出区的名字; B、C、D 中的字母名均为 MEMORY 命令定义的内存区,它们在 MEMORY 的名字是任意取的; yi
    2)B 中加上符号“>”意思是,输出区 .init 链接到 MEMORY 命令定义的内存区 init。 注意,输出区的名字不一定和链接到的 MEMORY 命令定义的内存区同名,MEMORY 命令定义的内存区如果可以复用则可能被多个输出区链接,这些输出区的名字是不同的,如 cram 区被多个输出区链接;
    3)二为输出区 .init它链接的MEMORY 命令定义的 init 内存区的起始地址; er
    4)*(.reset) 将工程中所有目标文件的 .reset 段链接到输出区 .init 中;
    5)三是输出区 .init 使用的总大小; 四是段 .reset 使用的空间大小; sa
    6)五照应 ld 文件最开始的语句 ENTRY(_start) 可知入口地址是 0000000010000000x<>;
    7)比较二和六的大小可知,SECTIONS 命令内的区不是按地址大小自上而下链接; e
此处需要说明一个链接规则:SECTIONS 命令内后面的输出区若有与前面的输出区同名的段,后面的输出区的同名段将不再链接,这可以作为解决区溢出问题的思路之一。 如下,在输出区 .comm(此输出区在 SECTIONS 命令中比输出区 .bss 靠前)有与输出区 .bss 同名的段 .dac_obuf:

如上本小节图一所示输出区 .comm 新增的语句 *(.dac_obuf) 的意思是将所有目标文件的段 .dac_obuf 链接到输出区 .comm。
查看 map.txt 链接文件,可见输出节 .bss 中的段 .dac_obuf 没有再开辟空间;
    8)八标志着段 .com_text.bb.btisr 的起始,九(000000000001) 000x0e8 是十一strong_symbol.o 目标文件段 .com_text.bb.btisr 的起始地址,十 0x8是该目标文件占用的大小,十二是该目标文件下使用内存的函数名;
    9)十三是目标文件 bb.o 段 .com_text.bb.btisr 的起始地址; .sh
    10)SECTIONS 命令中区的复用(以 cram 为例,起始地址为 0x2b800,大小 18k = 18432)


  
  
在一个程序周期内,同一时序不会同时用到的代码,就可以拿来做复用到同一个内存区(MEMORY 命令中定义的区)。
上图可见,几个输出区的起始地址是一样的;
cram 复用做 flac 解码,upd 或串口升级代码,fcc 测试缓存,fota无线升级,wma 解码,mp3 压缩等,这些操作都不是同一时序进行的。 从这两个图看出 cram 区复用的输出区起始地址都是一样的,这个也可以作为一个解决区溢出的思路。
4、ram.ld 文件的最后描述的是 comm 和 bcomm 区需加载的代码在 flash 中的地址和大小:
实际在内部加载 comm 区是 memcpy 直接把代码从 flash 中拷贝到 ram 中实现的。
对中科蓝讯 AB530x SDK 的 ram.ld 文件的介绍就到这里,希望对大家了解中科蓝讯的储存分配有所帮助。 如有错误欢迎大家批评指正。 如果大家还有什么其他的问题或者功能想要询问,亦可以在评论区中提出,可以共同探讨,一起进步。
参考文档:
1、CSDN《中科蓝讯蓝牙:RAM使用,ram.ld文件和map.txt文件的查看》
2、中科蓝讯蓝皮书《芯片框架简述》




+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-9-30 06:34 , Processed in 0.156111 second(s), 44 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表