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

📄 test.c

📁 该程序是本人在ucos_ii基础上调用基本函数了解内存分区变化
💻 C
📖 第 1 页 / 共 2 页
字号:

/****************************************Copyright (c)**************************************************
**                                                uC/OS-II
**                                          The Real-Time Kernel
**
**                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
**                                           All Rights Reserved
**
**                          
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: test.c
**创   建   人: 周峤
**最后修改日期: 2009年4月1日
**描        述:  了解内存分区变化,显示分区头指针,已使用内存块个数,总数,未使用个数(OSMemQuery)
**             创建动态内存分区(OSMemCreate)
**             分区A有64个内存块,每个内存块的长度为32个字节
**             分区B有64个内存块,每个内存块的长度为128个字节
**             任务Task1运行也请求一个32字节内存块(OSMemGet分区A),Task1运行3次后才释放它所申请有内存块
**             任务Task2申请一个60字节的内存块(OSMemGet分区A或分区B),然后释放
**             任务Task3任务运行请求一个128字节内存块(OSMemGet分区B),随后就释放(OSMemPut)
**             任务Task4和Task5任务共享资源的访问,使用二值信号量(初值为1),运行请求一个32字节 内存块(OSMemGet),随后就释放(OSMemPut)
**             任务Task6运行请求一个32字节内存块(OSMemGetA),随后就释放(OSMemPut)
**             任务Task7显示运行请求一个32字节内存块(OSMemGetA),随后就释放(OSMemPut)
**             任务ClkTask显示当前的日期              
**               
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 周峤
** 版  本: v2.0
** 日 期: 2009年3月18日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 周峤
** 版  本: v2.1
** 日 期: 2009年4月1日
** 描 述: 根据时间显示申请释放内存的信息
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "includes.h"

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

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

#define  BlockNum                       64   //分区块数量
#define  BlockSize                      32    //块大小

#define  Task1Prio                      5  //Task1任务的优先级
#define  Task2Prio                      6 
#define  Task3Prio                      7 
#define  Task4Prio                      8
#define  Task5Prio                      9 
#define  Task6Prio                      10
#define  Task7Prio                      3
#define  TaskClkPrio                    4

#define  Task1y                         7 //显示Task1任务的纵坐标
#define  Task2y                         8
#define  Task3y                         9
#define  Task4y                         10
#define  Task5y                         11
#define  Task6y                         12

/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/
OS_STK       StartTaskStk[TASK_STK_SIZE];//定义任务堆栈区
OS_STK       TaskClkStk[TASK_STK_SIZE]; 
OS_STK       Task1Stk[TASK_STK_SIZE];
OS_STK       Task2Stk[TASK_STK_SIZE];
OS_STK       Task3Stk[TASK_STK_SIZE];
OS_STK       Task4Stk[TASK_STK_SIZE];
OS_STK       Task5Stk[TASK_STK_SIZE];
OS_STK       Task6Stk[TASK_STK_SIZE];
OS_STK       Task7Stk[TASK_STK_SIZE];

OS_MEM       *IntBufferA;    //定义内存控制块(分区)指针
OS_MEM       *IntBufferB;


INT8U        IntPartA[BlockNum][BlockSize]; //划分分区及内存块
INT8U        IntPartB[BlockNum][BlockSize*4];


INT8U        *IntBlkPtr;    //定义指针
INT8U        *IntBlkPtr1;    //定义指针

OS_MEM_DATA  MemInfo;

OS_EVENT     *Sem;//声明信号量 

OS_EVENT     *MsgQueue;//声明消息队列
void         *MsgQueueTbl[20];//消息指针数组

INT16S       key;         //用于退出uc/os2的键

char *s;
char *s1     =  "Task1";
char *s2     =  "Task2";
char *s3     =  "Task3";
char *s4     =  "Task4";
char *s5     =  "Task5";
char *s6     =  "Task6";

char *sget1  =  "+1A get!";//成功请求内存块
char *sget2A =  "+2A get!";
char *sget2B =  "+2B get!";
char *sget3B =  "+3B get!";
char *sget4  =  "+4A get!";
char *sget5  =  "+5A get!";
char *sget6  =  "+6A get!";

char *sput1  =  "-a put!";//释放内存块
char *sput2  =  "-a put!";
char *sput3  =  "-b put!";
char *sput4  =  "-a put!";
char *sput5  =  "-a put!";
char *sput6  =  "-a put!";

INT8U time   =  0;

INT8U y      =  6;  
INT8U err;    

/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/
		void  StartTask(void *pdata);//声明任务
		void  Task1(void *pdata);  
		void  Task2(void *pdata);
		void  Task3(void *pdata);
		void  Task4(void *pdata);  
		void  Task5(void *pdata);
		void  Task6(void *pdata);
		void  Task7(void *pdata);
		void  TaskClk(void *pdata);
static  void  TaskStartCreateTasks(void);
static  void  TaskStartDispInit (void);
static  void  TaskStartDisp (void);
static  void  MemDataDisp(INT8U y,OS_MEM_DATA MemInfo);

/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/
void  main (void)
{
	PC_DispClrScr(DISP_FGND_WHITE); 

	OSInit();//初始化uc/os2

	Sem=OSSemCreate(1);

	PC_DOSSaveReturn();//保存DOS环境
	PC_VectSet(uCOS,OSCtxSw);//安装uc/os2任务切换中断向量

	//创建内存分区A
	IntBufferA=OSMemCreate(IntPartA,   //内存分区首地址
		BlockNum,    //分区内内存块的数目
		BlockSize,    //每个内存块的长度
		&err
		);
    //创建内存分区B
	IntBufferB=OSMemCreate(IntPartB,BlockNum,BlockSize*4,&err);

	MsgQueue=OSQCreate(&MsgQueueTbl[0],20);//创建消息队列

	OSTaskCreate(StartTask,             //创建任务StartTask
		(void *) 0,                         //给任务传递参数
		&StartTaskStk[TASK_STK_SIZE-1], //设置任务堆栈栈顶指针
		0                            //StartTask 优先级为0
		);

	OSStart();//启动多任务管理
	                                            
}

/*
*********************************************************************************************************
**                                            CREATE TASKS
** 函数名称: StartTask
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
** 参数:  pdata:是一个指向非强制性数据区域的指针,当任务优先运行时传递参数给任务
** 返回: 无
*********************************************************************************************************
*/

void StartTask(void *pdata)
{
	
	char *c="StartTask";

#if OS_CRITICAL_METHOD==3
	OS_CPU_SR cpu_sr;
#endif

	pdata=pdata;

	OS_ENTER_CRITICAL();
	PC_VectSet(0x08,OSTickISR);         //安装uc/os2时钟中断向量
	PC_SetTickRate(OS_TICKS_PER_SEC);   //设置uc/os2时钟频率
	OS_EXIT_CRITICAL();

    TaskStartDispInit ();//初始化屏幕

	OSStatInit();     //初始化uc/os2的统计任务

    TaskStartCreateTasks();//创建多个任务
	
	for ( ; ; )
	{
		TaskStartDisp(); //屏幕数据更新

	//如果按下ESC键,则退出uc/os2
		if (PC_GetKey(&key)==TRUE)
		{
			if (key==0x1B)
			{
				PC_DOSReturn();//返回DOS
			}
		}
		OSTimeDlyHMSM(0,0,4,0);//等待4秒
	}
}

/*
*********************************************************************************************************
**                                            TASKS --Task1
** 函数名称: Task1
** 功能描述: 任务Task1运行请求一个32字节内存块(OSMemGet分区A),Task1运行3次后才释放它所申请有内存块           
** 参数:  pdata:是一个指向非强制性数据区域的指针,当任务优先运行时传递参数给任务
** 返回: 无
*********************************************************************************************************
*/
void Task1(void *pdata)
{
	char msg[20];

	strcpy(&msg[0],sget1);
      

#if OS_CRITICAL_METHOD==3
	OS_CPU_SR cpu_sr;
#endif

	pdata=pdata;
                     
	for ( ; ; )
	{
	
		PC_DispStr(5,Task1y,s1,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
	
		IntBlkPtr=OSMemGet(IntBufferA,&err);//请求内存块
		
		PC_DispStr(70,Task1y,sget1,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
	    
		OSQPost(MsgQueue,(void *)&msg[0]); //发送成功请求的消息	
		
		OSMemQuery(IntBufferA,&MemInfo);//查询内存控制块信息

		MemDataDisp(Task1y,MemInfo);//显示分区数据

		if (time>3)
		{
			OSMemPut(IntBufferA,IntBlkPtr);//释放内存块
			PC_DispStr(70,Task1y,sput1,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
		}
		time++;
		OSTimeDlyHMSM(0,0,3,0);//等待3秒
	}
}

/*
*********************************************************************************************************
**                                            TASKS --Task2
** 函数名称: Task2
** 功能描述: 任务Task2申请一个60字节的内存块(OSMemGet分区A或分区B),然后释放           
** 参数:  pdata:是一个指向非强制性数据区域的指针,当任务优先运行时传递参数给任务
** 返回: 无
*********************************************************************************************************
*/
 
void Task2(void *pdata)
{ 
	char msg[20];
	char msg1[20];

	strcpy(&msg[0],sget2A);
	strcpy(&msg1[0],sget2B);

#if OS_CRITICAL_METHOD==3
	OS_CPU_SR cpu_sr;
#endif

	pdata=pdata;
                     
	for ( ; ; )
	{
		PC_DispStr(5,Task2y,s2,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
	
		OSMemQuery(IntBufferA,&MemInfo);//查询内存控制块信息
		if (MemInfo.OSNFree>=2)//申请60KB,需两个内存块
		{
			IntBlkPtr=OSMemGet(IntBufferA,&err);//请求内存块
			OSQPost(MsgQueue,(void *)&msg[0]); //发送成功请求的消息	
			PC_DispStr(70,Task2y,sget2A,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

			IntBlkPtr1=OSMemGet(IntBufferA,&err);//请求内存块
			OSQPost(MsgQueue,(void *)&msg[0]); //发送成功请求的消息	
			PC_DispStr(70,Task2y,sget2A,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
			
			MemDataDisp(Task2y,MemInfo);//显示分区数据

			OSTimeDly(20);

			OSMemPut(IntBufferA,IntBlkPtr);//释放内存块	
			PC_DispStr(70,Task2y,sput2,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
		
			OSMemPut(IntBufferA,IntBlkPtr1);//释放内存块
			PC_DispStr(70,Task2y,sput2,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
			
		}
		else
		{	
			OSMemQuery(IntBufferB,&MemInfo);//查询内存控制块信息
			if (MemInfo.OSNFree>=1)
			{
				IntBlkPtr=OSMemGet(IntBufferB,&err);//请求内存块
			
				OSQPost(MsgQueue,(void *)&msg1[0]); //发送成功请求的消息		
				PC_DispStr(70,Task2y,sget2B,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
				
				MemDataDisp(Task2y,MemInfo);//显示分区数据
			
				OSTimeDly(20);
				OSMemPut(IntBufferB,IntBlkPtr1);//释放内存块

				PC_DispStr(70,Task2y,sput2,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

			}
			else
				OSTimeDly(1);
		}

		OSTimeDlyHMSM(0,0,2,0);//等待1秒
	}

}

/*
*********************************************************************************************************
**                                            TASKS --Task3
** 函数名称: Task1
** 功能描述: 任务Task3任务运行请求一个128字节内存块(OSMemGet分区B),随后就释放(OSMemPut)           
** 参数:  pdata:是一个指向非强制性数据区域的指针,当任务优先运行时传递参数给任务
** 返回: 无
*********************************************************************************************************
*/
void Task3(void *pdata)
{
		char msg[20];

	strcpy(&msg[0],sget3B);

⌨️ 快捷键说明

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