您的位置:首页 > 其它

uc/os-II的内存改进与实现TLSF算法的详解,移植实现(三)

2014-12-26 14:28 369 查看
这一节讲讲怎么实现移植。看了很多的论文上,都说移植“十分简单”,但是由于自己从来没有做过这方面的工作,所以感觉毫无头绪,在老师,学长的帮助下吧,我也终于搞定了移植,并能成功运行,看到了这个算法的好处哈。

下面详细讲解下移植的步骤。

1. 将相关结构体的定义复制到ucos-ii.h文件中的定义memory结构体的那个地方;

相关结构体有:tlsf_struct ,are_info_struct,bhdr-struct,free_ptr_struct

2.配置变量;

将tlsf.c源码里的这些定义剪切粘贴复制到OS_CFG.H文件中;

/* Some IMPORTANT TLSF parameters */
/* Unlike the preview TLSF versions, now they are statics */
/*内存块理论上的最小值*/
#define BLOCK_ALIGN (sizeof(void *) * 2)  /* 内存块对齐,内存块大小至少是2个字的大小(用于存储struct free_ptr_struct结构体)*/

#define MAX_FLI		(30)                 /*最大内存块的范围2的30次方到2的31次方直接*/
#define MAX_LOG2_SLI	(5)             /*二级数,MAX_SLI表示一级索引分成多少块*/
#define MAX_SLI		(1 << MAX_LOG2_SLI)     /* MAX_SLI = 2^MAX_LOG2_SLI */

#define FLI_OFFSET	(6)     /* tlsf structure just will manage blocks bigger */
/* than 128 bytes */
#define SMALL_BLOCK	(128)
#define REAL_FLI	(MAX_FLI - FLI_OFFSET)  /* 数组最大值*/
#define MIN_BLOCK_SIZE	(sizeof (free_ptr_t))    /*内存块最小值*/
#define BHDR_OVERHEAD	(sizeof (bhdr_t) - MIN_BLOCK_SIZE)  /*内存块的块头的大小*/
#define TLSF_SIGNATURE	(0x2A59FA59)       /*TLSF动态算法的标志*/

#define	PTR_MASK	(sizeof(void *) - 1)
#define BLOCK_SIZE	(0xFFFFFFFF - PTR_MASK) /* 用于字对齐,处理器取址*/

#define GET_NEXT_BLOCK(_addr, _r) ((bhdr_t *) ((char *) (_addr) + (_r)))  /*得到下一个物理相邻内存块的首地址*/

/*  以下预定义,用于内存的大小,物理地址,内存块最小值等的控制*/
#define	MEM_ALIGN		  ((BLOCK_ALIGN) - 1)
#define ROUNDUP_SIZE(_r)          (((_r) + MEM_ALIGN) & ~MEM_ALIGN) /* _r值低三位 0舎1入(如同四舍五入),并且低三位清零(相对于32位处理器)*/
#define ROUNDDOWN_SIZE(_r)        ((_r) & ~MEM_ALIGN)               /*  _r低三位清零*/
#define ROUNDUP(_x, _v)           ((((~(_x)) + 1) & ((_v)-1)) + (_x))

#define BLOCK_STATE	(0x1)   /* 此内存块空闲,前一内存used*/
#define PREV_STATE	(0x2)   /*与上相反*/

/* bit 0 of the block size 表示当前此内存块的状态*/
#define FREE_BLOCK	(0x1)
#define USED_BLOCK	(0x0)

/* bit 1 of the block size */
#define PREV_FREE	(0x2)
#define PREV_USED	(0x0)

#define DEFAULT_AREA_SIZE (1024*10)


同时也要将源码里的如下代码加入osuc-ii.h文件中

typedef unsigned int u32_t;     /* NOTE: Make sure that this type is 4 bytes long on your computer */
typedef unsigned char u8_t;

//#include <string.h>
#ifndef USE_PRINTF
#define USE_PRINTF      (1)
#endif

#ifndef TLSF_USE_LOCKS
#define	TLSF_USE_LOCKS 	(1)//此部分跟源码不一样
#endif

#ifndef TLSF_STATISTIC
#define	TLSF_STATISTIC 	(0)
#endif

#ifndef USE_MMAP
#define	USE_MMAP 	(0)
#endif

#ifndef USE_SBRK
#define	USE_SBRK 	(0)
#endif

//#include "uCOS_II.H"
//加入头文件,需要使用互斥量来实现锁的功能
INT8U perr;
#define TLSF_MLOCK_T  OS_EVENT*/*互斥量锁类型*/
#define TLSF_CREATE_LOCK(L)   (*(L))=OSMutexCreate(4,&perr) /*创建互斥量*/
#define TLSF_DESTROY_LOCK(L)   OSMutexDel(*(L),OS_DEL_ALWAYS,&perr) /*删除互斥量*/
#define TLSF_ACQUIRE_LOCK(L)   OSMutexPend(*(L),0,&perr)
#define TLSF_RELEASE_LOCK(L)   OSMutexPost(*(L))


3.在工程里分别添加tlsf.c文件,tlsf.h文件

在tslf.c 文件加上:

#ifndef OS_MASTER_FILE

#include "includes.h"

#endif

在includes.h 文件里,添加#include "tlsf.h"

4.好像移植就完成了哈。想想还是很简单的哈。

然后编写测试代码:

for (i = 0; i< 10; i++)
if (!(ptr[i] = malloc_ex(j++, pool))){
printf("Error\n");
exit(-1);
}
//OSTimeDly(OS_TICKS_PER_SEC);

print_all_blocks((tlsf_t *)ptr);
for (i = 0; i< 10; i++)
free_ex(ptr[i], pool);

//destroy_memory_pool(pool);
printf("Test1 OK\n");
我不知道出了什么问题,这个源码不能调用tlsf_malloc()这个函数,所以我就直接用的malloc_ex(),其实看了看源码只是差了锁函数这部分,目前还不知道这部分有没有影响之类的。

然后用到了print_all_blocks();这个函数,下节分析运行结果时候详解。

未完待续哦!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: