对单片机程序中.data、.bss和.text三种数据的解读

一、单片机的存储资源(以MKL25Z4为例)

  如下图所示,FLASH的大小是128kbyte,RAM的大小是16kbyte。该单片机FLASH的起始地址时从0开始的,如果改变FLASH的起始地址,可利用的资源会更少,比如下图中我设置的起始地址时从0x5000开始的,那么可利用的FLASH大小就为(0x20000-0x5000)byte;总结来说就是起始地址和结束地址共同决定了当前可利用的存储资源,而总的存储资源是由单片机本身决定的也是不可变的。

 

 二、FLASH和RAM存储器中存放的数据类型

  如下图所示,FLASH包含.data段、.text段和其它;RAM包含.data段、.bss段和其它,其中还有我们熟悉的.heap和.stack它们的存在会占用RAM的存储资源。

  1、.bss段(Block Started by Symbol)

   BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0。特点是可读写的,在程序执行之前BSS段会自动清0。

  2、.data段(data segment)

   数据段通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

  3、.text段(code segment/text segment)

   代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,在代码段中也可能包含一些只读的常数变量。

  

三、代码演示

  下面通过写一些简单的代码来观察常用类型的变量存放方式:

 

 

  总结:从以上可以看出赋初值(初值≠0)的全局变量存在RAM的.data段中(虽然上图中指示的Flash区域和RAM区域都含有.data且具有相同的内容,但通过观察他们的起始地址会发现他们属于同一个数据);而不赋初值(或者赋初值=0)的全局变量只存在于RAM的.bss段中;静态局部变量和全局变量一样。只读类型的全局变量和静态局部变量的都存在FLASH的.text段中。

#end

posted @ 2020-08-24 15:04  不要让自己太懒  阅读(3366)  评论(0编辑  收藏  举报