📄 appmain.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #2
*********************************************************************************************************
*/
#include "includes.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_3_ID 4
#define TASK_4_ID 5
#define TASK_START_PRIO 10 /* Application tasks priorities */
#define TASK_1_PRIO 12
#define TASK_2_PRIO 13
#define TASK_3_PRIO 14
#define TASK_4_PRIO 15
/*
*********************************************************************************************************
* 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_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 task stack */
OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 task stack */
OS_EVENT *Mbox1; /* Message mailboxes for Tasks #4 and #5 */
OS_EVENT *Mbox2;
OS_EVENT *Mbox3; /* Message mailboxes for Tasks #4 and #5 */
OS_EVENT *Mbox4;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void TaskStart(void *data); /* Function prototypes of tasks */
static void TaskStartCreateTasks(void);
static void TaskStartDispInit(void);
static void TaskStartDisp(void);
void Task1(void* pdata);
void Task2(void* pdata);
void Task3(void* pdata);
void Task4(void* pdata);
extern void vInitLED(void);
extern void vInitKey(void);
extern void vSingleOn(unsigned char num);
extern void vSingleOff(unsigned char num);
/*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void main (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;
OSTaskStkInit_C33209(&ptos, &pbos, &size, 0);
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);
init_timer();
Start_Timer();
vInitKey();
vInitLED();
OSStart(); /* Start multitasking */
}
void TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata; /* Prevent compiler warning */
OSStatInit(); /* Initialize uC/OS-II's statistics */
Mbox1 = OSMboxCreate((void *)0); /* Create 2 message mailboxes */
Mbox2 = OSMboxCreate((void *)0);
Mbox3 = OSMboxCreate((void *)0);
Mbox4 = OSMboxCreate((void *)0);
TaskStartCreateTasks(); /* Create all other tasks */
for (;;) {
asm(" nop ");
OSCtxSwCtr = 0; /* Clear context switch counter */
OSTimeDly(OS_TICKS_PER_SEC); /* Wait one second */
}
}
/*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
static void TaskStartCreateTasks (void)
{
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);
}
/*
*********************************************************************************************************
* 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;
INT16U time; /* Execution time (in uS) */
for (;;) {
OSMboxPend(Mbox1, 0, &err);
vSingleOff(1);
OSTimeDly(OS_TICKS_PER_SEC); /* Delay for 100 mS */
vSingleOn(1);
}
}
/*
*********************************************************************************************************
* TASK #2
*
* Description: This task displays a clockwise rotating wheel on the screen.
*********************************************************************************************************
*/
void Task2 (void* pdata)
{
INT8U err;
INT16U time;
for (;;) {
OSMboxPend(Mbox2, 0, &err);
vSingleOff(2);
OSTimeDly(OS_TICKS_PER_SEC); /* Delay for 100 mS */
vSingleOn(2);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 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* pdata)
{
INT8U err;
INT16U time;
for (;;) {
OSMboxPend(Mbox3, 0, &err);
vSingleOff(3);
OSTimeDly(OS_TICKS_PER_SEC); /* Delay for 100 mS */
vSingleOn(3);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 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* pdata)
{
INT8U err;
INT16U time;
for (;;) {
OSMboxPend(Mbox4, 0, &err);
vSingleOff(4);
OSTimeDly(OS_TICKS_PER_SEC); /* Delay for 100 mS */
vSingleOn(4);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -