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的内存管理。
在某平台上已成功运行。 rtt上跑ucgui!有创意!
怎么不跑rtgui呢? 感觉既然用RTT,那就直接使用RTGUI就好了,毕竟是原生的,稳定性会好一些。 二者的内存区别是什么呢?ucgui是为GUI而做的,适合图形方式,但是不适合数据方式。 使用RTGUI至少需要多少ROM和RAM呀??
页:
[1]