📄 ex123l.c.rtf
字号:
*********************************************************************************************************
* TASK #1
* Description: This task executes every 100 mS and measures the time it task to perform stack checking
* for each of the 5 application tasks. Also, this task displays the statistics related to
* each task's stack usage.
*********************************************************************************************************
void Task1 (void *pdata)
{
INT8U err;
OS_STK_DATA data; /* Storage for task stack data */
INT16U time; /* Execution time (in uS) */
INT8U i;
char s[80];
pdata = pdata;
for (;;) {
for (i = 0; i < 7; i++) {
PC_ElapsedStart();
err = OSTaskStkChk(TASK_START_PRIO+i, &data);
time = PC_ElapsedStop();
if (err == OS_NO_ERR) {
sprintf(s, "%3ld %3ld %3ld %5d",
data.OSFree + data.OSUsed,
data.OSFree,
data.OSUsed,
time);
PC_DispStr(19, 12+i, s, DISP_FGND_YELLOW);
}
}
OSTimeDlyHMSM(0, 0, 0, 100); /* Delay for 100 mS */
}
}
*********************************************************************************************************
* TASK #2
** Description: This task displays a clockwise rotating wheel on the screen.
*********************************************************************************************************
void Task2 (void *data)
{
data = data;
for (;;) {
PC_DispChar(70, 15, '|', DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(10);
PC_DispChar(70, 15, '/', DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(10);
PC_DispChar(70, 15, '-', DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(10);
PC_DispChar(70, 15, '\\', DISP_FGND_WHITE + DISP_BGND_RED);
OSTimeDly(10);
}
}
*********************************************************************************************************
* TASK #3
* Description: This task displays a counter-clockwise rotating wheel on the screen.
* Note(s) : I allocated 100 bytes of storage on the stack to artificially 'eat' up stack space.
*********************************************************************************************************
void Task3 (void *data)
{
char dummy[500];
INT16U i;
data = data;
for (i = 0; i < 499; i++) { /* Use up the stack with 'junk' */
dummy[i] = '?';
}
for (;;) {
PC_DispChar(70, 16, '|', DISP_FGND_WHITE + DISP_BGND_BLUE);
OSTimeDly(20);
PC_DispChar(70, 16, '\\', DISP_FGND_WHITE + DISP_BGND_BLUE);
OSTimeDly(20);
PC_DispChar(70, 16, '-', DISP_FGND_WHITE + DISP_BGND_BLUE);
OSTimeDly(20);
PC_DispChar(70, 16, '/', DISP_FGND_WHITE + DISP_BGND_BLUE);
OSTimeDly(20);
}
}
*********************************************************************************************************
* TASK #4
* Description: This task sends a message to Task #5. The message consist of a character that needs to
* be displayed by Task #5. This task then waits for an acknowledgement from Task #5
* indicating that the message has been displayed.
*********************************************************************************************************
void Task4 (void *data)
{
char txmsg;
INT8U err;
data = data;
txmsg = 'A';
for (;;) {
while (txmsg <= 'Z') {
OSMboxPost(TxMbox, (void *)&txmsg); /* Send message to Task #5 */
OSMboxPend(AckMbox, 0, &err); /* Wait for acknowledgement from Task #5 */
txmsg++; /* Next message to send */
}
txmsg = 'A'; /* Start new series of messages */
}
}
*********************************************************************************************************
* TASK #5
* Description: This task displays messages sent by Task #4. When the message is displayed, Task #5
* acknowledges Task #4.
*********************************************************************************************************
void Task5 (void *data)
{
char *rxmsg;
INT8U err;
data = data;
for (;;) {
rxmsg = (char *)OSMboxPend(TxMbox, 0, &err); /* Wait for message from Task #4 */
PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW + DISP_BGND_RED);
OSTimeDlyHMSM(0, 0, 1, 0); /* Wait 1 second */
OSMboxPost(AckMbox, (void *)1); /* Acknowledge reception of msg */
}
}
*********************************************************************************************************
* CLOCK TASK
*********************************************************************************************************
*void TaskClk (void *data)
{
struct time now;
struct date today;
char s[40];
data = data;
for (;;) {
PC_GetDateTime(s);
PC_DispStr(0, 24, s, DISP_FGND_BLUE + DISP_BGND_CYAN);
OSTimeDly(OS_TICKS_PER_SEC);
}
}
EX3L.C
#define EX3_GLOBALS
#include "includes.h"
#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
#define TASK_START_ID 0 /* Application tasks */
#define TASK_CLK_ID 1
#define TASK_1_ID 2
#define TASK_2_ID 3
#define TASK_3_ID 4
#define TASK_4_ID 5
#define TASK_5_ID 6
#define TASK_START_PRIO 10 /* Application tasks priorities */
#define TASK_CLK_PRIO 11
#define TASK_1_PRIO 12
#define TASK_2_PRIO 13
#define TASK_3_PRIO 14
#define TASK_4_PRIO 15
#define TASK_5_PRIO 16
#define MSG_QUEUE_SIZE 20 /* Size of message queue used in example */
OS_STK TaskStartStk[TASK_STK_SIZE]; /* Startup task stack */
OS_STK TaskClkStk[TASK_STK_SIZE]; /* Clock task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 task stack */
OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 task stack */
OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 task stack */
OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 task stack */
OS_STK Task5Stk[TASK_STK_SIZE]; /* Task #5 task stack */
OS_EVENT *MsgQueue; /* Message queue pointer */
void *MsgQueueTbl[20]; /* Storage for messages */
void TaskStart(void *data); /* Function prototypes of tasks */
void TaskClk(void *data);
void Task1(void *data);
void Task2(void *data);
void Task3(void *data);
void Task4(void *data);
void Task5(void *data);
void main (void)
{
PC_DispClrScr(DISP_BGND_BLACK); /* 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 */
strcpy(TaskUserData[TASK_START_ID].TaskName, "StartTask");
OSTaskCreateExt(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE-1], TASK_START_PRIO,
TASK_START_ID, &TaskStartStk[0], TASK_STK_SIZE, &TaskUserData[TASK_START_ID], 0);
OSStart(); /* Start multitasking */
}
void TaskStart (void *data)
{
char s[80];
INT16S key;
data = data; /* Prevent compiler warning */
PC_DispStr(26, 0, "uC/OS-II, The Real-Time Kernel", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
PC_DispStr(33, 1, "Jean J. Labrosse", DISP_FGND_WHITE);
PC_DispStr(36, 3, "EXAMPLE #3", DISP_FGND_WHITE);
PC_DispStr(0, 9, "Task Name Counter Exec.Time(uS) Tot.Exec.Time(uS) %Tot.", DISP_FGND_WHITE);
PC_DispStr(0, 10, "----------------- ------- ------------- ----------------- -----", DISP_FGND_WHITE);
PC_DispStr(0, 22, "Determining CPU's capacity ...", DISP_FGND_WHITE);
PC_DispStr(28, 24, "<-PRESS 'ESC' TO QUIT->", DISP_FGND_WHITE + DISP_BLINK);
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();
MsgQueue = OSQCreate(&MsgQueueTbl[0], MSG_QUEUE_SIZE); /* Create a message queue */
strcpy(TaskUserData[TASK_CLK_ID].TaskName, "Clock Task");
OSTaskCreateExt(TaskClk, (void *)0, &TaskClkStk[TASK_STK_SIZE-1], TASK_CLK_PRIO,
TASK_CLK_ID, &TaskClkStk[0], TASK_STK_SIZE, &TaskUserData[TASK_CLK_ID], 0);
strcpy(TaskUserData[TASK_1_ID].TaskName, "MsgQ Tx Task");
OSTaskCreateExt(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE-1], TASK_1_PRIO,
TASK_1_ID, &Task1Stk[0], TASK_STK_SIZE, &TaskUserData[TASK_1_ID], 0);
strcpy(TaskUserData[TASK_2_ID].TaskName, "MsgQ Rx Task #1");
OSTaskCreateExt(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE-1], TASK_2_PRIO,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -