- 本帖最后由 wolfgang2018 于 2018-6-4 22:18 编辑 *
15、将本节实例中内存池改为动态申请的方式
我所选择的系统嘀嗒与课程选用的系统嘀嗒有些不一样,实验出来的结果有些不一样:

线程1优先级高,第一阶段是在获取内存池中的内存;

在0~47个内存池申请满后,再使用“rt_mp_alloc”申请时,进入阻塞状态,线程2开始运行;

说明如图

后边依次类推,线程1的2、3次运行都随线程2的释放空间后才能得以运行

后边依次类推,线程1的4、5次运行都随线程2的释放空间后才能得以运行

后边依次类推,线程1的6、7次运行都随线程2的释放空间后才能得以运行

后边依次类推,线程1的8、9次运行都随线程2的释放空间后才能得以运行。
在线程2第1次释放到46、47后,所有48块内存都释放完后,线程2完成第一轮释放。

线程1后在获取完第10次(10次0~47循环判断是否为空指针)内存后,退出循环,剩下的只有线程2在运行。


线程2完成10次释放后,结束了线程的运行。
相关程序代码:
//定义48块内存每块内存大小80
#define UPTRLENGTH 48
#define USIZE 80
//内存池内内存块定义为数组
static rt_uint8_t *uptr[UPTRLENGTH];
//内存池地址定义
static struct rt_mempool *user_mp=RT_NULL;
//用户线程定义
static rt_thread_t utid1 = RT_NULL;
static rt_thread_t utid2 = RT_NULL;
//线程1的程序结构,增加了几处内容提示;
/***************************************/
static void user_thread1_entry(void *parameter){
rt_uint8_t i, count = 0;
rt_uint8_t *block;
while(1) {
/* 申请内存块 */
rt_kprintf("=============Thread1 Start: %d<br>",count);
for (i = 0; i < UPTRLENGTH; i++){
if (ptr* == RT_NULL){
ptr* = rt_mp_alloc(user_mp, RT_WAITING_FOREVER);
rt_kprintf("Thread1: allocate No.%d<br>", i);
}
}
rt_kprintf("============Thread1: ALL Pool Used!!! %d<br>", i);
/* 继续申请一个内存块,因为已经没有内存块,线程应该被挂起 */
block = rt_mp_alloc(user_mp, RT_WAITING_FOREVER);
rt_kprintf("Thread1: Allocate One block mem! <br>");
/* 释放这个内存块 */
rt_mp_free(block);
block = RT_NULL;
rt_kprintf("Thread1: Free One block mem! <br>");
/* 休眠10个OS Tick */
rt_thread_delay(10);
/* 循环10次后,退出线程1 */
if (count++ >= 10) {
break;
}
}
rt_kprintf("Thread1: End of Thread1! %d<br>",count);
}
//线程2的程序结构,增加了几处提示:
static void user_thread2_entry(void *parameter){
rt_uint8_t i, count = 0;
while (1){
rt_kprintf("===============Thread2 Start: %d<br>",count);
rt_kprintf("Thread2: Begin Try to Release Block!<br>");
for (i = 0 ; i < UPTRLENGTH; i ++) {
/* 释放所有分配成功的内存块 */
if (ptr* != RT_NULL){
rt_kprintf("Thread2 Release Block %d<br>", i);
rt_mp_free(ptr*);
ptr* = RT_NULL;
}
}
rt_kprintf("==============Thread2: Free ALL Block! %d<br>",i);
/* 休眠10个OS Tick */
rt_thread_delay(10);
/* 循环10次后,退出线程2 */
if (count++ >= 10) {
break;
}
}
rt_kprintf("Thread2: End of Thread2!!! %d<br>",count);
}
//作业内存池主函数
int user_mempool_sample_init(){
rt_uint8_t i;
for (i=0;i<UPTRLENGTH;i++){
*uptr*=RT_NULL;
}
/* 初始化内存池对象 */
user_mp=rt_mp_create("ump1", UPTRLENGTH, USIZE);
/* 创建线程1 */
utid1 = rt_thread_create("ut1", user_thread1_entry, RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY-1,THREAD_TIMESLICE);
if (utid1 != RT_NULL) {
rt_thread_startup(utid1);
};
/* 创建线程2 */
utid2 = rt_thread_create("ut2",user_thread2_entry, RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE);
if (utid2 != RT_NULL) {
rt_thread_startup(utid2);
}
return 0;
}
//注册函数为命令行模式
/* 如果设置了RT_SAMPLES_AUTORUN,则加入到初始化线程中自动运行 */
#if defined (RT_SAMPLES_AUTORUN) && defined(RT_USING_COMPONENTS_INIT)
INIT_APP_EXPORT(mempool_sample_init);
INIT_APP_EXPORT(user_mempool_sample_init);
#endif
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(mempool_sample_init, mempool sample);
MSH_CMD_EXPORT(user_mempool_sample_init, mempool sample);
https://www.rt-thread.org/qa/thread-7210-1-1.html
https://www.rt-thread.org/qa/thread-7211-1-1.html
https://www.rt-thread.org/qa/thread-7261-1-1.html
https://www.rt-thread.org/qa/thread-7262-1-1.html
https://www.rt-thread.org/qa/thread-7263-1-1.html
https://www.rt-thread.org/qa/thread-7264-1-1.html
https://www.rt-thread.org/qa/thread-7265-1-1.html
https://www.rt-thread.org/qa/thread-7266-1-1.html
https://www.rt-thread.org/qa/thread-7267-1-1.html
https://www.rt-thread.org/qa/thread-7268-1-1.html
https://www.rt-thread.org/qa/thread-7271-1-1.html
https://www.rt-thread.org/qa/thread-7272-1-1.html
https://www.rt-thread.org/qa/thread-7273-1-1.html
https://www.rt-thread.org/qa/thread-7274-1-1.html