中科蓝讯 ram.ld 文件浅析
中科蓝讯 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、中科蓝讯蓝皮书《芯片框架简述》
页:
[1]