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

📄 ex2l.c

📁 uC/os原码 ,大家可以自由下载研究,共同进步, 共同研究,有心得共享呀
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
*                                           All Rights Reserved
*
*                                                 V2.00
*
*                                               EXAMPLE #2
*********************************************************************************************************
*/

#include "includes.h"
#include "string.h"

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

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

#define          TASK_START_ID       0                /* Application tasks IDs                         */
#define          TASK_1_ID           2
#define          TASK_2_ID           3

#define          TASK_START_PRIO    10                /* Application tasks priorities                  */
#define          TASK_1_PRIO        11
#define          TASK_2_PRIO        12

#define			 MSG_QUEUE_SIZE		20

#define  	 	 MAX_Y		    	30
#define  	 	 MAX_X  	   	    78

#define			 START_Y			 8
#define			 LEN_Y				14
#define			 START_X			 0

/*
*********************************************************************************************************
*                                              	 TYPES
*********************************************************************************************************
*/

struct MsgType {
	UBYTE		 TaskID;
	UBYTE		 Info;
};

/*
*********************************************************************************************************
*                                              VARIABLES
*********************************************************************************************************
*/

OS_STK           TaskStartStk[TASK_STK_SIZE];         /* Startup    task stack                         */
OS_STK           Task1Stk[TASK_STK_SIZE];             /* Task #1    task stack                         */
OS_STK           Task2Stk[TASK_STK_SIZE];             /* Task #2    task stack                         */

OS_EVENT        *MsgQueue;                            /* Message queue pointer                         */
void            *MsgQueueTbl[MSG_QUEUE_SIZE];         /* Storage for messages                          */

char		 	 ScrCache[MAX_Y][MAX_X + 1];
UBYTE 		 	 NowY;
INT16S			 PosY;

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

void             TaskStart(void *data);               /* Function prototypes of tasks                  */
void             Task1(void *data);
void             Task2(void *data);

void		 	 Display(void);
void			 DispLine(char *s);
void   		 	 DispChar(UBYTE i, UBYTE j, char s);
void			 DispStr(UBYTE i, UBYTE j, char *s);
void			 DispSign(void);
void		 	 InitWindow(void);
void		 	 Move(UBYTE x);
void			 DisplaySign(UBYTE i, UBYTE j);
void			 CacheOver(void);
void			 Command(char *sCmd);
void			 CmdWork(UBYTE index, char *sPara);

void			 colputchar(char ch);
void			 colprintn(int n, const char* fmt );
void			 colprintf(float n, const char* fmt );
void			 colprint(const char*,...);

/*$PAGE*/
/*
*********************************************************************************************************
*                                                  MAIN
*********************************************************************************************************
*/

