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