单片机的存储、堆栈与程序执行方式

一、单片机存储区域

如图所示位STM32F103ZET6的参数:
单片机的ROM(内部FLASH):512KB,用来存放程序代码的空间。
单片机的RAM:64KB,一般都被分配为堆、栈、变量等的空间。
在这里插入图片描述

二、堆和栈的概念

单片机中的堆和栈是用来存储程序运行时的数据的两个重要区域。堆和栈都存在于单片机的RAM(随机存储器)中。
堆是用来存储动态分配的内存空间的区域。在单片机中,堆的大小取决于程序的需求,但是总大小不能超过单片机硬件的实际RAM大小。堆的分配和释放是由程序员手动控制的,通常使用malloc()和free()等函数来进行操作。
栈是用来存储函数调用和局部变量的区域。每当一个函数被调用时,函数的参数、返回地址和局部变量等信息都会被压入栈中。当函数执行完毕后,这些信息会被弹出栈。栈的大小是由编译器在编译时确定的,通常是根据函数的嵌套深度和局部变量的大小来决定的。
堆和栈都是用来存储程序运行时的数据的区域,但是它们的分配和使用方式有所不同。

三、堆和栈的位置与分配方式

堆栈位置

在这里插入图片描述
栈:向低地址扩展,从上往下扩展;
堆:向高地址扩展,从下网上扩展;
设置堆栈的空间大小时要根据程序需求合理调整,如果堆或栈的空间分配不足,导致堆栈溢出,程序跑飞。

合理分配堆栈

可以通过编译后生成的后缀为.htm的文件查看所需的栈的大小:
在这里插入图片描述

如图所示为某程序的.htm文件的内容:
最大的栈空间=800bytes+未知
未知的空间去800的20%就足够了。
那么栈空间的大小可以设置为800+160=960byte

堆的分配和释放是由程序员手动控制的,通常使用malloc()和free()等函数来进行操作。栈空间的大小根据我们在程序中分配的最大的堆的大小来决定。当然,最好也预留一些预留,如果在程序中分配了100byte,那么,可以设置堆大小为110bytes。

四、案例分析

打开KEIL工程中的Map File文件后,在文件内容最下方可以看到如下统计。

在这里插入图片描述
图中,各代号含义如下,
Code:代码存储区。这部分是存放代码的。
RO-Data:只读数据区。这部分保存程序中用 const 定义的全局常量数据和字符串。
RW-Data:已初始化的读写数据。程序中定义的已经初始化的全局变量和静态变量。
ZI-Data:未初始化的读写数据。程序中定义的未初始化的全局变量和静态变量。这部分内容是在程序运行的时候保存在RAM中的。
在这里插入图片描述

五、STM32堆栈设置

在这里插入图片描述

六、PC指针与SR指针

SP(Stack Pointer,堆栈指针寄存器)
堆栈是一个用于存储临时数据和函数调用信息的数据结构。SP 指向堆栈的当前顶部,当数据被推入或弹出堆栈时,SP 会相应地递减或递增。

PC(Program Counter,程序计数器)
概念:程序计数器通常有32位或64位,能表示232或264个内存地址,程序计数器某一时刻只能存储一个地址,该地址指向下一条将要执行的指令。
功能:是控制指令执行流程的关键,确保指令按照正确的顺序执行。

单片机程序执行过程:
1、首先开辟堆栈:初始化堆栈指针 SP
2、初始化程序计数器指针:初始化 PC 指针
3、从FLASH启动,执行程序:
单片机上电复位后实际上是执行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/313164.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

填充点云孔洞(较大的洞)halcon算法

前言 很多时候,一些小洞可以通过平滑算法,或者三角化算法的参数调整,即可对较小的孔洞进行填充,但是较大的洞却很难通过上面的算法进行填充。 下面介绍一种填充孔洞的思路: 步骤一:对点云进行滤波处理,找到孔洞所在平面 本文为了更直观的进行讲解,去掉了去除噪声和…

大一c语言期末复习题

第16题&#xff1a; 答案&#xff1a; #include<stdio.h> void hello_world(void) {printf("Hello,world!\n"); } void three_hellos(void) {int i 0;for (i 0; i < 3; i) //调用3次函数{hello_world();} } int main() {three_hellos();return 0; } 知…

金融帝国实验室(Capitalism Lab)官方正版游戏『2024新年特卖优惠』

「金融帝国实验室」&#xff08;Capitalism Lab&#xff09;Enlight 官方正版游戏「2024新年特卖」 ■优惠时限&#xff1a;2024.01.01&#xff5e;01.31 ■游戏开发商&#xff1a;Enlight Software Ltd. 请您认准以下官方正版游戏购买链接&#xff1a;支持“支付宝&am…

Conv2Former:一种transformer风格的卷积特征提取方式

一、前言 昨天读到了一篇有意思的文章&#xff0c;文章提出通过利用卷积调制操作来简化self-attention。还证明了这种简单的方法可以更好地利用卷积层中嵌套的大核(≥7 7)。我们都知道ViTs推动了设计识别模型的发展&#xff0c;近几年使用的也相当的多&#xff0c;通常就是CN…

你逛过凌晨四点的校园吗?--大四毕业生的年终总结

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 又是一年的年终总结&#xff0c;我也迎来了自己的毕业季&#xff0c;没错&#xff0c;我马上要毕业啦&#xff01;不知道大家是什么时候认识我的呢&#xff0c;又或者是第一次发现我~这一年&#xff0c;迎接过朝阳、拍下过…

Linux:apache优化(1)—— 长链接/保持连接

系统:CentOS 7.9 apache版本为&#xff1a;2.4.25 需要使用源码包进行安装才能够使用这些扩展模块 在使用这些扩展模块前要先下载zlib-devel 安装--enable-deflate选项需要的网页压缩传输的软件包 yum -y install zlib-devel 在配置编译安装时需要使用扩展配置 ./config…

使用ChatGLM3自定义工具实现大模型查询MySQL数据库

ChatGLM3-6B 采用了全新设计的 Prompt 格式&#xff0c;除正常的多轮对话外。同时原生支持工具调用&#xff08;Function Call&#xff09;、代码执行&#xff08;Code Interpreter&#xff09;和 Agent 任务等复杂场景。 什么是工具调用 大模型虽然强大&#xff0c;但是由于…

java struts2教务管理系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java struts2 教务管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 struts2 框架开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库…

【数据结构-单链表】(C语言版本)

今天分享的是数据结构有关单链表的操作和实践&#xff08;图解法&#xff0c;图变化更利于理解&#xff09; 记录宗旨&#x1f4dd;&#xff1a; 眼&#xff08;脑&#xff09;过千遍&#xff0c;不如手过一遍。 我们都知道单链表是一种常见的链表数据结构&#xff0c;由一系列…

泽攸科技PECVD设备助力开发新型石墨烯生物传感器

近日&#xff0c;松山湖材料实验室许智团队与清华大学符汪洋合作在纳米领域头部期刊《Small》上发表了一项引人注目的研究成果&#xff0c;题为“Ultrasensitive biochemical sensing platform enabled by directly grown graphene on insulator”&#xff08;硅晶圆上直接生长…

34--JDK8新特性

1. Java版本迭代概述 1.1 发布特点&#xff08;小步快跑&#xff0c;快速迭代&#xff09; 发行版本 发行时间 备注 Java 1.0 1996.01.23 Sun公司发布了Java的第一个开发工具包 Java 5.0 2004.09.30 ①版本号从1.4直接更新至5.0&#xff1b;②平台更名为JavaSE、JavaE…

[每周一更]-(第49期):一名成熟Go开发需储备的知识点(答案篇)- 2

答案篇 1、Go语言基础知识 什么是Go语言&#xff1f;它有哪些特点&#xff1f; Go语言&#xff08;也称为Golang&#xff09;是一种由Google开发的开源编程语言。它于2007年首次公开发布&#xff0c;并在2012年正式推出了稳定版本。Go语言旨在提供简单、高效、可靠的编程解决…