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

程序运行,创建一个内存池,一个申请内存任务,一个释放内存任务,
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值