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文件中;
同时也要将源码里的如下代码加入osuc-ii.h文件中
3.在工程里分别添加tlsf.c文件,tlsf.h文件
在tslf.c 文件加上:
#ifndef OS_MASTER_FILE
#include "includes.h"
#endif
在includes.h 文件里,添加#include "tlsf.h"
4.好像移植就完成了哈。想想还是很简单的哈。
然后编写测试代码:
然后用到了print_all_blocks();这个函数,下节分析运行结果时候详解。
未完待续哦!!
下面详细讲解下移植的步骤。
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();这个函数,下节分析运行结果时候详解。
未完待续哦!!
相关文章推荐
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(一)
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(二)
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(四)
- 改进uC/OS II,减少内存使用量
- uC/OS-II在ARM系统上的移植与实现
- uC/OS-II移植 详解 系统时钟部分
- 改进uC/OS II,减少内存使用量
- uC/OS-II在ARM系统上的移植与实现
- uC/OS-II在ARM系统上的移植与实现
- uC/OS-II在ARM系统上的移植与实现
- uC/OS II在pc上的移植与实现
- 改进uC/OS II,减少内存使用量
- uC/OS-ii移植详解
- uc/OS II移植中软件中断的理解与应用
- uC/OS-II任务栈处理的一种改进方法
- LPC2104启动代码之Vectors.s注释(用于uC/OS-II 2.52移植)
- 移植uC/OS-II到瑞萨的单片机,添加信号量功能
- uC/OS-II任务栈处理的一种改进方法
- LPC2104启动代码之Vectors.s注释(用于uC/OS-II 2.52移植)
- 基于Nios软核CPU的uC/OS-II和LwIP移植