打印
[STM32F1]

关于STM32如何使用堆空间

[复制链接]
819|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
857551877|  楼主 | 2020-8-26 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
你好,STM32的堆空间是用于动态内存分配的,那么在没有malloc等这些库函数时,如何使用堆空间去存储数据,有没有这方面的参考资料?

使用特权

评论回复
沙发
xuanhuanzi| | 2020-8-26 20:57 | 只看该作者
默认就行了。

使用特权

评论回复
板凳
xuanhuanzi| | 2020-8-26 20:57 | 只看该作者
我从来没修改过这些。

使用特权

评论回复
地板
857551877|  楼主 | 2020-8-26 21:04 | 只看该作者

你好,我的意思是:如和去使用heap这段内存空间而不是去设置它的大小

使用特权

评论回复
5
xuanhuanzi| | 2020-8-26 21:39 | 只看该作者
看关于单片机方面的书籍的时候,总是能看到别人说的一些堆栈啊什么的操作,之前看到这个术语就直接跳过,没想到去探究单片机内部的原理。但是最近课程学习微机原理这门课,需要我们写汇编程序,汇编里面经常遇到堆栈这个东西,所以就找了个时间把堆栈给彻底的搞一下。

  如果了解一点汇编编程话,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。通常用来保存CALL指令调用子程序时的返回地址,RET指令从堆栈中获取返回地址。中断指令INT调用中断程序时,将标志寄存器值、代码段寄存器CS值、指令指针寄存器IP值保存在堆栈中。

  堆栈也可以用来保存其他数据。

  堆栈操作由PUSH,POP两条指令来完成;

  堆栈操作的操作数均为子类型(两个字节)进行操作。

  程序内存可以分为几个区,栈区(stack),堆区(Heap),全局区(static),文字常亮区,程序代码区。

  程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。

  栈是从高到低分配,堆是从低到高分配。

  我们一般说的堆栈指的栈。堆栈又分硬堆栈和软堆栈,硬堆栈即SP,从片内RAM的顶部向下生长。软堆栈在硬堆栈跟全局变量区之间的空间,C51函数调用通过R0-R7和栈来实现。

  为什么单片机启动时,不需要用bootloader将代码从ROM搬移到RAM,而ARM则需要。这里我们可以先看看单片机程序执行的过程,单片机执行分三个步骤,取执行—分析指令----执行指令。取指令的任务是:根据PC的值从程序存储器读出指令,送到指令寄存器。然后分析执行执行。这样单片机就从内部程序存储器去代码指令,从RAM存取相关数据。要知道RAM取数的速度是远高于ROM的,但是单片机因为本身运行频率不高,所以从ROM取指令慢并不影响。而ARM不同,cpu运行的频率高,远大于从ROM读写的速度,所以一般有操作系统,都需要将代码部分拷贝到RAM中再执行。

  再来看一个网上很流行的经典例子:

  main.cpp

  int a = 0; 全局初始化区

  char *p1; 全局未初始化区

  main()

  {

  int b; 栈

  char s[] = “abc”; 栈

  char *p2; 栈

  char *p3 = “123456”; 123456/0在常量区,p3在栈上。

  static int c =0; 全局(静态)初始化区

  p1 = (char *)malloc(10); 堆

  p2 = (char *)malloc(20); 堆

  }

  不知道你是否有点明白了,堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。

  网上一个很好的比喻,摘抄下来,以便理解:

  使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

  使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

  总结:

  其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址(保护断点)和数据(保护现场)。

  如果非要给他加几个特点的话那就是:1、这些存储单元中的内容都是程序执行过程中被中断打断时,事故现场的一些相关参数。如果不保存这些参数,单片机执行完中断函数后就无法回到主程序继续执行了。

  2、这些存储单元的地址被记在了一个叫做堆栈指针(SP)的地方。

使用特权

评论回复
6
tangzw688| | 2020-8-27 13:53 | 只看该作者
有关堆栈的解说,读了受益匪浅。

使用特权

评论回复
7
diweo| | 2020-8-27 16:45 | 只看该作者
你使用动态内存空间的出发点是什么?

使用特权

评论回复
评论
diweo 2020-8-28 16:19 回复TA
@857551877 :这个属于很专业的范围了,了解的人应该不多。 
857551877 2020-8-27 19:54 回复TA
我知道一种使用大数组的方式去实现内存管理,但是这种方式并不是真正malloc的实现方法,我想弄清楚malloc这种函数究竟是如何去申请堆中的空间的, 
857551877 2020-8-27 19:52 回复TA
我想了解这些内存管理的思想,了解这些底层的实现,而不是停留在只会用别人的接口。 
8
zchong| | 2020-8-28 21:27 | 只看该作者
不用malloc,那还用堆干什么?是要自己实现malloc功能?还是就是一段内存,你想用起来?如果这样就简单了,知道地址和长度,用指针去处理就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