📄 test.c
字号:
/****************************************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 + -