STM32F103正点原子学习笔记系列——内存管理

发布网友

我来回答

1个回答

热心网友

内存管理简介简单举例

要在LCD上显示读取到的文件:

通过这两者的大小,来自定义一个二维数组,例如:

uint8_t filenametbl[10000][255];

这样的话会造成很多的内存浪费,而且内存超过了stm32的内存(精英板的SRAMKB)。

简介

内存管理,是指软件运行时对MCU内存资源的分配和使用的技术。

其主要目的是:如何高效、快速的分配,且在适当的时候释放和回收内存资源。

当然,标准的C库提供了函数malloc()以及free()实现动态地申请和释放内存。

但是标准C库有如下缺点:

所以,正点原子自己写了分块式的内存管理!(现在学了FreeRTOS,学到lwIP的内存管理,才回来看这节课确实有点晚了,不过大概了解一下问题也不大)。

分块式内存管理

分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为n块,对应的内存管理表,大小也为n,内存管理表的每一个项对应内存池的一块内存。

内存管理表的每一项的值代表的意义:值为0,代表对应的内存块未被占用;值非0,代表对应的内存块已被占用,数值代表了被连续占用的内存块数量。

内存管理初始化时,内存管理表全部清零,表示没有任何内存块被占用。

分配方向分配原理

指针p调用malloc申请内存:

注意:内存不够,就返回NULL。

释放原理

释放则调用free函数:

分块内存管理 内存管理情况

注意,用完内存一定要记得手动释放!

同时初始化函数针对例如正点原子的战舰和探索者是有必要的,因为有一个内部SRAM和一个外部SRAM,但对于我手头的比如精英板,就一个内部SRAM,这个参数也可以不要(一共就一个SRAM,不需要指定哪一片)。

这里定义了内存管理的结构体变量,存储了内存管理的所需变量,需要注意的是,比如精英板这个内存片数就为1。

这个就是实际实现的结构体变量然后赋值进行初始化的例子。

内存池的管理以及其大小的具体计算公式。

内存管理初始化申请内存释放内存

4.课堂总结

这一章,是后面学FreeRTOS和lwIP这边的基础课程了,我也是回头过来补补课,从原理上面更好的了解一下。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com