对stm32内存理解,查看以及面试题的一些总结(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011123091/article/details/81607102

基础知识储备

1、keil中如何调用出map文件,以及map文件的作用

我是拿正点原子的标准工程来使用分析。

如何获得map文件,

双击工程名即可得到map文件。

2、map文件包含哪些东西

1.Section CrossReferences:模块、段(入口)交叉引用;通俗一点就是函数之间互相调用的关系。

2.Removing Unused inputsections from the image:移除未使用的模块;优化程序的大小,如果有没有使用的函数,勾选keil中相应的选项,这些函数将会去除

3.Image SymbolTable:映射符号表;

扫描二维码关注公众号,回复: 2923152 查看本文章

包括 local symbols和global  被static修饰的就是local symbols。这个记录了,程序和数据在存储的位置,可以看出占用的大小也可以根据地址做调试用。

4.Memory Map of the  image:内存(映射)分布

5.Image componentsizes:存储组成大小。可以看出每个文件销号了多少的内存以及flash

这里我们着重理解下,startup_stm32f10x_hs.o中消费了1536个字节。 那么1536是被谁销号的呢,打开这个启动文件,发现

Stack_Size      EQU     0x00000400

Heap_Size       EQU     0x00000200

正好是0x600=1536个字节,stack_size是栈空间,heap_size是堆空间,在启动文件中指定。具体的在内存中的变现我在下一篇文件中记录。这个时候已经分配好了。

最后分析一下下边这个图:

 code是代码的大小,ro-data是const修饰的数据段的大小。rw-data是已经初始化,但是不是初始化为0的变量,ZI-data是未初始化的变量或者初始化为0的。在flash中存储的为code+ro data +rwdata  为什么bss的也就是zi-data没有存储在flash中,因为zi-data要么是0要么没有赋值,编译器直接给0就行了,不需要掉电保存。

记一次根据map找问题的记录,从网上下载的json程序,直接合并到我们的程序之中,之后程序一跑死机,发现是ram占用的太大了,看了看我们的程序我们自己的程序ram占用的很小,根本不会超出,后来查看了map,找到占用ram比较大的文件,是从网上下载的cjson的程序开辟了很大的内存池造成的,发现了问题就好解决了。

网上看到的利用map来找到hardfault的错误的连接,https://www.cnblogs.com/zhangshenghui/p/5944881.html

猜你喜欢

转载自blog.csdn.net/u011123091/article/details/81607102
今日推荐