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

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

时间:12-01 来源:互联网 点击:

emmap[memx], 0,memtblsize[memx]*2)的第一个形参,因为*mem1mapbase等价于mem1mapbase[0]),而mem1mapbase[0]就代表内部存储器1250个存储块中的第一个存储块。结合

void mymemset(void *s,u8 c,u32 count)函数分析, mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2)函数的意思是:把0写入到1250个存储块中的第一个存储块中;这样就将一个存储块的值赋值为0了。

推断出“mallco_dev.memmap[0]”是u16类型指针;

*/

u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE)));

/*

“#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE/MEM2_BLOCK_SIZE”

“#define MEM2_BLOCK_SIZE 32”

外部SRAM内存池MAP,同理,“MEM2_MAX_SIZE/MEM2_BLOCK_SIZE”的含义是外部SRAM内存池总共200K字节的容量除以32个字节,得到一共200K/32==6250个内存块;也就是说将外部SRAM内存池划为6250个内存块。

*/

//内存管理参数

/*

内存管理表“MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE”分别是1250和6250个“项”.

每个内存分块大小即内部和外部SRAM每个内存块占有32个字节空间“MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE”分别是32个字节;

内存总大小“MEM1_MAX_SIZE,MEM2_MAX_SIZE”,分别是40K和200K个字节的总容量空间

mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);

*/

const u32 memtblsize[2]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE};//内存管理表大小

const u32 memblksize[2]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE}; //内存分块大小

const u32 memsize[2]={MEM1_MAX_SIZE,MEM2_MAX_SIZE}; //内存总大小

/*

struct _m_mallco_dev //内存管理控制器,定义一个结构体类型数据,或结构体变量,

{

void (*init)(u8); //初始化

u8 (*perused)(u8); //内存使用率

u8 *membase[2]; //内存池 管理2个区域的内存 mem1base,mem2base内存池

u16 *memmap[2]; //内存管理状态表 mem1mapbase(==1250块),mem2mapbase(6250), //内存管理状态表

u8 memrdy[2]; //内存管理是否就绪

};

1,结构体成员“void (*init)(u8);”是定义了一个指向函数的指针变量,该指针变量名是init;void表示该函数没有返回值(函数的数据类型由返回值决定);u8是函数的形参。指向函数的指针变量格式:数据类型 + (*变量名)(形参)

本例中:

void mem_init(u8 memx)

{

mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零 memx:所属内存块,即几号内存块

mymemset(mallco_dev.membase[memx], 0,memsize[memx]); //内存池所有数据清零

mallco_dev.memrdy[memx]=1;//内存管理初始化OK

}

也就是说,本例中用指向函数的指针变量来表示函数。c语言规定函数名就是函数的入口地址,也就是说函数名也是一个指针,指向函数的入口,根据这个原理,可以将指向函数的指针作为函数的参数调用,可以在不同的情况调用不同的函数;如果一个指向函数的指针变量等于函数名就可以说该指向函数的指针变量指向了该函数,那么指针变量与函数就是一样的了。比如:“mem_init(memx);”就等同于“mallco_dev.init(memx);”

2,指针类型数组“u8 *membase[2];”,意思是该指针类型数组有两个“char *”类型的指针元素或者说有两个“u8 *”类型指针元素;为什么要定义“u8 *”类型呢?因为内存存储区是根据数据类型来划分的,如果不明确声明类型就乱套了。

在C语言和C++语言中,数组元素全为指针的数组称为指针数组。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。

例如,一个一维指针数组的定义:int *ptr_array[10]。该指针数组有10个元素,每个元素都是int类型的指针即“int *”类型;

指针类型数组“u8 *membase[2];”的赋值是mem1base,mem2base, “mem1base,mem2base”分别是内部内存池和外部内存池的数组名,是指针常量即首元素的地址;因为事先已经定义“u8 mem1base[MEM1_MAX_SIZE]”即“u8 mem1base[40K];”。

*/

//内存管理控制器,结构体变量赋值,即初始化

struct _m_mallco_dev mallco_dev=

{

mem_init, //内存初始化,将函数名“mem_init”赋给结构体成员“void (*init)(u8);”即指向函数的指针变量,

mem_perused, //内

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

网站地图

Top