RT-Thread物联网操作系统介绍:15、静态内存池使用

  • Post author:
  • Post category:其他


程序运行,创建一个内存池,一个申请内存任务,一个释放内存任务,

usb串口CN3打印内存分配和释放的信息,串口波特率115200

工程参考例程在:


RT-Thread物联网操作系统介绍


在这里插入图片描述

//创建内存池
    Sample_mp = rt_mp_create("Sample_mp",
                            20,              /* 内存块数量 */
                            30);             /* 内存块大小 */
    if (Sample_mp != RT_NULL)
        rt_kprintf("静态内存池创建成功!\n\n");
rt_kprintf("正在向内存池申请内存...........\n");
		p_Sample = rt_mp_alloc(Sample_mp,0);
		if(RT_NULL == p_Sample)/* 没有申请成功 */
			rt_kprintf("静态内存申请失败!\n");
		else
			rt_kprintf("静态内存申请成功,地址为%d!\n\n",p_Sample);

		rt_kprintf("正在向p_test写入数据...........\n");
		*p_Sample = i;
		rt_kprintf("已经写入p_test地址的数据\n");
		rt_kprintf("*p_test = %.4d ,地址为:%d \n\n", *p_Sample,p_Sample);
rt_err_t uwRet = RT_EOK;
    rt_kprintf("正在释放内存...........\n");
    rt_mp_free(p_Sample);
    rt_kprintf("释放内存成功!\n\n");
    rt_kprintf("正在删除内存...........\n");
    uwRet = rt_mp_delete(Sample_mp);
    if(RT_EOK == uwRet)
        rt_kprintf("删除内存成功!\n");
#include "MyIncludes.h"

/* 定义内存池控制块 */
static rt_mp_t  Sample_mp = RT_NULL;  

/* 定义申请内存的指针 */
static rt_uint32_t *p_Sample = RT_NULL;

static rt_thread_t TASK1_Thread = RT_NULL;
/*******************************************************************************
* Function Name  : TASK1_Thread_Process
* Description    : 任务1线程函数
* Input          : None
* Output         : None
* Return         : None
* Note			 : None
*******************************************************************************/
static void TASK1_Thread_Process(void* parameter)
{	
    rt_kprintf("正在向内存池申请内存...........\n");

    p_Sample = rt_mp_alloc(Sample_mp,0);
    if(RT_NULL == p_Sample)/* 没有申请成功 */
        rt_kprintf("静态内存申请失败!\n");
    else
        rt_kprintf("静态内存申请成功,地址为%d!\n\n",p_Sample);

    rt_kprintf("正在向p_test写入数据...........\n");
    *p_Sample = 1234;
    rt_kprintf("已经写入p_test地址的数据\n");
    rt_kprintf("*p_test = %.4d ,地址为:%d \n\n", *p_Sample,p_Sample);

    while(1)
    {
        LED_Toggle(LED_R);       //翻转LED
        rt_thread_delay(1000);     //每1000ms扫描一次
    }
}

static rt_thread_t TASK2_Thread = RT_NULL;
/*******************************************************************************
* Function Name  : TASK2_Thread_Process
* Description    : 任务2线程函数
* Input          : None
* Output         : None
* Return         : None
* Note			 : None
*******************************************************************************/
static void TASK2_Thread_Process(void* parameter)
{	
    rt_err_t uwRet = RT_EOK;
    rt_kprintf("正在释放内存...........\n");
    rt_mp_free(p_Sample);
    rt_kprintf("释放内存成功!\n\n");
    rt_kprintf("正在删除内存...........\n");
    uwRet = rt_mp_delete(Sample_mp);
    if(RT_EOK == uwRet)
        rt_kprintf("删除内存成功!\n");

    while (1)
    {
        LED_Toggle(LED_B);       //翻转LED
        rt_thread_mdelay(500);     //每500ms扫描一次		
    }
}

int main(void)
{
    /* 
    * 开发板硬件初始化,RTT系统初始化已经在main函数之前完成,
    * 即在component.c文件中的rtthread_startup()函数中完成了。
    * 所以在main函数中,只需要创建线程和启动线程即可。
    */
    //创建内存池
    Sample_mp = rt_mp_create("Sample_mp",
                            20,              /* 内存块数量 */
                            30);             /* 内存块大小 */
    if (Sample_mp != RT_NULL)
        rt_kprintf("静态内存池创建成功!\n\n");
    
    //申请内存线程
	TASK1_Thread =                        /* 线程控制块指针 */
	rt_thread_create("TASK1",             /* 线程名字 */
                    TASK1_Thread_Process, /* 线程入口函数 */
                    RT_NULL,             /* 线程入口函数参数 */
                    512,                 /* 线程栈大小 */
                    12,                   /* 线程的优先级 */
                    20);                 /* 线程时间片 */
								 
	/* 启动线程,开启调度 */
    if (TASK1_Thread != RT_NULL)
        rt_thread_startup(TASK1_Thread);
    else		
        return -1;
    
    //释放内存线程
    TASK2_Thread =                        /* 线程控制块指针 */
	rt_thread_create("TASK2",             /* 线程名字 */
                    TASK2_Thread_Process, /* 线程入口函数 */
                    RT_NULL,             /* 线程入口函数参数 */
                    512,                 /* 线程栈大小 */
                    15,                   /* 线程的优先级 */
                    20);                 /* 线程时间片 */
								 
	/* 启动线程,开启调度 */
    if (TASK2_Thread != RT_NULL)
        rt_thread_startup(TASK2_Thread);
    else		
        return -1;
}



版权声明:本文为weixin_43352501原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。