以下数据以8267为例(8266和8267对RAM的计算是一样的),8267的RAM size是16K byte。RAM的起始地址是0x808000,末尾地址是0x80C000
- RAM剩余大小
根据编译器生成的light_8267.lst文件(和bin文件在同一个目录) 分析如下:
Idx Name: 段名称
Size:本段所占字节大小
VMA:实际运行地址
LMA:在flash中的存储地址
剩余RAM = RAM的末尾地址 - bss的最后一个字节的地址。
根据上图分析,这个firmware的剩余RAM = 0x80C000 – (0x809a90 + 16d0) = 0xEA0 = 3.7K
需要注意的是剩余RAM,并不都能直接进行使用,这段剩余RAM还要分配一段区间给system stack使用(对于mesh的堆栈要求预留量要不小于512)。也就是说在这个firmware中,真正能使用的RAM约为3.2K。
RAM溢出的判断:
RAM溢出的原因是堆栈的使用超过了剩余RAM区域,而越界使用了BSS区或者其他RAM区导致系统崩溃。
在本系统中,有两个堆栈区,一个是system stack,另一个是irq stack。
堆栈的使用是不确定的,主要取决于实际运行过的函数调用的深度和函数中使用局部变量的大小。
判断system stack是否溢出:
一个简单方式是:剩余RAM size(也就是RAM的末尾地址 - bss的最后一个字节的地址),要大于512, 这个是经验值判断。
另一个方式是:测试完所有的功能后,在wtcdb工具输入.\tcdb.exe rc 80b000 -s 4k查看bss末尾地址之后是否还有连续的0xFF区域(system stack初始值为0xFF),如果有,则表示RAM没有溢出。如下图。其中80B000+0xEFC 就是当前运行情况下的堆栈最大使用位置。
判断irq stack是否溢出
Irq stack是中断函数使用的,目前配置的大小是IRQ_STK_SIZE, 0x300,(这个size不建议客户更改),所有的中断回调函数也都将使用这个堆栈。所以客户应避免在中断回调函数中定义很大的局部变量。
判断irq stack和判断system stack的第二个方法类似,在执行完所有的功能后,在tc debug中查看irq_stk这个buf是否还有连续的0x00区域(irq stack初始值为0x00),如果有,则表示RAM没有溢出。如下图: