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

实验描述:
。。。

涉及的μ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);

实验结果:
μC/OS-II实验:实验五 内存管理_第1张图片
TaskMem1申请内存空间,TaskMem2释放内存空间。
注意:成功获取内存的条件是(pmemmsg[i] != (void*)NULL && err == OS_NO_ERR)。

参考资料及配套代码:
uCOS-II 实验指导书
ucos_Demo
注意:是参考这个资料没错,但是我把他放在最后是有原因的,因为好几个实验(几乎每个⊙﹏⊙b汗)的概念或者代码有问题,我前面都指出来,不清楚的可以下下来比较一下。

你可能感兴趣的:(操作系统篇:μC/OS-II)