μC/OS-II实验:实验五 内存管理
来源:互联网 发布:网络犯罪的特征有哪些 编辑:程序博客网 时间:2024/05/16 23:44
实验描述:
。。。
涉及的μC/OS-II系统函数:
。。。
实验代码:
app.c
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);
}
}
{
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
2
3
4
5
#define MSGSIZE 3
GLOBAL OS_MEM *pmem; //为OSMemCreate函数设置返回值存储
GLOBAL void* pmemmsg[3]; //为OSMemGet函数设置返回值存储
GLOBAL INT8U MemBuf[2][128]; //初始化内存分配的空间
GLOBAL OS_MEM *pmem; //为OSMemCreate函数设置返回值存储
GLOBAL void* pmemmsg[3]; //为OSMemGet函数设置返回值存储
GLOBAL INT8U MemBuf[2][128]; //初始化内存分配的空间
app_cfg.h
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);
#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
2
3
4
5
/* 实验五 内存管理 */
pmem = OSMemCreate(MemBuf, 2, 128, &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);
pmem = OSMemCreate(MemBuf, 2, 128, &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)。
参考资料及配套代码:
uCOS-II 实验指导书
ucos_Demo
注意:是参考这个资料没错,但是我把他放在最后是有原因的,因为好几个实验(几乎每个⊙﹏⊙b汗)的概念或者代码有问题,我前面都指出来,不清楚的可以下下来比较一下。
- μC/OS-II实验:实验五 内存管理
- μC/OS-II实验:实验一 任务的基本管理
- μC/OS-II实验:实验四 消息队列
- μC/OS-II实验:实验二 优先级反转及解决方法
- μC/OS-II实验:实验三 信号量: 哲学家就餐问题
- μC/OS-II实时操作系统内存管理的改进
- uC/OS-II实验程序之三(任务管理)
- µC/OS-II内存管理
- 利用C语言内存管理模拟实验
- 【OS实验四】存储管理(仿真实验)
- 操作系统实验-内存管理
- C++-实验-项目五
- uC/OS-II 学习笔记:信号量实验
- uc/os-ii实验1:信号量
- uc/os-ii 实验2:信号量
- uc/os-ii 实验3:优先级反转
- UC/OS - II内存管理
- UC/OS II 内存管理
- Ubuntu12.04安装Xen4
- 排序算法--归并排序
- μC/OS-II实验:实验四 消息队列
- could not initialize proxy - no Session
- SDJZ 计算圆的周长
- μC/OS-II实验:实验五 内存管理
- Tarjan离线算法求最近公共祖先(LCA)
- xend调用xenstore的出错揭秘
- code style
- BIRT使用2:安装、一般使用顺序
- Paxos算法证明
- Android 四大组件理解.
- Android Camera系列开发 (二)通过Intent录制视频
- UML软件