首页 > 编程知识 正文

STM32固件库使用手册,stm32堆栈是怎么实现压栈的

时间:2023-05-04 07:12:01 阅读:119918 作者:1563

一、前言

虽然这里不讨论堆栈的定义,但是详细情况可以看到这个博客。

堆栈溢出会引起野针、返回地址错误等问题,通常导致程序无法正常运行,进入HardFault异常中断。 为了避免这一点,一般将大区域分配为堆栈,但如果只是为了安全而分配大区域的堆栈,则会导致内存的浪费。 本文介绍了获取堆栈最大消耗量的两种方法,以合理调整堆栈大小。

二、方法

1、方法1

堆栈指针SP指向的位置可以反映当前堆栈的消耗量。 在STM32中,堆栈向下增长,定期获取堆栈指针SP的值,比较得到最小值后表示堆栈的最大消耗量。 如何定期获取堆栈指针SP的值? 可以使用计时器产生周期性中断,通过中段函数获取堆栈指针SP的值。 最简单的方法是在系统的“滴答计时器”(SysTick )中断函数中调用堆栈分析函数。 具体请参照以下函数。 获取程序运行结束后的最大堆栈消耗量。

static uint 32 _ tmax _ stack _ usage=0x fffffff;

void堆栈_ parse (

{

int a=0;

if () uint 32 _ t (a max _ stack _ usage ) ) )。

{

max_stack_usage=(uint32_t ) a;

}

}

uint32_t get_max_stack_usage (

{

返回max _ stack _ usage;

}

由于该函数周期性地执行,必然影响程序的执行性能,但这是为了分析,最终将被删除。 另外,由于周期性执行,因此可能会忽略周期性堆栈,获取的数值不是最大值。 但是,这种方法仍值得借鉴。

2、方法2

在IAR中,可以启用“堆栈使用分析”(iarembeddedworkbenchstackusageanalysis ),以便IDE在编译链接时估计此程序堆栈的最大使用量。 但是,该方法不能使用函数指针分析调用的函数,也不能确定递归函数的嵌套次数。 因此,在这两种情况下,都需要使用配置文件来指定此调用的堆栈空间,这很麻烦。 具体请参照官方手册。 但是,函数指针和递归函数只是少数情况,大多数函数都是显示和调用的。 因此,IDE分析最长的调用路径,并分析堆栈使用量最多。 步骤如下。

1、打开optionslinkeradvancedenablestackusageanalysis

2、编译后,查看map文件的堆栈使用部分

内容如下。

* * * * * * * * * * * * * * * * *

* * *堆栈使用

***

callgraphrootcategorymaxusetotaluse

-------------请参阅

Program entry 8 600 8 600

未取消功能2561332

三.总结

堆栈用于存储局部变量、某些函数参数、返回地址、调用函数时保存主调函数的寄存器内容等。 为了减少堆栈的分配,必须注意不要在函数中放置大的局部数组。 之所以需要上述8600字节的堆栈空间,是因为程序中存在分配了8192字节数组的函数,如下所示:

(int decode _ sub frame _ LPC (FLAC context * s,int32_t* decoded,int pred_order ) ) ) ) ) ) ) )

{

int sum,I,j;

int64_t wsum;

int coeff_prec,qlevel;

int coeffs[2048]; //8k,use heap to save stack

int32_t* output;

int32_t* reader;

int* pcoeffs;

.

}

修改有两种方法。 第一,通过将名为coeffs的数据设为static局部静态变量,该变量可以从堆栈移动到. bss区域,但是该方式不灵活,占用相当于8192 B的区域,不能使用其他函数。 所以本质上和放在堆栈空间没什么区别。 其二,通过malloc方式灵活地申请并释放存储器,在不需要该部分的空间的情况下可以释放。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。