下面给出静态内存池管理实验程序。。
在这个程序中,首先向系统中申请了一个内存池,初始化两个静态线程。
在线程1中申请48个内存块和线程2中主要完成内存块的释放。。。。
大家可以自己调试一下观察一下内存管理机制的实现过程。。。。。
源码请大家下载Rt_thread mailbox lab工程包。
下面给出源程序,加入到工程包里就行了。
#include <rtthread.h>
/* 两个线程用到的TCB和栈 */ struct rt_thread thread1; struct rt_thread thread2;
char thread1_stack[512]; char thread2_stack[512];
/* 内存池数据存放区 */ char mempool[4096];
/* 内存池TCB */ struct rt_mempool mp;
/* 测试用指针分配头 */ char *ptr[48];
/* 线程1的入口函数 */ static void thread1_entry(void * parameter){ int i; char *block;
while(1){ /* 分配48个内存块 */ for(i=0;i<48;i++){ rt_kprintf("thread1:allocate No.%d\n",i);
ptr=rt_mp_alloc(&mp,RT_WAITING_FOREVER); }
/* 再分配一个内存块 */ block=rt_mp_alloc(&mp,RT_WAITING_FOREVER); rt_kprintf("allocate the block mem\n"); rt_mp_free(block); block=RT_NULL; } }
/* 线程2的入口函数 */ static void thread2_entry(void* parameter){ int i; while(1){ rt_kprintf("try to release block\n"); /* 释放48个已经分配了的内存块 */ for(i=0;i<48;i++){ if(ptr!=RT_NULL) {// 非空才释放 rt_kprintf("thread2: release block %d\n",i); rt_mp_free(ptr);
/* 释放完将指针清零 */ ptr=RT_NULL; } } } }
int mp_simple_init(void){ int i; for(i=0;i<48;i++) ptr=RT_NULL;
/* 初始化一个内存池对象,每个内存块的大小为80Byte */ rt_mp_init(&mp,"mpt",&mempool[0],sizeof(mempool),80);
/* 初始化线程1 */ rt_thread_init(&thread1,"thread1",thread1_entry,RT_NULL, &thread1_stack[0],sizeof(thread1_stack),20,10);
/* 初始化线程2 */ rt_thread_init(&thread2,"thread2", thread2_entry, RT_NULL, &thread2_stack[0], sizeof(thread2_stack),25,7);
rt_thread_startup(&thread1); rt_thread_startup(&thread2);
return 0;
}
int rt_application_init() { mp_simple_init();
return 0; }
|