STM32的堆和栈

1.前言

本博客讨论的堆栈是内存分配的堆和栈,并不是数据结构中的堆栈。
C语言内存分配可以看下这篇文章

2.栈

(stack)作用是用于局部变量、函数形参、函数调用时的现场保护和返回地址,以及进入中断函数前和中断嵌套等的开销。这部分内存是由编译器自动申请和释放的。

特点:先入后出

2.1栈的分类

根据最后指针指向内存是否有数据可以分为

空栈:SP指针指向最后压入数据的后一个地址。新数据压栈时,先写入地址,指针+1(-1)PS:指针是+1还是-1需要看栈的生长方向。

在这里插入图片描述

满栈:SP指针指向最后压入的数据。先指针+1或-1,再写入数据。
在这里插入图片描述

根据栈的生长方向可以分:
递增式:栈地址由低地址向高地址生长
在这里插入图片描述

递减式:栈地址由高地址向低地址生长
在这里插入图片描述

对于STM32F1而言是递减式满栈。
我们可以看下栈定义:

Stack_Size		EQU     0x400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

栈的大小是0x800也就是2kB。如果定义一个1024字节的局部变量数据,就占了1/2个栈空间了,再进进中断实现嵌套很容易出现栈溢出的hardfaul。所以大数组不适合定义成局部变量放在函数中。

3.堆

(Heap)主要用来动态分配内存

Heap_Size      EQU     0x200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

堆的大小:0x200,这部分是程序员可以自己动态申请和释放的。在裸机中可以调用malloc()free()来申请和释放。有RTOS操作系统的一般会提供动态内存分配的方案。

4.堆栈溢出

堆栈在内存中分配如下图所示:
在这里插入图片描述

由于STM32中Stack空间是向下生长的,HEAP空间是向上生长的。如果malloc过多内存,会出现内存申请失败。或者子函数中有大数组,经过几次嵌套会出现栈空间向下溢出,导致程序崩溃。
解决方法:
方案一:在stm32f103ex.s文件定义增加栈空间的大小。
方案二:定义成全局变量
方案三:使用动态内存的方法放在堆空间中,这样至少在嵌套的时候不断被编译器的被压入栈空间。

参考文章

https://blog.csdn.net/qlexcel/article/details/78916934
https://www.cnblogs.com/yangrourou/p/15883009.html

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
昨天看了坛友的推荐,发现MicroPython开发板的确很不错。功能比Arduino强,使用也很灵活。淘宝上microPython开发板很少,价格也很高,都是200以上。因此,考虑到价格原因,加上板上元件不多,网友假如自己DIY完成的话,起码可以节约70%以上成本。故将其所有资料开源。官方网站:micropython.org Micro Python的硬件特点: STM32F405RG MCU. 168 MHz Cortex-M4 CPU with 32-bit hardware floating point. 1 MiB flash storage, 192 KiB RAM. USB口, 支持 串口,通用存储,HID协议。 SD卡插槽。 MMA76603轴加速度计. 4 LEDs, 1复位按钮, 1通用按钮. 3.3V0.3A板载 LDO , 可从USB口或者外置电池供电。 实时时钟。 30个通用IO口,其中28个支持5V输入输出。 2个 SPI接口, 2个 CAN接口, 2个I2C接口, 5个USART接口. 14个 12-bit ADC引脚。 2个DAC 引脚。 Micro Python的软件特点: Python 3 语法. 完整的Python词法分析器, 解析器,编译器,虚拟机和运行时。 包含命令行接口,可离线运行。 Python 字节码由内置虚拟机编译运行. 有效的内部存储算法,能带来高效的内存利用率。整数变量存储在内存中,而不是中。 使用Python decorators特性,函数可以被编译成原生机器码,虽然这一特性会带来大约2倍的内存消耗,但也使python有更快的执行速度。 函数编译可设置使用底层整数代替python内建对象作为数字使用。有些代码的运行效率可以媲美c的效率,并且可以被python直接调用,适合做时间紧迫性,运算复杂度高的应用。 通过内联汇编功能,应用可以完全接入底层运行时,内联汇编器也可以像普通的python函数一样调用。 基于简单和快速标记的内存垃圾回收算法,运行周期少于4ms,许多函数都可以避免使用内存段,因此也不需要垃圾回收功能。 MicroPython开发板入门图说明: MicroPython开发板原理图截图:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柒妖71

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

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

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

打赏作者

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

抵扣说明:

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

余额充值