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

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

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算法的详解,移植实现(三)相关推荐

  1. UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机

    UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...

  2. Lab 6:uC/OS II

    为什么80%的码农都做不了架构师?>>>    目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...

  3. uc/OS II——多任务设计

    uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...

  4. python内存池_python内存监控工具memory_profiler和guppy的用法详解

    python内存监控工具memory_profiler和guppy的用法详解 发布时间:2020-08-21 19:44:58 来源:脚本之家 阅读:123 python2.7在内存管理上相比pyth ...

  5. python 内存分析工具_python内存监控工具memory_profiler和guppy的用法详解

    python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用.python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大.我 ...

  6. linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机

    一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...

  7. Android内存优化(六)LeakCanary使用详解

    相关文章 Android性能优化系列 Java虚拟机系列 1.概述 如果使用MAT来分析内存问题,会有一些难度,并且效率也不是很高,对于一个内存泄漏问题,可能要进行多次排查和对比. 为了能够简单迅速的 ...

  8. 【嵌入式系统—实时操作系统】uC/OS II源码的官网下载

    要下载源码为:STM32F107-uC/OS-II源码包 Micrium官网的下载地址:Micrium_uC-Eval-STM32F107_uCOS-II 怎么找? 到官网的产品专区目录入口查找STM ...

  9. 【 uC/OS II 】uC/OS II 源代码阅读(os_task.c)任务管理

    前言 这个任务管理源代码,是整个系统最核心的部分,也是最难的部分,多看几遍吧.其中的核心结构体是: typedef struct os_tcb {OS_STK *OSTCBStkPtr; /* Poi ...

  10. uc os ii与linux,uC/OS-II嵌入式实时操作系统的几大特点

    uC/OS-II嵌入式实时操作系统的几大特点 出处:网络 发布于:2018-09-12 14:46:03 uC/OS-II的特点 1.uC/OS-II是由Labrosse先生编写的一个开放式内核,主要 ...

最新文章

  1. pb连接多个数据库 有关问题2
  2. 常见OJ评判结果对照表
  3. zbb20170613 linux 安装 mysql
  4. Java中使用MATLAB作图
  5. c# export server 调用sql_[转]使用C#调用cmd来执行sql脚本
  6. Python:tkinter滚动抽奖器
  7. 轻量级的网页Rank算法,365Rss.cn的Rank技术解释以及算法讨论(一)
  8. java switch和if_对比Java中if和switch选择结构二者的区别
  9. python查询模块所有类_python 小技巧(import模块、查询类继承关系、安装包)
  10. Maven超详细配置
  11. java 栈 先进后出_栈先进后出,堆先进先出
  12. 热敏电阻如何查表计算温度_简单说说NTC热敏电阻
  13. Android中的service
  14. java图片亮度调整
  15. 计算机文献检索语言,文献检索语言
  16. 国产CAD_谁说国产系统没有CAD软件可以用?
  17. Windows XP的定时关机命令
  18. 树莓派集成BH1750光敏传感器配置
  19. python2 assert判断字典的包含关系
  20. Excel中的快捷实用操作

热门文章

  1. XPS查看器(XPS Viewer)适用Win10系统安装说明
  2. Red5流服务器搭建(实现在线直播,流媒体视频播放和在线视频会议)
  3. php调java_php调java接口
  4. jQueryWEUI使用picker实现二级联动
  5. jquery weui 显示loading
  6. 屏幕共享软件都有什么功能呢?
  7. 利用Mimics.19对肺支气管进行三维重构
  8. 基于matlab的红外图像处理算法研究,基于小波的红外图像去噪算法研究
  9. PS2019橡皮擦工具、背景橡皮擦工具、魔术橡皮擦工具
  10. YOLOv5数据集标注工具