⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucos_memmanager.c

📁 ucosDEMO程序,可以模拟实现任务管理
💻 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 + -