MCU 堆栈使用率的测试方法

2 篇文章 1 订阅
2 篇文章 0 订阅

一、背景

        一般来说堆栈的使用率概念是针对于操作系统,且操作系统一般都会有响应的接口直接调用查看。如果针对裸机程序的话,堆 Heap 的概念不存在了,只有栈 Stack 在使用,所以在此是针对栈的使用率测试。

二、背景知识

栈的生长方向是从上至下的,如下图所示:

图 - 1

栈顶地址,可以通过生成的 map 文件

在此以 IAR 生成的 map 为例,生成方法

图 - 2

再 选择  rebuild all ,即可在对应的文件夹找到 map 文件 ,打开找到

图 - 3

 

可得到 Stack Top :  0x2000'2c10 ,大小为 0x1000

三、测试方法

测试逻辑:MCU 在上电初始内存中的值是随机的,从 main 函数开始执行,在进入 main 的时候 Stack 的使用率是小的,那么就可以在 这个阶段将 一部分的 Stack 空间值初始化为固定的值(0x00 或者 0xFF 等等),此时并不熟影响程序的正常运行。

 

图 -  4

所以,首先指定一个 偏移地址 ,从偏移地址到 栈底之间的全部初始化为一个固定的值,如果后续程序执行,将会主动修改这些固定的值,这样只需要找到某个地址,该地址前一个地址为0xFF, 本地址为 0xFF, 如下所示:ADDR2 即为所求。(当然也会存在可能 程序运行时,被修改为 0xFF, 这种特殊情况暂不考虑,本质上也就相差 几个字节,对总体结果影响不大 )

图 - 5

 

void StackUsageRateTestFillInit(void)
{
    while (1)
    {
        if ( stackCheckAddr >= (stackTopAddr-stackOffsetAddr))
        {
            break;
        }
        else
        {
            *(UINT8*)stackCheckAddr = 0xFF;

            stackCheckAddr++;
        }
    }

    stackCheckAddr = 0x20000000;
}

 上述代码是将 图 - 4  灰色部分初始化

main 函数中调用

void StackUsageRateTest(void)
{

        if ( *(UINT8*)stackCheckAddr == 0xFF )
        {
            stackCheckAddr++;

            DEBUG(" stack addr + [ 0x%X ]", stackCheckAddr);
            
        }
        else
        {
            stackCheckAddr--;
            
            DEBUG(" stack addr - [ 0x%X ]", stackCheckAddr);
        }

}


int main(void)
{


	// 芯片初始化
    Init();

    StackUsageRateTestFillInit();

    while
    {
           StackUsageRateTest();

            // other task 
    }
}

 随着程序的运行,出现如下打印信息

 

那么最终可以确定,Stack Max Use 地址为 0x2000293F ,

栈深为 0x20002C10( Stack Top ) - 0x2000293F

栈的使用率为   StackMaxUse / StackTotal x 100%

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写代码混口饭吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值