首页 > 编程知识 正文

stm32自制堆栈,stm32单片机工作原理

时间:2023-05-05 11:27:31 阅读:119922 作者:1333

学习STM32单片机的时候,总是能遇到“堆栈”这个概念。

稍微了解汇编编程的人可以知道堆栈是内存中的连续存储区,用于存储临时数据。 堆栈操作通过推式、POP两个命令进行。 程序存储器可以分为几个区域。

堆栈区域(堆栈)堆区域(Heap )全局区域(static )字符常亮区域程序代码区域程序编译后,全局变量、静态变量已经分配了内存区域,函数执行时本地变量出现中断时需要将函数指针放入堆栈中,保护现场,使其能够在中断处理结束后返回以前执行的函数。

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

普通单片机与STM32单片机中堆栈的区别

正常的单片机启动时,bootloader不需要将代码从ROM移动到RAM。 但是,需要STM32单片机。

现在,我们先来看看单片机程序的运行过程。 单片机的运行分为三个步骤。

取指令分析指令执行指令的指令,根据PC的值从程序存储器读取指令,发送到指令寄存器。 然后分析执行。 由此,单片机从内部程序存储器中删除代码指令,并通过RAM访问相关数据。

RAM的提取速度远远高于ROM,但普通的单片机本身运行频率不高,所以ROM的指令提取速度慢并不影响ROM的提取速度。

STM32中的CPU运行的频率远远高于从ROM读取和写入数据的速度。 必须在引导装载器中将代码从ROM移动到RAM。

使用堆栈,就像我们去饭馆吃饭,只是点菜,付钱,吃,吃饱了就走。 不需要在意切菜、洗等准备,也不需要在意洗碗、刷锅等善后工作。 他的好处很快,但自由度很小。 使用堆就像自己做自己喜欢的菜一样,虽然很麻烦,但是符合自己的喜好,自由度很高。

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

如果必须给他增加一些特征的话,那个如下。

这些存储单元的内容是有关在程序运行期间中断时事故现场的参数。 如果不保存这些参数,单片机运行中断函数后,就无法返回主程序继续运行。 这些存储单元的地址记录在一个称为堆栈指针(SP )的位置。结合STM32的开发讲述堆栈

从上面的说明可以看出,代码中是如何占用堆和堆栈的。 虽然可能还有很多人还不能理解,但是这里还将结合STM32开发过程中的堆栈相关内容进行说明。

如何设置STM32的堆栈大小?

基于MDK的启动文件的开头是用于分配堆栈大小的程序集代码。

这里重点知道堆栈数值的大小就可以了。 AREA (区域),指示已分配堆栈数据段。 您可以自行修改数字大小,也可以使用STM32CubeMX数字大小放置。 请参照下图。

STM32F1的默认设置为0x400,即1K大小。

函数体内局部变量:

局部变量总共占用256*4 1字节的堆栈空间。 因此,如果函数中有很多局部变量,则需要注意是否超出了我们配置的堆栈大小。

函数参数:

这里要强调的是,传输指针只占4字节,在传输结构体时占用结构体大小的空间。 提示:如果函数是嵌套的和递归的,则系统占用堆栈空间。

“堆”(Heap )的默认设置为0x200(512 )字节。

大多数人应该很少使用malloc分配堆空间。 只要程序员不释放空间,就可以访问堆上的数据,但如果忘记释放堆内存,则可能会导致内存泄漏或致命的潜在错误。

MDK中RAM占用大小分析

经常在线调试的人可能会分析基础内容。 现在,我们结合MDK-ARM来分析RAM占用大小的问题。 编译MDK后,将显示RAM大小信息。

其中4 6=1640,转换为十六进制则为0x668。 进行调试后,如下所示。

这个MSP是主堆栈指针,一般是我们重置后指向的位置,重置实际上是堆栈顶部:

MSP的地址0x20000668从0x20000000偏移0x668。 具体哪个位置占用RAM,请参考map文件的【Image Symbol Table】内容。

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