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

📄 mm.c

📁 基于ucos系统的内存管理实验,源码是随书光盘里的,如果要整个光盘的请与我联系
💻 C
字号:
/***************************************************************
 * 声明:
 *  本程序只具备演示功能,不能保证适用于您的真实应用。如需使用,请根据
 * 您的实际需要修改本程序。
 *******************************************************************
 *                      电子科技大学嵌入式软件工程中心 版权所有
 *
 *                  Copyright (C) 2006 UESTC ESEC
 **************************************************************/

/**************************************************************
 * 模块: init.c
 *
 * 目的:
 *      这个程序演示要体现内核的内存分配思想的策略。为此,设计了
        内存的分配和回收,完成一系列动作。
 **************************************************************/
/*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*
*********************************************************************************************************
*/

#include <stdio.h>
#include "/host/ide/workspace/ucos/src/includes.h"

/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define  TASK_STK_SIZE                 512       /* Size of each task's stacks (# of WORDs)            */
#define  N_TASKS                         3       /* Number of tasks                                    */

OS_STK        TaskStk[N_TASKS][TASK_STK_SIZE];        /* Tasks stacks                                  */
OS_STK        TaskStartStk[TASK_STK_SIZE];
INT8U         TaskData[N_TASKS];                      /* Parameters to pass to each task               */

INT8U  *CommMsg1;			//为OSMemGet函数设置返回值存储。
INT8U  *CommMsg2;			//为OSMemGet函数设置返回值存储。
INT8U  *CommMsg3;
INT8U  *CommMem;			//为OSMemCreate函数设置返回值存储。
INT8U   CommBuf[2][128];	//初始化内存分配的空间。

OS_STK        TaskStk[N_TASKS][TASK_STK_SIZE];        /* Tasks stacks                                  */
OS_STK        TaskStartStk[TASK_STK_SIZE];
INT8U         TaskData[N_TASKS];                      /* Parameters to pass to each task               */
OS_EVENT      *mutex;                                 /* 1 mutual exclusive semaphore*/

/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/

        void  Task(void *pdata);                       /* Function prototypes of tasks              */
        void  TaskStart(void *pdata);				   /* Function prototypes of Startup task       */
static  void  TaskStartCreateTasks(void);

/**************************** 定义部分 *****************************************/
static void MemoryCreate()
{
      INT8U err;			                                    //为OSMemCreate函数设置包含错误码的变量的指针。

      CommMem = OSMemCreate(&CommBuf[0][0], 2, 128, &err);		//OSMemCreate()函数建立并初始化一块内存区。2块,每块128B。
}

/*
*************************************************************************************************************
*                                                MAIN
*************************************************************************************************************
*/

extern void main(void);

/*
 *
 * **********************************************************************************************************
 *
 */

void boot_card()
{
	ucBsp_init();                                               /* Initializa ucBsp                        */

    main();
}

extern void OSCpuInit();

extern void OS_Sched(void);

void  main (void)
{

	INT8U err;                                             /* for setting the mutex                    */

 	OSCpuInit();                                           /* Install uC/OS-II's context switch vector */

    OSInit();                                              /* Initialize uC/OS-II                      */

     

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1],4);

    OSStart();                                             /* Start multitasking                       */
}

/*
*******************************************************************************************
给用户显示内存空间的状态信息。
*******************************************************************************************
*/

void MemInfo(void *pdata)	//内存空间信息。
{
      INT8U        err;		//为函数设置包含错误码的变量指针。

      pdata = pdata;
	  OS_MEM_DATA mem_data;
      err = OSMemQuery(CommMem, &mem_data);	//OSMemQuery()函数得到内存区的信息。
}

/*
*********************************************************************************************
显示用函数。
*********************************************************************************************
*/

static void DispShow()
	{
    INT8U        err;
    INT8U		 s[4][50];

	OS_MEM_DATA mem_data;

	OSMemQuery(CommMem, &mem_data);

	printk( "the pointer to the begining of memory address is: %d\n",(int)(mem_data.OSAddr));
	printk( "the size of blocks in this memory area is: %d\n",(int)(mem_data.OSBlkSize));
	printk( "the number of free blocks in this memory area is: %d\n", (int)(mem_data.OSNFree));
	printk( "the number of using blocks in this memory area is: %d\n", (int)mem_data.OSNUsed);
	printk("\n\n\n");
	OSTimeDlyHMSM(0,0,2,0);
}

/*
*********************************************************************************************************
*                                              STARTUP TASK
*********************************************************************************************************
*/

void  TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3                                    /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif

    INT16S     key;

	pdata = pdata;                                              /* Prevent compiler warning                */

	OS_ENTER_CRITICAL();

    ucos_x86_idt_set_handler(0x20,(void *)OSTickISR,0x8e00);    /* Install uC/OS-II's clock tick ISR        */
	ucos_timer_init();                                          /* Reprogram tick rate                      */

    OS_EXIT_CRITICAL();
    MemoryCreate();
    TaskStartCreateTasks();                         /* Create all the application tasks         */
    OSTaskSuspend(OS_PRIO_SELF);                              /* Suspend the TaskStart                    */
}


/*
*********************************************************************************************************
*                                        INITIALIZE THE DISPLAY
*********************************************************************************************************
*/


void ReleaseMem(int i)
{
	INT8U err;
	switch(i)
	{
		case 3:err=OSMemPut(CommMem,CommMsg3);
		    	if (err == OS_NO_ERR)
		    	 {
            		printk("Third memory has been released.\n");                    /* 释放内存块     */
        		 }
				else
				{
					printk("Third memory didn't exist.\n");
				}
		break;

		case 2:err=OSMemPut(CommMem,CommMsg2);
		    	if (err == OS_NO_ERR)
		    	 {
            		printk("Second memory has been released.\n");                   /* 释放内存块     */
        		 }
				else
				{
					printk("Second memory didn't been releasd.\n");
				}
		break;

		case 1:err=OSMemPut(CommMem,CommMsg1);
		    	if (err == OS_NO_ERR)
		    	 {
            		printk("First memory has been released.\n");                     /* 释放内存块     */
        		 }
				else
				{
					printk("First memory didn't been releasd.\n");
				}
		break;
	}
}

/*
*********************************************************************************************************
*                                             CREATE TASKS
*********************************************************************************************************
*/

static  void  TaskStartCreateTasks (void)
{
    INT8U  i;


          OSTaskCreate(Task, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5);

}

/*
*********************************************************************************************************
*                                                  TASKS
*********************************************************************************************************
*/

void  Task (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)
			{
				printk("First memory application HAS accept.\n");       /* 内存块已经分配 */
        	}
			else
			{
				printk("First memory alpplication NOT accept.\/n");
			}

		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)
			{
				printk("Second memory application HAS accept.\n");       /* 内存块已经分配 */
        	}
			else
			{
				printk("Second memory alpplication NOT accept.\n");
			}


		MemInfo(pdata);								                     //函数得到内存区的信息。

		DispShow();									                     //将内存区信息显示到屏幕上。

		OSTimeDly(100);                 			                     /*wait 100tick                */

		i++;
		}
		else
		{
			CommMsg3=OSMemGet(CommMem,&err);
			if (err == OS_NO_ERR)
			{
				printk("Third memory application HAS accept.\n");         /* 内存块已经分配 */
        	}
			else
			{
				printk("Third memory alpplication NOT accept.\n");
			}

			MemInfo(pdata);

			DispShow();

			OSTimeDly(100);

			i++;
		}
			}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -