1 /* 2 * 程序清单:内存池例程 3 * 4 * 这个程序会创建一个静态的内存池对象,2个动态线程。两个线程会试图分别从内存池中获得 5 * 内存块 6 */ 7 #include <rtthread.h> 8 #include "tc_comm.h" 9 10 static rt_uint8_t *ptr[48]; 11 static rt_uint8_t mempool[4096]; 12 static struct rt_mempool mp; 13 14 /* 指向线程控制块的指针 */ 15 static rt_thread_t tid1 = RT_NULL; 16 static rt_thread_t tid2 = RT_NULL; 17 18 /* 线程1入口 */ 19 static void thread1_entry(void* parameter) 20 { 21 int i; 22 char *block; 23 24 while(1) 25 { 26 for (i = 0; i < 48; i++) 27 { 28 /* 申请内存块 */ 29 rt_kprintf("allocate No.%d\n", i); 30 if (ptr[i] == RT_NULL) 31 { 32 ptr[i] = rt_mp_alloc(&mp, RT_WAITING_FOREVER); 33 } 34 } 35 36 /* 继续申请一个内存块,因为已经没有内存块,线程应该被挂起 */ 37 block = rt_mp_alloc(&mp, RT_WAITING_FOREVER); 38 rt_kprintf("allocate the block mem\n"); 39 /* 释放这个内存块 */ 40 rt_mp_free(block); 41 block = RT_NULL; 42 } 43 } 44 45 /* 线程2入口,线程2的优先级比线程1低,应该线程1先获得执行。*/ 46 static void thread2_entry(void *parameter) 47 { 48 int i; 49 50 while(1) 51 { 52 rt_kprintf("try to release block\n"); 53 54 for (i = 0 ; i < 48; i ++) 55 { 56 /* 释放所有分配成功的内存块 */ 57 if (ptr[i] != RT_NULL) 58 { 59 rt_kprintf("release block %d\n", i); 60 61 rt_mp_free(ptr[i]); 62 ptr[i] = RT_NULL; 63 } 64 } 65 66 /* 休眠10个OS Tick */ 67 rt_thread_delay(10); 68 } 69 } 70 71 int mempool_simple_init() 72 { 73 int i; 74 for (i = 0; i < 48; i ++) ptr[i] = RT_NULL; 75 76 /* 初始化内存池对象 */ 77 rt_mp_init(&mp, "mp1", &mempool[0], sizeof(mempool), 80); 78 79 /* 创建线程1 */ 80 tid1 = rt_thread_create("t1", 81 thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ 82 THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); 83 if (tid1 != RT_NULL) 84 rt_thread_startup(tid1); 85 else 86 tc_stat(TC_STAT_END | TC_STAT_FAILED); 87 88 /* 创建线程2 */ 89 tid2 = rt_thread_create("t2", 90 thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ 91 THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); 92 if (tid2 != RT_NULL) 93 rt_thread_startup(tid2); 94 else 95 tc_stat(TC_STAT_END | TC_STAT_FAILED); 96 97 return 0; 98 } 99 100 #ifdef RT_USING_TC 101 static void _tc_cleanup() 102 { 103 /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ 104 rt_enter_critical(); 105 106 /* 删除线程 */ 107 if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) 108 rt_thread_delete(tid1); 109 if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) 110 rt_thread_delete(tid2); 111 112 /* 执行内存池脱离 */ 113 rt_mp_detach(&mp); 114 115 /* 调度器解锁 */ 116 rt_exit_critical(); 117 118 /* 设置TestCase状态 */ 119 tc_done(TC_STAT_PASSED); 120 } 121 122 int _tc_mempool_simple() 123 { 124 /* 设置TestCase清理回调函数 */ 125 tc_cleanup(_tc_cleanup); 126 mempool_simple_init(); 127 128 /* 返回TestCase运行的最长时间 */ 129 return 100; 130 } 131 /* 输出函数命令到finsh shell中 */ 132 FINSH_FUNCTION_EXPORT(_tc_mempool_simple, a memory pool example); 133 #else 134 /* 用户应用入口 */ 135 int rt_application_init() 136 { 137 mempool_simple_init(); 138 139 return 0; 140 } 141 #endif 142