Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- *********************************************************************************************************
- * uC/OS-II
- * The Real-Time Kernel
- *
- * (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
- * All Rights Reserved
- *
- * EXAMPLE #1
- *********************************************************************************************************
- */
- #include "includes.h"
- /*
- *********************************************************************************************************
- * CONSTANTS
- *********************************************************************************************************
- */
- #define BUFFER_SIZE 40 //Deklaracja maksymalnej dlugosci bufora
- #define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
- #define N_TASKS 10 /* Number of identical tasks */
- /*
- *********************************************************************************************************
- * Tasks
- *********************************************************************************************************
- */
- //Wyswietlanie
- void TaskDIS(void *data);
- OS_STK taskDISStk[TASK_STK_SIZE];
- //Wprowadzanie klawiszy z klawiatury
- void TaskKEY(void *data);
- OS_STK taskKEYStk[TASK_STK_SIZE];
- //Deklaracja kolejki
- void *qKeyBuff[BUFFER_SIZE];
- OS_EVENT *qKey;
- //Edycja
- void TaskEDI(void *data);
- OS_STK taskEDIStk[TASK_STK_SIZE];
- //Deklaracja mailbox
- OS_EVENT *TxMbox;
- void Task(void *data);
- OS_STK TaskStk[N_TASKS][TASK_STK_SIZE];
- char TaskData[N_TASKS];
- OS_STK TaskStartStk[TASK_STK_SIZE];
- void TaskStart(void *data);
- OS_EVENT *RandomSem;
- /*
- *********************************************************************************************************
- * FUNCTION PROTOTYPES
- *********************************************************************************************************
- */
- static void DISinit(void);
- static void DISclear(void);
- static void TaskStartCreateTasks(void);
- /*
- *********************************************************************************************************
- * MAIN
- *********************************************************************************************************
- */
- void main(void)
- {
- int i;
- 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(TaskDIS, (void *)0, &taskDISStk[TASK_STK_SIZE - 1], 0);
- //Utworzenie mailbox
- TxMbox = OSMboxCreate((void *)0);
- //OSTaskCreate(TaskKEY, (void *)0, &taskKEYStk[TASK_STK_SIZE - 1], 1);
- //Utworzenie queue
- qKey = OSQCreate(&qKeyBuff[0], BUFFER_SIZE);
- //OSTaskCreate(TaskEDI, (void *)0, &taskEDIStk[TASK_STK_SIZE - 1], 2);
- RandomSem = OSSemCreate(1);
- OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
- OSStart();
- }
- /*
- *********************************************************************************************************
- * STARTUP TASK
- *********************************************************************************************************
- */
- void TaskStart (void *pdata)
- {
- #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
- OS_CPU_SR cpu_sr;
- #endif
- char s[100];
- INT16S key;
- pdata = pdata;
- DISinit();
- 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();
- OSStatInit();
- TaskStartCreateTasks();
- for (;;) {
- DISclear(); /* Update the display */
- 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 */
- }
- }
- OSCtxSwCtr = 0; /* Clear context switch counter */
- OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
- }
- }
- void DISinit(void)
- {
- int i;
- char text[30];
- PC_DispStr( 0, 0, " Laboratorium - Systemy Operacyjne ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
- PC_DispStr( 0, 1, " WRAAH i GRAAH ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 2, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 3, " Zadanie 1 ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 5, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 8, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 9, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 10, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 11, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 12, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 14, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 18, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 22, "#Tasks : CPU Usage: % ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 23, "#Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(0, 24, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
- }
- void DISclear(void)
- {
- char s[80];
- sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */
- PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
- #if OS_TASK_STAT_EN > 0
- sprintf(s, "%3d", OSCPUUsage); /* Display CPU usage in % */
- PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
- #endif
- sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */
- PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
- sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* Display uC/OS-II's version number */
- PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
- switch (_8087) { /* Display whether FPU present */
- case 0:
- PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE);
- break;
- case 1:
- PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
- break;
- case 2:
- PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
- break;
- case 3:
- PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
- break;
- }
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * CREATE TASKS
- *********************************************************************************************************
- */
- static void TaskStartCreateTasks (void)
- {
- INT8U i;
- int a=4;
- for (i = 0; i < N_TASKS; i++) { /* Create N_TASKS identical tasks */
- TaskData[i] = '0' + i; /* Each task will display its own letter */
- OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], a);
- a++;
- }
- OSTaskCreate(TaskDIS, (void *)0, &taskDISStk[TASK_STK_SIZE - 1], 1);
- //TxMbox = OSMboxCreate((void *)0);
- OSTaskCreate(TaskKEY, (void *)0, &taskKEYStk[TASK_STK_SIZE - 1], 2);
- //qKey = OSQCreate(&qKeyBuff[0], BUFFER_SIZE);
- OSTaskCreate(TaskEDI, (void *)0, &taskEDIStk[TASK_STK_SIZE - 1], 3);
- }
- void TaskEDI(void *pdata)
- {
- INT8U error;
- int i = 0;
- int a = 0;
- char debug[80];
- char bufor[BUFFER_SIZE];
- char bufor2[BUFFER_SIZE];
- char bufor3[BUFFER_SIZE];
- char buffer[BUFFER_SIZE];
- char null[BUFFER_SIZE];
- INT8S key;
- void *data;
- pdata = pdata;
- for(;;)
- {
- data = OSMboxPend(TxMbox, 0, &error);
- if (data != NULL)
- {
- key = *(INT8S*)data;
- if(key == 0x08) //BACKSPACE
- {
- bufor[strlen(bufor)-1] = null[0]; //Zamienia wartosc (przed kursorem) bufora na wartości pustej tablicy null
- }
- else if(key == 0x00) //DELETE
- {
- strcpy(bufor, ""); //Kopiuje tekst z tablicy "" do tablicy bufor (czysci bufor)
- }
- else if(key == 0x0D) //ENTER
- {
- strcpy(bufor3, bufor2); //Kopiuje tekst z tablicy bufor2 do tablicy bufor3
- for(i = 0;i<strlen(bufor);i++)
- {
- bufor[i]=null[0]; //"Czysci" bufory
- bufor2[i]=null[0];
- }
- //strcpy(&buffer[0], bufor3);
- //OSQPost(qKey, (void *)&buffer[0]);
- PC_DispStr(30, a+5, bufor3, DISP_FGND_BLACK + DISP_BLINK); //Wypisuje bufor3
- //a++;
- }
- else
- {
- if(strlen(bufor)<BUFFER_SIZE-1) //Jezelo bufor jest krotszy od BUFFER_SIZE
- {
- strcat(bufor, &key); //Dopisuje tekst z key na koniec tablicy bufor
- }
- }
- strcpy(bufor2,bufor); //Kopiuje tekst z tablicy bufor do tablicy bufor2
- for(i = strlen(bufor2);i<BUFFER_SIZE-1;i++)
- {
- strcat(bufor2, " "); //Tworzy obszar w ktorym beda wypisywane znaki
- }
- strcpy(&buffer[0], bufor2);
- OSQPost(qKey, (void *)&buffer[0]);
- //PC_DispStr(30, 3, bufor2, DISP_FGND_BLACK + DISP_BLINK); //Wypisuje bufor2
- }
- //OSTimeDlyHMSM (0, 0, 0, 5);
- }
- }
- void TaskDIS(void *data)
- {
- char *buffer;
- INT8U err;
- //int i = 0;
- char debug[80];
- data = data;
- for(;;)
- {
- sprintf(debug , "Prosze wprowadzic tekst: ");
- PC_DispStr(2, 4, debug, DISP_FGND_BLACK + DISP_BLINK);
- buffer = (char *)OSQPend(qKey, 0, &err);
- PC_DispStr(30, 4, buffer, DISP_FGND_BLACK + DISP_BLINK);
- //DISclear(); //NIEPOTRZEBNE 71830
- //OSTimeDlyHMSM(0, 0, 0, 5);
- }
- }
- void TaskKEY(void *data)
- {
- int i = 0;
- char debug[80];
- INT16S znak;
- data = data;
- for(;;)
- {
- i++;
- if (PC_GetKey(&znak) == TRUE)
- {
- if(znak == 0x1B)
- {
- PC_DOSReturn();
- }
- else
- {
- OSMboxPost(TxMbox, (void*)&znak);
- }
- }
- OSTimeDly(1);
- }
- }
- /*
- *********************************************************************************************************
- * TASKS
- *********************************************************************************************************
- */
- void Task (void *pdata)
- {
- INT8U x;
- INT8U y;
- INT8U err;
- for (;;) {
- OSSemPend(RandomSem, 0, &err); /* Acquire semaphore to perform random numbers */
- x = random(80); /* Find X position where task number will appear */
- y = random(16); /* Find Y position where task number will appear */
- OSSemPost(RandomSem); /* Release semaphore */
- /* Display the task number on the screen */
- PC_DispChar(x, y + 6, *(char *)pdata, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- OSTimeDly(1); /* Delay 1 clock tick */
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement