?? ex2.c
字號:
/**************************************************************************
* *
* PROJECT : ARM port for uC/OS-II *
* *
* MODULE : EX2.c *
* *
* AUTHOR : Michael Anburaj *
* URL : http://geocities.com/michaelanburaj/ *
* EMAIL: michaelanburaj@hotmail.com *
* *
* PROCESSOR : Any *
* *
* TOOL-CHAIN : Any *
* *
* DESCRIPTION : *
* This is a sample code (Ex2) to test uC/OS-II. *
* *
**************************************************************************/
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #2
*********************************************************************************************************
*/
#include "includes.h"
#include "consol.h"
/* ********************************************************************* */
/* Global definitions */
/* ********************************************************************* */
/* File local definitions */
#define TASK_STK_SIZE 256 /* Size of each task's stacks (# of WORDs) */
#define TASK_START_ID 0 /* Application tasks IDs */
#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 TASK_START_PRIO+1
#define TASK_1_PRIO TASK_START_PRIO+2
#define TASK_2_PRIO TASK_START_PRIO+3
#define TASK_3_PRIO TASK_START_PRIO+4
#define TASK_4_PRIO TASK_START_PRIO+5
#define TASK_5_PRIO TASK_START_PRIO+6
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 *AckMbox; /* Message mailboxes for Tasks #4 and #5 */
OS_EVENT *TxMbox;
/* ********************************************************************* */
/* Local functions */
/*
*********************************************************************************************************
* 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 */
INT8U i;
pdata = pdata;
for (;;) {
CONSOL_Printf("\n\nPRI TOT REM USD\n");
for (i = 0; i < 7; i++) {
err = OSTaskStkChk(TASK_START_PRIO + i, &data);
if (err == OS_NO_ERR) {
CONSOL_Printf("%02d: %4ld %4ld %4ld\n",
TASK_START_PRIO + i,
data.OSFree + data.OSUsed,
data.OSFree,
data.OSUsed);
}
}
CONSOL_Printf("-------------------\n");
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 (;;) {
CONSOL_SendChar('|');
OSTimeDly(10);
CONSOL_SendChar('/');
OSTimeDly(10);
CONSOL_SendChar('-');
OSTimeDly(10);
CONSOL_SendChar('\\');
OSTimeDly(10);
}
}
/*
*********************************************************************************************************
* TASK #3
*
* Description: This task displays a counter-clockwise rotating wheel on the screen.
*
* Note(s) : I allocated 500 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 (;;) {
CONSOL_SendChar('|');
OSTimeDly(20);
CONSOL_SendChar('\\');
OSTimeDly(20);
CONSOL_SendChar('-');
OSTimeDly(20);
CONSOL_SendChar('/');
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 (;;) {
OSMboxPost(TxMbox, (void *)&txmsg); /* Send message to Task #5 */
OSMboxPend(AckMbox, 0, &err); /* Wait for acknowledgement from Task #5 */
txmsg++; /* Next message to send */
if (txmsg == 'Z') {
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 */
CONSOL_SendChar(*rxmsg);
OSTimeDlyHMSM(0, 0, 1, 0); /* Wait 1 second */
OSMboxPost(AckMbox, (void *)1); /* Acknowledge reception of msg */
}
}
/*
*********************************************************************************************************
* CLOCK TASK
*********************************************************************************************************
*/
void TaskClk (void *data)
{
data = data;
for (;;) {
OSTimeDly(OS_TICKS_PER_SEC);
}
}
static void TaskStartCreateTasks (void)
{
OSTaskCreateExt(TaskClk,
(void *)0,
&TaskClkStk[TASK_STK_SIZE - 1],
TASK_CLK_PRIO,
TASK_CLK_ID,
&TaskClkStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
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);
OSTaskCreateExt(Task3,
(void *)0,
&Task3Stk[TASK_STK_SIZE - 1],
TASK_3_PRIO,
TASK_3_ID,
&Task3Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task4,
(void *)0,
&Task4Stk[TASK_STK_SIZE-1],
TASK_4_PRIO,
TASK_4_ID,
&Task4Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task5,
(void *)0,
&Task5Stk[TASK_STK_SIZE-1],
TASK_5_PRIO,
TASK_5_ID,
&Task5Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
void TaskStart (void *pdata)
{
char key;
pdata = pdata; /* Prevent compiler warning */
CONSOL_Printf("uC/OS-II, The Real-Time Kernel ARM Ported version\n");
CONSOL_Printf("Jean J. Labrosse/ (Ported by) Michael Anburaj\n");
CONSOL_Printf("EXAMPLE #2\n");
CONSOL_Printf("Determining CPU's capacity ...\n");
OSStatInit(); /* Initialize uC/OS-II's statistics */
AckMbox = OSMboxCreate((void *)0); /* Create 2 message mailboxes */
TxMbox = OSMboxCreate((void *)0);
TaskStartCreateTasks(); /* Create all other tasks */
CONSOL_Printf("\n# Parameter1: No. Tasks\n");
CONSOL_Printf("# Parameter2: CPU Usage in %%\n");
CONSOL_Printf("# Parameter3: No. Task switches/sec\n");
CONSOL_Printf("<-PRESS 'ESC' TO QUIT->\n");
for (;;)
{
CONSOL_Printf(":%d", OSTaskCtr); /* Display #tasks running */
CONSOL_Printf(" %d", OSCPUUsage); /* Display CPU usage in % */
CONSOL_Printf(" %d:\n", OSCtxSwCtr); /* Display #context switches per second */
if(CONSOL_GetChar(&key) == True)
{ /* See if key has been pressed */
if(key == 0x1B) /* Yes, see if it's the ESCAPE key */
while(1); /* Stay here for ever */
}
OSCtxSwCtr = 0; /* Clear context switch counter */
OSTimeDly(OS_TICKS_PER_SEC); /* Wait one second */
}
}
/* ********************************************************************* */
/* Global functions */
void APP_vMain (void)
{
OS_STK *ptos;
OS_STK *pbos;
INT32U size;
OSInit(); /* Initialize uC/OS-II */
ptos = &TaskStartStk[TASK_STK_SIZE - 1]; /* TaskStart() will use Floating-Point */
pbos = &TaskStartStk[0];
size = TASK_STK_SIZE;
OSTaskCreateExt(TaskStart,
(void *)0,
ptos,
TASK_START_PRIO,
TASK_START_ID,
pbos,
size,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
FRMWRK_vStartTicker(OS_TICKS_PER_SEC); /* os_cfg.h */
OSStart(); /* Start multitasking */
}
/* ********************************************************************* */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -