代码段 数据段 bss短 堆 栈

参考http://blog.csdn.net/liuchao1986105/article/details/6724392https://blog.csdn.net/u012138828/article/details/18551357以及https://blog.csdn.net/u012252959/article/details/80800559

内存的静态分配和动态分配的区别

一 是时间不同,静态分配发生在程序编译和链接的时候,动态分配曾发生在程序调入和执行的时候;

二 是空间不同,堆都是动态分配的,没有静态分配的堆,栈有2中分配方式:静态分配和静态分配,其中静态分配是编译器完成的,比如局部变量的分配,动态分配是由malloc进行分配,不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无须我们手工实现;

代码段

用于存储代码,在程序运行前就已经确定,也可能包含一些只读的常量变量,例如字符串常量等(对于stm32,是存在flash中)

BSS段

通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS段属于静态内存分配。未被初始化的变量编译的时候是不会被放入到生成的执行文件中,也就是不会增加执行文件的大小。(对于stm32来说,是存在ram空间中)

数据段

通常是指用来存放程序中已初始化的全局变量的一块内存区域,静态内存分配;初始化的变量编译的时候是会被放入到生成的执行文件中,也就是会增加执行文件的大小。(对于stm32来说,是存在ram空间中)

是用于存放进程运行中被动态分配的内存段,可动态扩张或缩减;

是用户存放程序临时创建的局部变量,先进先出,栈可以看成一个寄存、交换临时数据的内存区;

STM32 keil下,工程编译会出现以下信息

  1. Code表示程序代码部分
  2. RO-data 表示程序定义的常量
  3. RW-data 表示已初始化的全局变量
  4. ZI-data 表示未初始化的全局变量,以及初始化为0的变量
  5. RO Size = Code + RO Data (程序占用FLASH空间的大小)
  6. RW Size = RW Data + ZI Data (运行时程序占用RAM空间的大小)
  7. ROM Size = Code + RO Data + RW Data (烧写时程序占用FLASH空间的大小)(为什么RW Data会包含在FLASH中,也就是生产的执行文件中,因为这部分数据被初始化了,那么就要给它分配空间去存它的初始化数据)

对于x86的pc机和单片机等嵌入式开发系统程序的存储是截然相反的,

即:
x86的pc机cpu在运行的时候程序是存储在RAM中的,而单片机等嵌入式系统则是存于flash中

x86cpu和单片机读取程序的具体途径

pc机在运行程序的时候将程序从外存(硬盘)中,调入到RAM中运行,cpu从RAM中读取程序和数据
而单片机的程序则是固化在flash中,cpu运行时直接从flash中读取程序,从RAM中读取数据

造成这种差别的具体原因分析

x86构架的cpu是基于冯.诺依曼体系的,即数据和程序存储在一起,而且pc机的RAM资源相当丰富,从几十M到几百M甚至是几个G,客观上能够承受大量的程序数据。
单片机的构架大多是哈弗体系的,即程序和数据分开存储,而且单片的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。

单片机的程序能存储在RAM中吗 ?

通过上面的分析可得知:单片机的程序能存储于flash中是基于两点考虑,即体系结构和RAM资源的多少。因此,在技术不但进步片内RAM容量不断增多的今天,RAM资源已经不再是制约这种差别的主要因素,而对于体系机构我们只要更改cpu读取程序的方式就可以。

将嵌入式系统的程序存于RAM中的具体做法

“对于很多的嵌入式系统,其代码很多都存储在nor flash中,运行也是直接在flash中运行.我最近了解到我新公司的软件中的一段代码当时为了提高运行速度被加载到ram中运行.当时他们是花了很多时间来解决这个问题的.
我仔细研究了一下链接脚本,用的是gnu的linux的交叉工具链.地址分配是写在一个ld脚本中的.
他们是这样实现的:
1,将你需要在ram中运行的代码写在单独的一个c文件中,然后在脚本中设置其运行地址与存放地址分开.设置好必要的代码起始和结束的标志变量.
2,在代码中将存放地址处的代码拷贝到运行地址中.

这段代码倒是没什么问题,只是我有个更简单的办法:
还记得全局变量是怎么初始化的吗? .data段是一个自动初始化的段(内核代码处理),我只需要将这个c文件产生的代码放置在.data段中,这段代码就可以被加载到ram运行了.我测试了一下运行良好.

冯.诺依曼体系与哈佛体系的区别

二者的区别就是程序空间和数据空间是否是一体的。 早期的微处理器大多采用冯诺依曼结构,典型代表是Intel公司的X86微处理器。取指令和取操作数都在同一总线上,通过分时复用的方式进行的。缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。
哈佛总线技术应用是以DSP和ARM为代表的。采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指令和取操作数,从而大大提高了运算能力。
例如STM320LF240x系列DSP是增强型的哈佛结构通过三组并行的总线访问多个存储空间。它们分别是:程序地址总线(PAB),数据地址读总线(DRAB)和数据地址写总线(DWRB)。

猜你喜欢

转载自blog.csdn.net/u012850592/article/details/89538379