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

📄 test.c.bak

📁 ucos 的内存管理机制探究
💻 BAK
字号:

#include "includes.h"

#define  TASK_STK_SIZE   512				//任务堆栈长度

OS_STK   StartTaskStk[TASK_STK_SIZE];		//定义任务堆栈区
OS_STK	 MyTaskStk[TASK_STK_SIZE];
OS_MEM	*IntBuffer;							/*内存控制块指针*/		
INT8U	IntPart[4][6];						/*空间数组*//*四块,每块6个字节*/
INT32U	*IntBlkPtr[4];						/*存储获取内存块的指针-32位为了能显示原来存在的链表指针数据*/

INT16S   key;								//用于退出uCOS_II的键	
INT8U   err;
INT8U	x=0,y=0;							//字符显示位置

void  StartTask(void *data);
void  MyTask(void *data);		

void  Quitkey(void);

/************************主函数*********************************************/
void  main (void)
{
    OSInit();							//初始化uCOS_II
    PC_DOSSaveReturn();					//保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);			//安装uCOS_II中断

    IntBuffer=OSMemCreate(IntPart,4,6,&err);
	if(err!=OS_NO_ERR)
		{PC_DispStr(20,20,"Mem create error",DISP_BGND_BLACK+DISP_FGND_WHITE);}/*检测是否创建成功*/
    OSTaskCreate(StartTask,0,&StartTaskStk[TASK_STK_SIZE - 1],5);		
    OSStart();			
}

//*****************************StartTask********************************************
void  StartTask(void *pdata)
{
    pdata=pdata;
    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);
    PC_SetTickRate(OS_TICKS_PER_SEC);
    OS_EXIT_CRITICAL();
//  OSStatInit();

    OSTaskCreate(MyTask,0,&MyTaskStk[TASK_STK_SIZE - 1],6);

	OSTaskSuspend(OS_PRIO_SELF);	

}
//*****************************MyTask********************************************
void  MyTask (void *pdata)
{
   char temp[20];
    pdata = pdata; 


    for (;;) 
	{	
/*Do some display init*/
		PC_DispStr(2,8,"Get Order",DISP_BGND_BLACK+DISP_FGND_WHITE);
		PC_DispStr(5,9,"0123:",DISP_BGND_BLACK+DISP_FGND_WHITE);
		PC_DispStr(34,8,"Put Order",DISP_BGND_BLACK+DISP_FGND_WHITE);
		PC_DispStr(34,9,"0123:",DISP_BGND_BLACK+DISP_FGND_WHITE);
		PC_DispStr(34,10,"3210:",DISP_BGND_BLACK+DISP_FGND_WHITE);
		PC_DispStr(34,11,"0312:",DISP_BGND_BLACK+DISP_FGND_WHITE);
/*第一次获取内存块然后放回*/
		for(x=0;x<4;x++)
		{

			IntBlkPtr[x]=(INT32U *)OSMemGet(IntBuffer,&err);
			sprintf(temp,"%d",*IntBlkPtr[x]);
			PC_DispStr(11+x*6,9,temp,DISP_BGND_BLACK+DISP_FGND_YELLOW);
		}
		for(x=0;x<4;x++)
		{

			OSMemPut(IntBuffer,IntBlkPtr[3-x]);
		}
/*第二次获取内存块然后逆序放回*/
		for(x=0;x<4;x++)
		{
			IntBlkPtr[x]=(INT32U *)OSMemGet(IntBuffer,&err); /*强制转换为32位数据指针为了能显示原来存在的链表指针数据*/
			sprintf(temp,"%d",*IntBlkPtr[x]);
			PC_DispStr(11+x*6,10,temp,DISP_BGND_BLACK+DISP_FGND_YELLOW);
		}
		for(x=0;x<4;x++)
		{
			OSMemPut(IntBuffer,IntBlkPtr[x]);
		}
/*第三次获取内存块然后乱序放回0312*/
		for(x=0;x<4;x++)
		{
			IntBlkPtr[x]=(INT32U *)OSMemGet(IntBuffer,&err);
			sprintf(temp,"%d",*IntBlkPtr[x]);
			PC_DispStr(11+x*6,11,temp,DISP_BGND_BLACK+DISP_FGND_YELLOW);
		}

		OSMemPut(IntBuffer,IntBlkPtr[0]);
		OSMemPut(IntBuffer,IntBlkPtr[3]);
		OSMemPut(IntBuffer,IntBlkPtr[1]);
		OSMemPut(IntBuffer,IntBlkPtr[2]);
/*第四次获取内存块*/
		for(x=0;x<4;x++)
		{
			IntBlkPtr[x]=(INT32U *)OSMemGet(IntBuffer,&err);
			sprintf(temp,"%d",*IntBlkPtr[x]);
			PC_DispStr(11+x*6,12,temp,DISP_BGND_BLACK+DISP_FGND_YELLOW);
		}
       		Quitkey();
		OSTimeDlyHMSM(0,1,0,0);
        }
}
//*****************************Quitkey()********************************************
void Quitkey(void)
{
	if(PC_GetKey(&key)==TRUE)
	{
		if(key==0x1B)
			{PC_DOSReturn();}
	}
}

⌨️ 快捷键说明

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