本文以TLSR8258为例,针对ram使用进行分析。8253和8250对RAM的计算是一样的,只不过RAM大小不同而已。

芯片型号RAM size起始地址结束地址
TLSR825864K0x8400000x850000
TLSR825348K0x8400000x84c000
TLSR825132K0x8400000x848000

一. RAM剩余大小

    在Telink IDE中编译8258_module例程,生成了8258_module.lst文件(和8258_module.bin在同一目录),截取关注的内容如下:

lst文件说明:

  • Idx Name:段名称
  • Size:本段所占字节大小
  • VMA:实际运行地址
  • LMA:在flash中的存储地址

    剩余RAM空间 = (RAM的结束地址) - (bss段的最后一个字节的地址) - (system stack空间)

    system stack空间,是从RAM的结束地址处开始,往前增长使用的,一般为256bytes,但对于mesh的堆栈要求预留量要不小于512。system stack空间会根据用户在函数嵌套的层次,以及局部变量大小进行变化的,所以system stack空间大小需要实际调试后才能准确知道(具体见RAM溢出章节)。根据上图分析,8258_module的剩余RAM = 0x850000 - (0x844910 + 0x255)- 0x100 = 0x850000 - 0x844b65 - 0x100 = 0xB39B = 44.9K

二. RAM溢出判断

    RAM溢出的原因是堆栈的使用超过了剩余RAM区域,而越界使用了BSS区或者其他RAM区导致系统崩溃。在本系统中,有两个堆栈区,一个是system stack,另一个是irq stack。堆栈的使用是不确定的,主要取决于实际运行过的函数调用的深度和函数中使用局部变量的大小。

2.1. 判断system stack是否溢出

    一个简单方式是:剩余RAM size(也就是RAM的末尾地址 -  bss的最后一个字节的地址),要大于512, 这个是经验值判断。

    另一个方式是:测试完所有的功能后,在BDT工具输入下面的cmd:8258 rc 840000 -s 64k -o "d:\828_ram.bin" 查看bss末尾地址之后是否还有连续的0xFF区域(system stack初始值为0xFF),如果有,则表示RAM没有溢出。

第二种方式如何做呢?具体方法如下:

(1)设置RAM初始化

因为8258的RAM空间为64K大小,若把RAM重新初始化一遍,则耗时太长。为了低功耗考虑,sdk中并没有把RAM都初始化为0xFF,所以在研发调试阶段可以手动配置RAM初始化,再查看RAM是否溢出。

首先查看8258_module例程使用的启动文件,project --> properties,在弹出的窗口中查看,如下图使用的启动文件为:-DMCU_STARTUP_8258_RET_16K