OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4002|回复: 2

ucos ii 动态内存的问题

[复制链接]

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
发表于 2015-7-8 20:30:18 | 显示全部楼层 |阅读模式
5金钱
#include<includes.h>

#define  TASK_STK_SIZE  512

OS_STK        STARTTASK[TASK_STK_SIZE];
OS_STK        MYTASK[TASK_STK_SIZE];
OS_STK        YOUTASK[TASK_STK_SIZE];
OS_STK        HERTASK[TASK_STK_SIZE];

OS_MEM        *PMEM;
INT8U        MEM[8][6];
INT8U        err;
INT8U        *BLKP;    //内存块指针
OS_MEM_DATA MEMDATA;

char        *s;
char        *s1="mytask is running!";
char        *s2="youtask is running!";
char        *s3="hertask is running!";

void starttask(void *p);
void mytask(void *p);
void youtask(void *p);
void hertask(void *p);


void main(int args, char *argss[])
{
    OSInit();

    MEM=OSMemCreate(MEM,8,6,&err);
    OSTaskCreate(starttask,NULL,(OS_STK *)&STARTTASK[TASK_STK_SIZE-1],(INT8U)0);

    OSStart();
}
void starttask(void *p)
{
    p=p;

    OSTaskCreate(mytask,NULL,(OS_STK *)&MYTASK[TASK_STK_SIZE-1],(INT8U)3);
    OSTaskCreate(youtask,NULL,(OS_STK *)&YOUTASK[TASK_STK_SIZE-1],(INT8U)4);
    OSTaskCreate(hertask,NULL,(OS_STK *)&HERTASK[TASK_STK_SIZE-1],(INT8U)5);

    while(TRUE)
    {
        OSTimeDlyHMSM(0,0,3,0);
    }
}
void mytask(void *p)
{
    INT8U TIME;
    p=p;

    TIME=0;

    while(TRUE)
    {
        OS_Printf("%s\t",s1);
        BLKP=(INT8U *)OSMemGet(PMEM,&err);
        OSMemQuery(PMEM,&MEMDATA);
        s=(char *)MEMDATA.OSFreeList;
        OS_Printf("%0x\t",s);
        OS_Printf("%d\n",MEMDATA.OSNUsed);
        if(TIME>4)
        {
            OSMemPut(PMEM,BLKP);
            TIME=0;
        }
        TIME++;
        OSTimeDlyHMSM(0,0,1,0);
    }
}

void youtask(void *p)
{
    p=p;

    while(TRUE)
    {
        OS_Printf("%s\t",s2);
        BLKP=(INT8U *)OSMemGet(PMEM,&err);
        OSMemQuery(PMEM,&MEMDATA);
        s=(char *)MEMDATA.OSFreeList;
        OS_Printf("%0x\t",s);
        OS_Printf("%d\n",MEMDATA.OSNUsed);
        OSMemPut(PMEM,BLKP);
        OSTimeDlyHMSM(0,0,2,0);
    }
}

void hertask(void *p)
{
    p=p;

    while(TRUE)
    {
        OS_Printf("%s\t",s3);
        BLKP=(INT8U *)OSMemGet(PMEM,&err);
        OSMemQuery(PMEM,&MEMDATA);
        s=(char *)MEMDATA.OSFreeList;
        OS_Printf("%0x\t",s);
        OS_Printf("%d\n",MEMDATA.OSNUsed);
        OSMemPut(PMEM,BLKP);
        OSTimeDlyHMSM(0,0,2,0);
    }
}
这3个任务分别是Mytask Youtask Hertask。在应用程序中创建一个动态内存分区
该分区有8个内存块,每个内存块的长度是6字节。应用程序的任务Youtask Hertask都在任务运行后请求一个内存块.
随后就释放它;任务MYTASK也在任务运行后请求一个内存块,但是要在任务MYTASK运行6次后,才释放它所申请的内存块。
为了了解内存分区变化的情况,编写代码来观察分区头指针和已被使用内存块的个数。
但是我明明释放了内存,为什么他显示内存使用一直是递增的,而且但最后会卡住?

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
 楼主| 发表于 2015-7-8 20:30:19 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2015-7-8 23:09:20 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 14:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表