微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于STM32原子战舰板内存管理源码

基于STM32原子战舰板内存管理源码

时间:12-01 来源:互联网 点击:
走到今天,已经开始涉及到计算机核心一点的东西了---内存管理。通过本实验的学习,能够较为深刻体会到“指针是c语言的灵魂”这句话的分量。自然对c语言的能力要求就高很多了。

最近有点乱,但是有关嵌入式系统的学习不曾怠慢过。本文是基于原子老师的c源码,自己的学习的心得,只是对源码作出自己的学习理解,同时也插补了一些涉及到的c语言知识。贴出本文不为别的,一来但愿能有有缘人看到本文,提出指正;二来,为了那些不眠的夜,安慰一下自己。

1, 内存管理简介

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。内存管理的实现方法有很多种,他们其实最终都是要实现2个函数:malloc和free;malloc函数用于内存申请,free函数用于内存释放。

先回顾一下c语言知识:计算机内存一般分为静态存储区用以存储全局变量或常量和动态存储区用以存储函数内部变量或形参或函数运算结果。malloc()函数的作用是请求系统在内存的动态存储区分配若干个字节的存储空间,函数的返回值是首字节地址,可见malloc()函数是指针类型。free(P)的作用是释放指针变量P所指向的动态空间。

本章,我们介绍一种比较简单的办法来实现:分块式内存管理。下面我们介绍一下该方法的实现原理,如图所示(示意图):

内存块1 内存块2 内存块3 ……内存块n 内存池

| | | |

第1项 第2项 第3项 ……第n项 内存管理表

<-----分配方向

|

malloc,free等函数

图解:从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为n块,对应的内存管理表,大小也为n,内存管理表的每一个项对应内存池的一块内存。

内存管理表的项值代表的意义为:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为10,那么说明包括本项对应的内存块在内,总共分配了10个内存块给外部的某个指针。

内寸分配方向如图所示,是从顶à底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。

分配原理:

当指针p调用malloc申请内存的时候,先判断p要分配的内存块数(m),然后从第n项开始,向下查找,直到找到m块连续的空内存块(即对应内存管理表项为0),然后将这m个内存管理表项的值都设置为m(标记被用),最后,把最后的这个空内存块的地址返回指针p,完成一次分配。注意,如果当内存不够的时候(找到最后也没找到连续的m块空闲内存),则返回NULL(空指针)给p,表示分配失败。

释放原理:

当p申请的内存用完,需要释放的时候,调用free函数实现。free函数先判断p指向的内存地址所对应的内存块,然后找到对应的内存管理表项目,得到p所占用的内存块数目m(内存管理表项目的值就是所分配内存块的数目),将这m个内存管理表项目的值都清零,标记释放,完成一次内存释放。

关于分块式内存管理的原理,我们就介绍到这里。

2, 硬件设计:

本章实验功能简介:开机后,显示提示信息,等待外部输入。KEY0用于申请内存,每次申请2K字节内存。KEY1用于写数据到申请到的内存里面。KEY2用于释放内存。WK_UP用于切换操作内存区(内部内存/外部内存)。DS0用于指示程序运行状态。本章我们还可以通过USMART调试,测试内存管理函数。

本实验用到的硬件资源有:

1) 指示灯DS0

2) 四个按键

3) 串口 //USMART

4) TFTLCD模块

5) IS62WV51216

3, 软件设计:

本章,我们将内存管理部分单独做一个分组,在工程目录下新建一个MALLOC的文件夹,然后新建malloc.c和malloc.h两个文件,将他们保存在MALLOC文件夹下。

在MDK新建一个MALLOC的组,然后将malloc.c文件加入到该组,并将MALLOC文件夹添加到头文件包含路径。

打开malloc.c文件,输入如下代码:由于本实验涉及到的c语言知识,尤其是指针知识较多,所以就边用边学

#include "malloc.h"

//内存池(4字节对齐)

__align(4) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池

/*

" u8 mem1base[MEM1_MAX_SIZE];"该数组是定义拿出内部内存池的40K的空间来做实验,为什么该数组是u8类型?计算机内存是以字节为单位的存储空间,内存中的每个字节都有唯一的编号,这个编号就叫地址。在这里就是定义40K个元素,每个元素代表一个字节。整个数组就

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top