现在的位置: 首页 > 综合 > 正文

μC/OS-II实验:实验五 内存管理

2013年08月14日 ⁄ 综合 ⁄ 共 2387字 ⁄ 字号 评论关闭
实验描述:
。。。
涉及的μC/OS-II系统函数:
。。。
实验代码:
 app.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
static void ShowMemInfo(void)
{
    OS_MEM_DATA mem_data;
    OSMemQuery(pmem,&mem_data);
    
    printf( "Begining Address of memory:\t%X\r\n",(int)(mem_data.OSAddr));
    printf( "Block Size in the memory area:\t%d\r\n",(int)(mem_data.OSBlkSize));
    printf( "Free Blocks in the memory area:\t%d\r\n", (int)(mem_data.OSNFree));
    printf( "Used Blocks in the memory area:\t%d\r\n", (int)mem_data.OSNUsed);
    printf("\r\n\n");
    OSTimeDlyHMSM(0,0,2,0);
}
static void GetMem(INT8U i)
{
    INT8U err;
    
    //申请内存空间

    pmemmsg[i] = OSMemGet(pmem,&err);
    if(pmemmsg[i] != (void*)NULL && err == OS_NO_ERR)
    {
        printf("GOT memory_%d.\r\n",i);     //内存块已经分配
        ShowMemInfo();
    }
    else
        printf("NOT got memory_%d.\r\n",i);

}

static void PutMem(void* pmemmsg,INT8U i)
{
    INT8U err;
    //释放内存空间
    err = OSMemPut(pmem,pmemmsg);
    if(err == OS_NO_ERR)
    {
        printf("Released memory_%d.\r\n",i);    /* 释放内存块     */
        ShowMemInfo();
    }
    else
        printf("NOT Exist memory_%d.\r\n",i);
}

void TaskMem1(void* pdata)
{
    INT8U i;
    i = 0;
    
    while(1)
    {
        GetMem(i++ % MSGSIZE);
        OSTimeDlyHMSM(0,0,2,0);
    }
}

void TaskMem2(void* pdata)
{
    INT8U i;
    i = 0;
    
    while(1)
    {
        PutMem(pmemmsg[i++ % MSGSIZE],i++ % MSGSIZE);
        OSTimeDlyHMSM(0,0,2,0);
    }
}

 app.h
1
2
3
4
5
#define MSGSIZE         3
GLOBAL  OS_MEM *pmem;           //为OSMemCreate函数设置返回值存储
GLOBAL  void* pmemmsg[3];           //为OSMemGet函数设置返回值存储
GLOBAL  INT8U MemBuf[2][128];   //初始化内存分配的空间
 app_cfg.h
1
2
3
4
5
6
7
8
9
10
11
#define MEM1_STK_SIZE       64
#define MEM2_STK_SIZE       64

#define MEM1_TASK_PRIO      20
#define MEM2_TASK_PRIO      21

GLOBAL OS_STK TASK_MEM1_STK[MEM1_STK_SIZE];
GLOBAL OS_STK TASK_MEM2_STK[MEM2_STK_SIZE];

void TaskMem1(void* pdata);
void TaskMem2(void* pdata);

 main.c:TaskStart
1
2
3
4
5
/* 实验五  内存管理 */
pmem = OSMemCreate(MemBuf, 2128, &err);

OSTaskCreate(TaskMem1, 0, (OS_STK *)&TASK_MEM1_STK[MEM1_STK_SIZE - 1], MEM1_TASK_PRIO);
OSTaskCreate(TaskMem2, 0, (OS_STK *)&TASK_MEM2_STK[MEM2_STK_SIZE - 1], MEM2_TASK_PRIO);

实验结果:
TaskMem1申请内存空间,TaskMem2释放内存空间。
注意:成功获取内存的条件是(pmemmsg[i] != (void*)NULL && err == OS_NO_ERR)。
参考资料及配套代码:
注意:是参考这个资料没错,但是我把他放在最后是有原因的,因为好几个实验(几乎每个⊙﹏⊙b汗)的概念或者代码有问题,我前面都指出来,不清楚的可以下下来比较一下。

抱歉!评论已关闭.