泰凌微蓝牙芯片8267 SRAM剩余大小以及是否溢出----分析计算方法

以下数据以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没有溢出。如下图:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值