void main (void)
{
	PC_DispClrScr(DISP_FGND_WHITE);                        /* Clear the screen                         */
	OSInit();                                              /* Initialize uC/OS-II                      */
	PC_DOSSaveReturn();                                    /* Save environment to return to DOS        */
	PC_VectSet(uCOS, OSCtxSw);                             /* Install uC/OS-II's context switch vector */
	PC_ElapsedInit();                                      /* Initialized elapsed time measurement     */
	OSTaskCreateExt(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE-1],
					TASK_START_PRIO, TASK_START_ID, &TaskStartStk[0], TASK_STK_SIZE,
					(void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
	OSStart();                                             /* Start multitasking                       */
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                               STARTUP TASK
*********************************************************************************************************
*/

void  TaskStart (void *data)
{
	char   s[80];
	INT16S key;
	INT16S temp;
	INT16S pos;

	data = data;                                           /* Prevent compiler warning                 */

	PC_DispStr(26,  0, "uC/OS-II, The Real-Time Kernel", DISP_FGND_WHITE);
	PC_DispStr(33,  1, "Jean J. Labrosse", DISP_FGND_WHITE);
	PC_DispStr(36,  3, "SHELL TEST", DISP_FGND_WHITE);
	PC_DispStr(28, 24, "<-PRESS 'ESC' TO QUIT->", DISP_FGND_WHITE);

	OS_ENTER_CRITICAL();                                   /* Install uC/OS-II's clock tick ISR        */
	PC_VectSet(0x08, OSTickISR);
	PC_SetTickRate(OS_TICKS_PER_SEC);                      /* Reprogram tick rate                      */
	OS_EXIT_CRITICAL();
	OSStatInit();                                          /* Initialize uC/OS-II's statistics         */

	MsgQueue = OSQCreate(&MsgQueueTbl[0], MSG_QUEUE_SIZE); /* Create a message queue                   */

	OSTaskCreateExt(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE-1],
					TASK_1_PRIO, TASK_1_ID, &Task1Stk[0], TASK_STK_SIZE,
					(void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

	OSTaskCreateExt(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE-1],
					TASK_2_PRIO, TASK_2_ID, &Task2Stk[0], TASK_STK_SIZE,
					(void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

	InitWindow();

	pos = 1;
	temp = 0;

	for (;;) {

		if (PC_GetKey(&key)) {                             /* See if key has been pressed              */
			if (((key >= 'a' && key <= 'z') ||
				 (key >= 'A' && key <= 'Z') ||
				 (key >= '0' && key <= '9') ||
				 (key == 0x20)) && temp == 0) {
				if (PosY < NowY) {
					PC_DispChar(START_X + MAX_X + 1, ((LEN_Y - 2) * NowY -1)/
								(MAX_Y - LEN_Y) + START_Y + 1,	0xB0,
								DISP_FGND_WHITE + DISP_BGND_BLUE);

					NowY = PosY;
					Display();
					DispSign();
					PC_DispChar(START_X + MAX_X + 1, ((LEN_Y - 2) * NowY -1)/
								(MAX_Y - LEN_Y) + START_Y + 1, 0x12,
								DISP_FGND_BLACK + DISP_BGND_BLUE);
				}
				if (PosY >= NowY + LEN_Y) {
					PC_DispChar(START_X + MAX_X + 1, ((LEN_Y - 2) * NowY -1)/
								(MAX_Y - LEN_Y) + START_Y + 1, 0xB0,
								DISP_FGND_WHITE + DISP_BGND_BLUE);

					NowY = PosY - LEN_Y + 1;
					Display();
					DispSign();
					PC_DispChar(START_X + MAX_X + 1, ((LEN_Y - 2) * NowY -1)/
								(MAX_Y - LEN_Y) + START_Y + 1, 0x12,
								DISP_FGND_BLACK + DISP_BGND_BLUE);
				}
				if (pos < MAX_X - 1) {
					if (key >= 'A' && key <= 'Z') s[pos - 1] = key + 0x20;
					else s[pos - 1] = key;
					DispChar(pos, PosY, key);
					pos++;
					DisplaySign(pos, PosY);
				}
			}
			switch (key)
			{
				case 0x00:
					temp = 1;
					break;
				case 0x1B:  	                           /* Yes, see if it's the ESCAPE key          */
					PC_DOSReturn();                        /* Return to DOS                            */
					break;
				case 0x48:
					if (temp == 1) { Move(0x00); temp = 0; }
					DisplaySign(pos, PosY);
					break;
				case 0x50:
					if (temp == 1) { Move(0x01); temp = 0; }
					DisplaySign(pos, PosY);
					break;
				case 0x4B:
					if (temp == 1) temp = 0;
					break;
				case 0x4D:
					if (temp == 1) temp = 0;
					break;
				case 0x08:
					DispChar(pos, PosY, 0x20);
					pos--; pos = pos < 1 ? 1 : pos;
					DisplaySign(pos, PosY);
					break;
				case 0x0D:
					if (PosY < NowY + LEN_Y - 1) {
						if (PosY < MAX_Y - 1) PosY++;
						else CacheOver();
					}
					else
					{
						if (PosY < MAX_Y - 1) PosY++;
						else CacheOver();
						Move(0x01);
					}
					Display();
					s[pos - 1] = '\0';
					pos = 1;
					DispSign();
					DisplaySign(pos, PosY);
					if (s[0] != '\0') Command(s);
					break;
			}
		}
		OSTimeDly(20);
	}
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                               TASK #1
*********************************************************************************************************
*/

void  Task1 (void *data)
{
	char 	c;
	UBYTE	num;
	UBYTE	flag;
	UBYTE	speed;
	struct MsgType *RMsg;
	struct MsgType  PMsg;

	data = data;
	num	= 0;
	flag = 1;
	speed = 10;

	PC_DispStr(14, 5, "Test Object One:", DISP_FGND_WHITE);

	for (;;) {
		RMsg = (struct MsgType *)OSQAccept(MsgQueue);
		if (RMsg != NULL) {
			if (RMsg->TaskID != 0x01) {
				OSQPostFront(MsgQueue,(void *)RMsg);
			}
			else {
				flag = (RMsg->Info >= 0x80);
				speed = 1000 / (RMsg->Info & 0x7F);
				PMsg.TaskID = 0x00;
				PMsg.Info = 0x01;
				OSQPost(MsgQueue,(void *)&PMsg);
			}
		}
		switch(num) {
			case 0: c = '|'; break;
			case 1: c = '/'; break;
			case 2: c = '-'; break;
			case 3: c = '\\'; break;
		}
		PC_DispChar(30, 5, c,  DISP_FGND_WHITE + DISP_BGND_RED);
		if (flag != 0) if (num != 3) num++; else num = 0;
		else if (num != 0) num--; else num = 3;
		OSTimeDly(speed);
	}
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                               TASK #2
*********************************************************************************************************
*/

void  Task2 (void *data)
{
	char 	c;
	UBYTE	num;
	UBYTE	flag;
	UBYTE	speed;
	struct MsgType *RMsg;
	struct MsgType  PMsg;

	data = data;
	num	= 0;
	flag = 0;
	speed = 20;

	PC_DispStr(47, 5, "Test Object Two:", DISP_FGND_WHITE);

	for (;;) {
		RMsg = (struct MsgType *)OSQAccept(MsgQueue);
		if (RMsg != NULL) {
			if (RMsg->TaskID != 0x02) {
				OSQPostFront(MsgQueue,(void *)RMsg);
			}
			else {
				flag = (RMsg->Info >= 0x80);
				speed = 1000 / (RMsg->Info & 0x7F);
				PMsg.TaskID = 0x00;
				PMsg.Info = 0x02;
				OSQPost(MsgQueue,(void *)&PMsg);
			}
		}
		switch(num) {
			case 0: c = '|'; break;
			case 1: c = '/'; break;
			case 2: c = '-'; break;
			case 3: c = '\\'; break;
		}
		PC_DispChar(63, 5, c,  DISP_FGND_WHITE + DISP_BGND_BLUE);
		if (flag != 0) if (num != 3) num++; else num = 0;
		else if (num != 0) num--; else num = 3;
		OSTimeDly(speed);
	}
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                              Display()
*********************************************************************************************************
*/

void Display(void)
{
	UBYTE i;

	for (i = 0; i < LEN_Y; i++)
		PC_DispStr(START_X + 1, i + START_Y, ScrCache[i + NowY],
				   DISP_FGND_WHITE + DISP_BGND_BLUE);
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                              DispChar()
*********************************************************************************************************
*/

void   DispChar(UBYTE i,UBYTE j,char s)
{
	ScrCache[j][i] = s;
	if (j >= NowY && j < NowY + LEN_Y)
		PC_DispChar(START_X + i + 1, j + START_Y - NowY, s,
					DISP_FGND_WHITE + DISP_BGND_BLUE);
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                             InitWindow()
*********************************************************************************************************
*/

void   InitWindow(void)
{
	UBYTE  i;
	char   s[MAX_X + 3];

	NowY = 0;

	for (i = 0; i < MAX_Y; i++) {
		memset(ScrCache[i], 0x20, MAX_X);

⌨️ 快捷键说明

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