技术积累 — Keil 查看内存占用/优化代码

原文链接:转自Sugar的专栏(转载文章,若有不妥,通知后我会立即删除)

一、查看内存占用:

1、使用Keil编辑代码时,编译成功后,双击红色框框位置,就会弹出*.map文件;

2、那么map文件中能够读出哪些信息呢?

技术积累 — Keil 查看内存占用/优化代码_第1张图片

技术积累 — Keil 查看内存占用/优化代码_第2张图片

//Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 

Code是代码占用的空间;

RO-data是 Read Only 只读常量的大小,如const型;

RW-data是(Read Write) 初始化了的可读写变量的大小;

ZI-data是(Zero Initialize) 没有初始化的可读写变量的大小。

ZI-data不会被算做代码里因为不会被初始化。

 

简单的说就是在烧写时FLASH中被占用的空间为:Code + RO Data + RW Data

程序运行的时候,芯片内部RAM使用的空间为: RW Data + ZI Data

 

问题1:为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据被重新赋值的,每次这些固定的值就存储在Rom中;

问题2:为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费空间。

 二、优化代码空间:

未进行代码优化时的空间大小,如图,未进行任何优化时,keil编译生成的文件大小为:18340字节。 

技术积累 — Keil 查看内存占用/优化代码_第3张图片


第一步:project >> Option for Target “**”打开如图界面。选择“target”,勾选上“UseMicroLIB”再编译。

技术积累 — Keil 查看内存占用/优化代码_第4张图片技术积累 — Keil 查看内存占用/优化代码_第5张图片

分析:microLIB是缺省的C库,而且microLIB进行了高度优化。如果不勾选“Use MicroLIB”,keil会连接标准C库。所以勾选“UseMicroLIB”会减小code大小。 

 

第二步:project >> Option for Target “**”打开如图界面。选择“C/C++”,勾选上“One ELFSection per Functin”再编译。

技术积累 — Keil 查看内存占用/优化代码_第6张图片技术积累 — Keil 查看内存占用/优化代码_第7张图片

分析:“One ELF Section per Functin”就是将每个函数都生成一个ELF文件,最会将需要的函数链接成一个大的ELF文件。但是如果没有勾选“One ELF Section per Functin”。Keil将每个文件编译成一个ELF文件(即使文件中用未被使用的函数),最会链接成一个ELF文件。所以勾选“One ELF Section per Functin”会使code变小。

你可能感兴趣的:(技术积累)