lixun00 发表于 2011-12-2 21:21:08

ucGui中内存管理启用rt-thread的内存管理

rt-thread的内存管理我觉得要比ucGui的高明,但是ucGui支持碎片整理。

不管怎样,在一个操作系统上采用共同的内存管理,个人觉得好点。

ucGui内存管理实现文件为GUIAlloc.c

ucGui已经为我们想好了启用外部内存管理函数

启用外部管理是通过申明宏GUI_ALLOC_ALLOC来实现的。

此时还需要实现宏GUI_ALLOC_FREE,GUI_ALLOC_H2P,GUI_ALLOC_GETMAXSIZE

前三个好办。

直接在GUIAlloc.c中添加
extern void *rt_malloc(long size_bytes);
extern void rt_free(void *rmem);       
#define GUI_ALLOC_ALLOC(x)                (GUI_HMEM)rt_malloc(x)
#define GUI_ALLOC_FREE(x)                rt_free((void*)(x))
#define GUI_ALLOC_H2P(x)                (x)       



GUI_ALLOC_GETMAXSIZE为得当当前能分配的最大内存,这个属于底层函数,在下面实现

除了上面的外,在GUIConf.h定义GUI_HMEM 为unsignd long,否则默认GUI_HMEM为无符号16位

同时要定义GUI_ALLOC_SIZE大于32767,因为当此值<=32767时会导致GUI_ALLOC_DATATYPE和GUI_ALLOC_DATATYPE_U为有符号16位和有符号16位

好了,下面实现GUI_ALLOC_GETMAXSIZE

rt-thread的内存管理实现就不说了,直接上代码

在mem.c中添加

rt_size_t rt_mem_get_max_allow_size(void)
{
        rt_size_t ptr,t,size=0;
        struct heap_mem *mem;

        /* take memory semaphore */
        rt_sem_take(&heap_sem, RT_WAITING_FOREVER);

        ptr = (rt_uint8_t *)lfree - heap_ptr;
        while(1)
        {
                mem = (struct heap_mem *)&heap_ptr;

                if (!mem->used)
                {
                        t = mem->next - ptr - SIZEOF_STRUCT_MEM*2 - MIN_SIZE_ALIGNED;
                        if(t>size && t<mem_size_aligned)
                        {
                                size = t;
                        }
                }
                ptr = ((struct heap_mem *)&heap_ptr)->next;
                if(ptr == mem_size_aligned + SIZEOF_STRUCT_MEM)
                {
                        break;
                }
        }
       
        rt_sem_release(&heap_sem);
       
        return size;
}

接着在GUIAlloc中添加
extern long rt_mem_get_max_allow_size(void);
#define GUI_ALLOC_GETMAXSIZE()        rt_mem_get_max_allow_size()

通过以上就实现了ucGui的内存管理。

在某平台上已成功运行。

ljt80158015 发表于 2011-12-2 21:59:26

rtt上跑ucgui!有创意!

怎么不跑rtgui呢?

tiancaigao7 发表于 2011-12-3 08:51:21

感觉既然用RTT,那就直接使用RTGUI就好了,毕竟是原生的,稳定性会好一些。

ST_ATMEL_NXP 发表于 2013-4-24 11:35:15

二者的内存区别是什么呢?ucgui是为GUI而做的,适合图形方式,但是不适合数据方式。

wowof 发表于 2013-4-24 22:05:42

使用RTGUI至少需要多少ROM和RAM呀??
页: [1]
查看完整版本: ucGui中内存管理启用rt-thread的内存管理