📄 ucos_memmanager.c
字号:
/****************************************************************************************************
* 电子科技大学嵌入式软件工程中心 版权所有 *
* *
* Copyright (C) 2006 UESTC ESEC *
****************************************************************************************************/
/*
* $Log:应用程序启动主文件 文件名 ,v$
*
* Revision 0.1 日期 时间 系统自动创建
* 创建本文件
*/
/**
* @file ucos_MemManager.c
* @brief
* <li>
* 功能: 演示内核的内存分配策略
* </li>
* <li>
* 设计思想:这个程序演示要体现内核的内存分配思想的策略。为此,设计了内存的分配和回收,完成一系列动作。
* </li>
* <p>
* 注:本程序只具备演示功能,不能保证适用于您的真实应用。如需使用,请根据您的实际需要修改本程序。
* </p>
* @author 赵庆明
* @date 2008-4-11
* <p>
* 部门:电子科技大学嵌入式软件工程中心
* </p>
*/
/******************************************* 引用部分 ************************************************/
#include "includes.h"
/******************************************* 定义部分 ************************************************/
#define TASK_STK_SIZE 512 // Size of each task's stacks (# of WORDs)
#define N_TASKS 3 // Number of identical tasks
#define TASK_START_ID 0 // Application tasks IDs
#define TASK_START_PRIO 10 // Application tasks priorities
#define TASK_1_PRIO 12
#define TASK_2_PRIO 13
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; // Tasks stacks
OS_STK TaskStartStk[TASK_STK_SIZE]; // TaskStart task stack
INT8U TaskData[N_TASKS]; // Parameters to pass to each task
void *CommMsg1; //为OSMemGet函数设置返回值存储。
void *CommMsg2; //为OSMemGet函数设置返回值存储。
void *CommMsg3;
OS_MEM *CommMem; //为OSMemCreate函数设置返回值存储。
INT8U CommBuf[2][128]; //初始化内存分配的空间。
OS_EVENT *mutex; // 1 mutual exclusive semaphore
/******************************************* 声明部分 ************************************************/
static void MemoryCreate(void);
static void MemInfo(void* /*pdata*/); //内存空间信息。
static void DispShow(void);
static void ReleaseMem(int /*i*/);
static void Task0(void* /*pdata*/); // Function prototypes of tasks
static void TaskStart(void* /*pdata*/); // Function prototypes of Startup task
static void TaskStartCreateTasks(void); // Function prototypes of creat task
/******************************************* 实现部分 ************************************************/
/**
* @brief
* main()函数,应用程序入口函数。
* @param[in] 无。
* @return 操作成功返回0;\n
* 出现问题返回1;
*/
static void MemoryCreate()
{
//为OSMemCreate函数设置包含错误码的变量的指针。
INT8U err;
//OSMemCreate()函数建立并初始化一块内存区。2块,每块128B。
CommMem = OSMemCreate(&CommBuf[0][0], 2, 128, &err);
}
/**
* @brief
* main()函数,应用程序入口函数。
* @param[in] 无。
* @return 操作成功返回0;\n
* 出现问题返回1;
*/
void MemInfo(void *pdata) //内存空间信息。
{
INT8U err; //为函数设置包含错误码的变量指针。
pdata = pdata;
OS_MEM_DATA mem_data;
err = OSMemQuery(CommMem, &mem_data); //OSMemQuery()函数得到内存区的信息。
}
/**
* @brief
* main()函数,应用程序入口函数。
* @param[in] 无。
* @return 操作成功返回0;\n
* 出现问题返回1;
*/
static void DispShow()
{
OS_MEM_DATA mem_data;
OSMemQuery(CommMem, &mem_data);
printf( "Begining Address of memory:\t%X\n\r",(int)(mem_data.OSAddr));
printf( "Block Size in the memory area:\t%d\n\r",(int)(mem_data.OSBlkSize));
printf( "Free Blocks in the memory area:\t%d\n\r", (int)(mem_data.OSNFree));
printf( "Used Blocks in the memory area:\t%d\n\r", (int)mem_data.OSNUsed);
printf("\n\n\n");
OSTimeDlyHMSM(0,0,2,0);
}
/**
* @brief
* main()函数,应用程序入口函数。
* @param[in] 无。
* @return 操作成功返回0;\n
* 出现问题返回1;
*/
void ReleaseMem(int i)
{
INT8U err;
switch(i)
{
case 3:
err=OSMemPut(CommMem,CommMsg3);
if (err == OS_NO_ERR)
{
printf("Released memory_3.\n\r"); /* 释放内存块 */
}
else
{
printf("NOT Exist memory_3.\n\r");
}
break;
case 2:
err=OSMemPut(CommMem,CommMsg2);
if (err == OS_NO_ERR)
{
printf("Released memory_2.\n\r"); /* 释放内存块 */
}
else
{
printf("NOT Exist memory_2.\n\r");
}
break;
case 1:
err=OSMemPut(CommMem,CommMsg1);
if (err == OS_NO_ERR)
{
printf("Released memory_1.\n\r"); /* 释放内存块 */
}
else
{
printf("NOT Exist memory_1.\n\r");
}
break;
default:
break;
}
}
/**
* @brief
* main()函数,应用程序入口函数。
* @param[in] 无。
* @return 操作成功返回0;\n
* 出现问题返回1;
*/
int main (void)
{
INT8U err=err;
UCOS_CPU_INIT(); // Install uC/OS-II's running hardware environment
OSInit(); // Initialize uC/OS-II
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
OSStart(); // Start multitasking
return 0;
}
/**
* @brief
* TaskStart()函数,启动任务。
* @param[in] void *。
* @return 无\n
*/
void TaskStart(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 // Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
cpu_sr = cpu_sr; // Avoid warnings
#endif
pdata = pdata; // Prevent compiler warning
UCOS_TIMER_START(); // Timer interrupter start
MemoryCreate();
TaskStartCreateTasks(); // Create all the application tasks
OSTaskSuspend(OS_PRIO_SELF); // Suspend the TaskStart
}
/**
* @brief
* TaskStartCreateTasks()函数,创建多任务。
* @param[in] void *。
* @return 无
*/
void TaskStartCreateTasks (void)
{
OSTaskCreate(Task0, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5);
}
/**
* @brief
* Task0()函数,执行一个任务。
* @param[in] void *。
* @return 无
*/
void Task0 (void *pdata)
{
INT8U err;
INT16S i=0;
MemInfo(pdata);
DispShow();
OSTimeDly(100); /* Wait 100tick */
for (;;)
{
if(i==0)
{
//申请内存区中的一块。
CommMsg1=OSMemGet(CommMem,&err); //申请内存区中的一块。
if (err == OS_NO_ERR)
{
printf("GOT memory_1.\n\r"); //内存块已经分配
}
else
{
printf("NOT got memory_1.\n\r");
}
MemInfo(pdata); //函数得到内存区的信息。
DispShow(); //将内存区信息显示到屏幕上。
OSTimeDly(100); // Wait 100tick
i++;
}
else if(i==3)
{
for(i=3;i>0;i--)
{
ReleaseMem(i); //释放一个内存块。
MemInfo(pdata); //函数得到内存区的信息
DispShow(); //将内存区信息显示到屏幕上。
OSTimeDly(10); //Wait 10tick
}
}
else if(i==1)
{
CommMsg2=OSMemGet(CommMem,&err); //申请内存区中的一块。
if (err == OS_NO_ERR)
{
printf("GOT memory_2.\n\r"); //内存块已经分配
}
else
{
printf("NOT got memory_2.\n\r");
}
MemInfo(pdata); //函数得到内存区的信息。
DispShow(); //将内存区信息显示到屏幕上。
OSTimeDly(100); // Wait 100tick
i++;
}
else
{
CommMsg3=OSMemGet(CommMem,&err);
if (err == OS_NO_ERR)
{
printf("GOT memory_3.\n\r"); //内存块已经分配
}
else
{
printf("NOT got memory_3.\n\r");
}
MemInfo(pdata); //函数得到内存区的信息。
DispShow(); //将内存区信息显示到屏幕上。
OSTimeDly(100); // Wait 100tick
i++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -