uC/OS-II实验程序之一(事件标志)

来源:互联网 发布:日本建筑风格特点知乎 编辑:程序博客网 时间:2024/05/18 00:16

关键函数:OSFlagCreate,OSFlagPost,OSFlagPend

环境:uC/OS-II? 2.52 + Pacific C for DOS

描述:共有3个标志ENGINE_OIL_PRES_OK、ENGINE_OIL_TEMP_OK、ENGINE_START?,1个进程TaskPend,1个进程TaskPost。TaskPost修改时间标志组,TaskPend等待时间标志组。

/*
*********************************************************************************************************
*??????????????????????????????????????????????? uC/OS-II
*????????????????????????????????????????? The Real-Time Kernel
*
*?????????????????????????? (c) Copyright 2004, Yuan Fei, Hefei University of Technology
*?????????????????????????????????????????? All Rights Reserved
*
*
*
* Filename???? : test.c
* Programmer(s): yuan fei
* DESCRIPTION? : This file illustrate the usage of flags.
*
*********************************************************************************************************
*/

#include "includes.h"

/*
*********************************************************************************************************
*?????????????????????????????????????????????? CONSTANTS
*********************************************************************************************************
*/

#define? TASK_STK_SIZE???????????????? 128?????? /* Size of each task's stacks (# of WORDs)??????????? */
#define? N_TASKS???????????????????????? 2?????? /* Number of identical tasks????????????????????????? */

#define ENGINE_OIL_PRES_OK?????????? 0x01
#define ENGINE_OIL_TEMP_OK??????????? 0x02
#define ENGINE_START????????????????? 0x04

/*
*********************************************************************************************************
*?????????????????????????????????????????????? VARIABLES
*********************************************************************************************************
*/

OS_STK??????? TaskStk[N_TASKS][TASK_STK_SIZE];??????? /* Tasks stacks????????????????????????????????? */
OS_STK??????? TaskStartStk[TASK_STK_SIZE];

OS_FLAG_GRP? *EngineStatus;

INT8U???????? CurLine = 0;??????????????????????????
/*
*********************************************************************************************************
*?????????????????????????????????????????? FUNCTION PROTOTYPES
*********************************************************************************************************
*/

??????? void? TaskStart(void *data);????????????????? /* Function prototypes of Startup task?????????? */
static? void? TaskPend(void *data);?????????????????? /* 等待信号的进程??????????????????????????????? */
static? void? TaskPost(void *data);?????????????????? /* 发送信号的进程??????????????????????????????? */


/*
*********************************************************************************************************
*??????????????????????????????????????????????? MAIN
*********************************************************************************************************
*/

void? main (void)
{
??
??? PC_DispClrScr(DISP_FGND_WHITE + 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 */

???
??? OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
??? OSStart();???????????????????????????????????????????? /* Start multitasking?????????????????????? */
}


/*
*********************************************************************************************************
*????????????????????????????????????????????? STARTUP TASK
*********************************************************************************************************
*/
void? TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3??????????????????????????????? /* Allocate storage for CPU status register */
??? OS_CPU_SR? cpu_sr;
#endif
??? INT16S???? key;
??? INT8U????? err;

??? pdata = pdata;???????????????????????????????????????? /* Prevent compiler warning???????????????? */

??? OS_ENTER_CRITICAL();
??? PC_VectSet(0x08, OSTickISR);?????????????????????????? /* Install uC/OS-II's clock tick ISR??????? */
??? PC_SetTickRate(OS_TICKS_PER_SEC);????????????????????? /* Reprogram tick rate????????????????????? */
??? OS_EXIT_CRITICAL();
???
??? EngineStatus = OSFlagCreate(0, &err);


??? OSTaskCreate(TaskPost, 0, &TaskStk[0][TASK_STK_SIZE - 1], 2);
??? OSTaskCreate(TaskPend, 0, &TaskStk[1][TASK_STK_SIZE - 1], 3);

??? for (;;) {
??????? if (PC_GetKey(&key) == TRUE) {???????????????????? /* See if key has been pressed????????????? */
??????????? if (key == 0x1B) {???????????????????????????? /* Yes, see if it's the ESCAPE key????????? */
??????????????? PC_DOSReturn();??????????????????????????? /* Return to DOS??????????????????????????? */
??????????? }
??????? }
???????

??????? OSTimeDlyHMSM(0, 0, 1, 0);???????????????????????? /* Wait one second????????????????????????? */
??? }
}

?

?

static? void? TaskPost(void *pdata)
{
??? INT8U?? err;
??? INT8U?? time = 0;
???
??? pdata = pdata;
???
??? for (;;) {
?????
??????? if (CurLine > 24)
??????????? CurLine = 0;
??????? PC_DispClrRow(CurLine, DISP_BGND_BLACK);
??????? switch (time) {
??????????? case 0:
??????????????? OSFlagPost(EngineStatus, ENGINE_OIL_PRES_OK, OS_FLAG_SET, &err);
??????????????? PC_DispStr(0, CurLine, "Posting ENGINE_OIL_PRES_OK", DISP_FGND_BLUE);
??????????????? time += 1;
??????????????? break;
??????????? case 1:
??????????????? OSFlagPost(EngineStatus, ENGINE_OIL_TEMP_OK, OS_FLAG_SET, &err);
??????????????? PC_DispStr(0, CurLine, "Posting ENGINE_OIL_TEMP_OK", DISP_FGND_BLUE);
??????????????? time += 1;
??????????????? break;
??????????? case 2:
??????????????? OSFlagPost(EngineStatus, ENGINE_START, OS_FLAG_SET, &err);
??????????????? PC_DispStr(0, CurLine, "Posting ENGINE_START", DISP_FGND_BLUE);
??????????????? time += 1;
??????????????? break;
??????????? default:
??????????????? OSFlagPost(EngineStatus,
?????????????????????????? ENGINE_OIL_PRES_OK +
?????????????????????????? ENGINE_OIL_TEMP_OK +
?????????????????????????? ENGINE_START,
?????????????????????????? OS_FLAG_CLR,
?????????????????????????? &err);
??????????????? PC_DispStr(0, CurLine, "Clearing EngineStatus", DISP_FGND_YELLOW);
??????????????? time = 0;
??????? }
??????? CurLine += 1;
??????? OSTimeDlyHMSM(0, 0, 1, 0);
??? }
}

?

static? void? TaskPend(void *pdata)
{
??? INT8U?????? err;

??? pdata = pdata;
???
??? for (;;) {
??????? if (CurLine > 24)
??????????? CurLine = 0;
??????? OSFlagPend(EngineStatus,
?????????????????? ENGINE_OIL_PRES_OK +
?????????????????? ENGINE_OIL_TEMP_OK +
?????????????????? ENGINE_START,
?????????????????? OS_FLAG_WAIT_SET_ALL,
?????????????????? 0,
?????????????????? &err);
??????? PC_DispClrRow(CurLine, DISP_BGND_BLACK);
??????? PC_DispStr(0, CurLine, "EngineStarted !", DISP_FGND_RED);
???????
??????? CurLine += 1;
??????? OSTimeDlyHMSM(0, 0, 0, 300);
??? }
}

原创粉丝点击