本文要使用到的软件:Ubuntu(X86)、Keil MDK、串口调试助手
本文要使用到硬件:STMF103C8T6、USB转串口、杜邦线若干、LED灯

目录

  • 一、变量存储重温
    • 1.1 栈
    • 1.2 堆
    • 1.3全局区(静态区)
    • 1.4文字常量区
    • 1.5程序代码区
  • 二、STM32内存分配
    • 2.1 ROM,Read-Only Memory
    • 2.2 RAM,Random-Access Memory
  • 三、编程验证
    • 3.1 Ubuntu下验证存储
    • 3.2 Keil下验证
  • 四、总结

提示:以下是本篇文章正文内容,下面案例可供参考

一、变量存储重温


一般来说C/C++程序占用的内存分为以下几个部分:

1.1 栈

基本内容

  • 栈区由编译器自动分配释放,操作系统自动管理,不需要程序员手动管理。

  • 栈区中的内容只在函数范围内存在,当函数运行结束时,这些内容自动被系统销毁

  • 栈区按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。

  • 栈区是先进后出原则,即先进去的被堵在屋里的最里面,后进去的在门口,释放的时候门口的先出去。

  • 栈区与数据结构中的栈是两回事,注意区分

包含内容

  • 函数的返回地址参数
  • 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。

特点

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

1.2 堆

主要内容

  • 堆区,一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意,它与数据结构中的堆是两回事。
  • 堆区按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。

特点

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

重要函数

获得堆内存malloc()
动态分配堆内存

原型extern void *malloc( unsigned int num_bytes)

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放

malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针.

1.3全局区(静态区)

主要内容

  • 通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量
  • 全局区有 .bss段.data段组成,可读可写。

.bss段

  • 未初始化全局变量和未初始化的静态变量存放在.bss段。
  • 初始化为0全局变量和初始化为0的静态变量存放在.bss段。
  • .bss段不占用可执行文件空间,其内容由操作系统初始化。

.data段

  • 已初始化全局变量静态变量存放在.data段。
  • .data段占用可执行文件空间,其内容由程序初始化

1.4文字常量区

  • 字符串、数字等常量存放在常量区。
  • const修饰的全局变量存放在常量区。
  • 程序运行期间,常量区的内容不可以被修改

1.5程序代码区

  • 程序执行代码存放在代码区,其值不能修改(若修改则会出现错误)。
  • 字符串常量define定义的常量也有可能存放在代码区。

二、STM32内存分配

2.1 ROM,Read-Only Memory

基本介绍

只读存储器ROM,只能读出不能写入信息,ROM所存数据通常是装入整机前写入的,信息一旦被写入就固定下来,所有又叫做固定存储器

特点

  • ROM只能读出不能写入信息,通常在我们的ROM里固化一个基本输入/输出系统,称为“BIOS(基本输入输出系统)”。完成对各功能模块的初始系统输入/输出的驱动程序。
  • 由于断电后数据不丢失,所以ROM一般作为固件,存放硬件的驱动程序

区域地址

  • 从0x8000000,大小为0x10000,该片为只读区域,存放代码区和常量区

2.2 RAM,Random-Access Memory

基本介绍

随机存取存储器,也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写,速度很快,作为操作系统或其他运行中的程序的临时数据存储介质。

特点

  • 容易丢失
    它与RAM最大的区别是数据的易失性,当断电时,不能存储数据。
  • 访问速度快
    随机存取存储器是所有访问设备写入和读取速度最快的。
  • 随机存取
    当需要读取或写入数据时,所需时间与信息所在位置无关,若顺序访问时,所需时间与位置有关。主要用来存放操作系统、应用程序、数据。

区域地址

  • 从0x20000000开始,大小为0x5000,该片区域时可读写区域,存放的是全局(静态)区、堆区和栈区

三、编程验证

编写程序

#include<stdio.h> //printf函数
#include<stdlib.h> //用于分配堆区
#include<string.h> //用于字符串处理//全局变量
int undef_x;//未初始化的全局变量
int def_global_x=1;//初始化的全局变量
static int undef_y;//未初始化的静态变量
static int def_global_y=2;//初始化的静态变量//常量区
const int undef_z;//const(只读)修饰未初始化全局变量
const int def_global_z=3;//const修饰初始化全局变量int main()
{//栈区int undef_lila;//未初始化的局部变量int def_lila=4;//初始化的局部变量char def_lilgroup[10]="isyuuun";//初始化的局部数组const int undef_lilc;//未初始化的局部只读变量const int def_lilc=5;//初始化的局部只读变量//堆区int *p1=malloc(4);int *p2=malloc(4);//全局区static int undef_lilb;//未初始化的局部静态变量static int def_lilb=6;//初始化的局部静态变量//常量区char *var1="63190703";char *var2="cqjtu";//输出函数printf("\n*****栈区-变量地址*****\n");printf("未初始化局部变量        :0x%p\r\n",&undef_lila);printf("已初始化局部变量          :0x%p\r\n",&def_lila);printf("已初始化局部数组            :0x%p\r\n",def_lilgroup);printf("未初始化局部只读变量       :0x%p\r\n",&undef_lilc);printf("已初始化局部只读变量        :0x%p\r\n",&def_lilc);printf("\n*****堆区-动态申请地址*****\r\n");printf("已初始化局部int型指针变量p1   :0x%p\r\n", p1);printf("已初始化局部int型指针变量p2   :0x%p\r\n", p2);printf("\n*****全局区-变量地址*****\n");printf("未初始化全局变量     :0x%p\r\n",&undef_x);printf("未初始化静态变量     :0x%p\r\n",&undef_y);printf("未初始化只读变量     :0x%p\r\n",&undef_z);printf("已初始化全局变量     :0x%p\r\n",&def_global_x);printf("已初始化静态变量        :0x%p\r\n",&def_global_y);printf("未初始化局部静态变量   :0x%p\r\n",&undef_lilb);printf("已初始化局部静态变量    :0x%p\r\n",&def_lilb);            printf("\n*****常量区地址*****\n");printf("已初始化只读变量         :0x%p\r\n",&def_global_z);printf("已初始化局部指针变量      :0x%p\r\n",var1 );printf("已初始化局部指针变量      :0x%p\r\n",var2 );printf("\n*****代码区地址*****\n");printf("程序代码区main函数入口地址   :0x%p\n", main);free(p1);free(p2);}

3.1 Ubuntu下验证存储

  • Ubuntu具体编程步骤可看我另一篇博客:点这里
  • 运行后的结果如下图

  • 分析
    观察栈区:地址由上到下逐渐增大
    观察堆区:地址由上到下逐渐增大
    代码区往上每个区相对下面的区地址逐渐增大
    栈区相对整体地址最大

3.2 Keil下验证

我们首先生成.HEX文件烧录到STM32F103C8T6芯片中,利用串口传输信息。

  • 工程文件及程序

  • 烧录成功

  • 分析
    栈区:从上到下依次减小
    堆区:从上到下依次增大
    代码区往上每个区相对下面的区地址逐渐增大
    栈区相对整体地址最大
    符合存储器规律。

四、总结

回顾熟悉内存变量的存储内容以及其相应的特点后,对于我们定义好的变量会有更深刻的理解,内存每个区域的地址值的划分也需要我们了解。


参考文章:
内存分配介绍:https://blog.csdn.net/MQ0522/article/details/114823770
RAM、ROM区别:https://www.php.cn/faq/465507.html
对printf函数重定义:https://blog.csdn.net/sehanlingfeng/article/details/80383117

变量存储重温及在Ubuntu系统和Keil中编程验证相关推荐

  1. 变量存储重温与Clion编辑器的学习与实践

    变量存储重温与Clion编辑器的学习与实践 一.实验要求 二.变量存储重温 1.内存分配 (1)内存属性简述 (2)内存分区简述 (3)分区进行对比 (4)STM32数据存储位置 2.编程进行验证 ( ...

  2. 实现ubuntu系统和windows系统进行文件共享、互传等操作**

    实现ubuntu系统和windows系统进行文件共享.互传等操作 当我们在Windows中安装了虚拟机VMware,并且在虚拟机中安装了ubuntu后.我们在实际开发过程中一般是在Windows中编辑 ...

  3. amd和英伟达运行linux,AMD Ryzen平台与P106 矿卡安装Ubuntu系统和CUDA环境

    1.硬件环境 CPU:AMD Ryzen 3 2200G 主板:MSI A320M PRO M2 显卡:ZOTAC P106-90 3GB 内存:GSkill Aegis DDR4 2666 8GB ...

  4. ubuntu系统和ROS系统的版本对应关系

  5. 64位java_树莓派3B+安装64位ubuntu系统和docker工具

    想在树莓派3B上安装一些64位应用(例如64位JDK),因此首先要安装64位的操作系统,今天咱们就一起来实战:

  6. [Uncaught Error: Class 'mysqli' not found]Ubuntu系统和window系统下用MYSQLi方式不能连接数据库

    目录 window下 Linux下 window下 不知道是不是php版本高的原因,哎,搞了挺久的,最开始在window上,就出现了这个问题~ [Uncaught Error: Class 'mysq ...

  7. 浅析操作系统和Netty中的零拷贝机制

    点击关注公众号,Java干货及时送达 零拷贝机制(Zero-Copy)是在操作数据时不需要将数据从一块内存区域复制到另一块内存区域的技术,这样就避免了内存的拷贝,使得可以提高CPU的.零拷贝机制是一种 ...

  8. 基于Ubuntu(x86)系统和STM32(Keil)编写C程序分别进行编程、验证

    文章目录 实验内容 一.基本概念 (一).全局变量 (二).局部变量 (三).堆和栈 二.编程验证 (一).基于Ubuntu用Linux系统编写C程序 (二).基于STM32用Keil编写C程序 三. ...

  9. Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的重温

    一.C程序的内存分配 1.栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) 一般由程序员分配释放,若程序员不释放,程序 ...

最新文章

  1. 04.微博消息的语言检测
  2. 华为光猫鉴权解密逆向
  3. Shadow Brokers扬言兜售新漏洞攻击工具
  4. 分布式监控系统开发【day37】:需求讨论(一)
  5. 使用Laravel Eloquent ORM 时如何查询表中指定的字段
  6. 数值优化(Numerical Optimization)学习系列-目录
  7. ClassNotFoundException Com Sun Jersey Spi Container Servle
  8. 计算机组成原理pd指令是什么,计算机组成原理期中考试(DOC).doc
  9. python wmi antivirusproduct_使用python的wmi进行远程连接的时候报错
  10. python培训多久能入职_Python学到什么程度可以面试工作?
  11. python查看继承方法(一分钟读懂)
  12. mysql企业版安装_mysql企业版怎么安装图解
  13. 小程序毕设作品之微信小程序点餐系统毕业设计(4)开题报告
  14. CTFhub—弱密码(web)
  15. 游戏测试基础:适配性测试
  16. 在文档类中控制舞台上影片剪辑
  17. cmd 控制台 提示:请求的操作需要提升!
  18. 弹性布局(骰子六个面制作)
  19. 哈尔滨工业大学提出光学设计新思路:基于快速可微光线追迹的端到端单透镜成像系统设计
  20. 6.10力扣 10号出去逛街了,11号补上! 打印n位数

热门文章

  1. cpp+数据结构+设计模式
  2. [摘录]第一部分 掌舵领航(2)
  3. 概率论例题01:设P(A)=a,P(B)=b,P(A∪B)=c,则P(A非B)=()
  4. 12款好用的Visual Studio插件,最后一款良心推荐
  5. html里 f00是什么颜色,html 颜色对照表
  6. 蘑菇街暑期实习生一面面经 大三
  7. Android/Java中okhttp用法介绍
  8. 全网最详细最基础的网络安全入门教程
  9. mysql 创建表 create table详解
  10. 央行930新政启动房贷证券化 将撬动10万亿进楼市