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"
- #include "string.h"
- /*
- *********************************************************************************************************
- * CONSTANTS
- *********************************************************************************************************
- */
- #define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
- #define N_TASKS 20 /* Number of identical tasks */
- //kolejki do obsługi klawiatury,edycji i wyświetlania
- #define MSG_QUEUE_SIZE1 20
- #define MSG_QUEUE_SIZE2 20
- //kolejki do zadania 3
- #define MSG_QUEUE_SIZE3 80
- #define BUF_SIZE 80
- #define MEM_SIZE 100
- /*
- *********************************************************************************************************
- * VARIABLES
- *********************************************************************************************************
- */
- OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */
- OS_STK TaskStartStk[TASK_STK_SIZE];
- INT8U TaskData[N_TASKS]; /* Parameters to pass to each task */
- OS_EVENT *RandomSem;
- void *MsgQueueTbl1[20];
- void *MsgQueueTbl2[20];
- OS_EVENT *CommKey,*CommMessage,*CommTask; //Kolejki: Klawiatura -> Edycja, ZBIORCZA, Edycja -> TaskSendAll
- OS_EVENT *TaskMBox[6],*SendMBox;
- OS_EVENT *Semafor, *TaskMsgQueue; //Skrzynki,Semafor,Kolejke do LAB3
- OS_MEM *MemoryPtr;
- INT8U Memory[MEM_SIZE][sizeof(INT32U)]; //Potrzebne do alkokacji pamięci
- void *MsgQueueTbl[MSG_QUEUE_SIZE3],*TaskMsgQueueStorage[MSG_QUEUE_SIZE3]; // storage for queues
- unsigned long int globalN ;
- unsigned long int startValue = 1;
- typedef struct
- {
- /*
- numer zadania, wartość pętli obciążającej,licznik wejść;
- */
- INT16U ID; //numer zadania
- char load[BUF_SIZE]; //obciążenie
- INT32U counter;
- char entries[BUF_SIZE]; //wejscia
- INT8U additional; // priorytet zadania
- }TASKS_INFO;
- /*
- *********************************************************************************************************
- * FUNCTION PROTOTYPES
- *********************************************************************************************************
- */
- void Klawiatura(void *data);
- void Wyswietlanie(void *data);
- void Edycja(void *data);
- void TaskSendAll(void *data);
- void Sem(void *pdata);
- void Queue(void *pdata);
- void MBox(void *pdata);
- void Task(void *data); /* Function prototypes of tasks */
- void TaskStart(void *data); /* Function prototypes of Startup task */
- static void TaskStartCreateTasks(void);
- static void TaskStartDispInit(void);
- static void TaskStartDisp(void);
- // void UseQueue(void *data);
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * MAIN
- *********************************************************************************************************
- */
- void main (void)
- {
- int i,err=0;
- 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 */
- RandomSem = OSSemCreate(1); /* Random number semaphore */
- OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
- MemoryPtr = OSMemCreate(Memory, MEM_SIZE, sizeof(INT32U),&err);
- CommKey = OSQCreate(&MsgQueueTbl1[0], MSG_QUEUE_SIZE1);
- CommMessage = OSQCreate(&TaskMsgQueueStorage[0], MSG_QUEUE_SIZE3); //kolejka globalna
- TaskMsgQueue = OSQCreate(&MsgQueueTbl[0], MSG_QUEUE_SIZE3);
- if(CommKey == NULL || CommMessage == NULL || TaskMsgQueue == NULL) err=1;
- for(i=0; i<6; ++i){ //inicjalizacja 6 skrzynek i semaforów
- TaskMBox[i] = OSMboxCreate((void*)0);
- if(TaskMBox[i] == NULL) err=2; // błąd utworzenia skrzynki
- }
- SendMBox = OSMboxCreate((void*)0);
- if(SendMBox == NULL) err = 2;
- Semafor = OSSemCreate(1); // 1 -> oznacza ilość chronionych źródeł
- if(Semafor == NULL) err=3;
- if(err==0) {
- printf("Kolejki,Skrzynki i Semafor zostaly poprawie utworzone");
- delay(800);
- OSStart();
- }
- if(err==1){
- printf("Kolejki nie zostaly utworzone");
- }
- if(err==2){
- printf("Skrzynki nie zostaly utworzone");
- }
- if(err==3){
- printf("Semafor nie zostal utworzony");
- }
- /* 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
- char s[100];
- INT8U err,i;
- INT16S key;
- TASKS_INFO info;
- pdata = pdata; /* Prevent compiler warning */
- OSSemPend(Semafor,0,&err); //nadanie początkowej wartości zmiennej globalnej globalN
- globalN = startValue;
- OSSemPost(Semafor);
- for(i=0; i < 6; ++i){ // wysylanie wartosci początkowej pentli obciązającej do skrzynek i kolejki
- if(i<4)OSQPost(TaskMsgQueue,(void*)&startValue);
- OSMboxPost(TaskMBox[i],(void*)&startValue);
- }
- TaskStartDispInit(); /* Initialize the display */
- 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(); /* Initialize uC/OS-II's statistics */
- TaskStartCreateTasks(); /* Create all the application tasks */
- for (;;) {
- TaskStartDisp(); /* Update the display */
- OSCtxSwCtr = 0; /* Clear context switch counter */
- OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
- }
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * INITIALIZE THE DISPLAY
- *********************************************************************************************************
- */
- static void TaskStartDispInit (void)
- {
- /* 1111111111222222222233333333334444444444555555555566666666667777777777 */
- /* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
- PC_DispStr( 0, 0, "Aktualna liczba: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 1, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 2, "Piorytet ID ilosc wejsc Obciazenie Delta Error ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 3, " 4 S ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 4, " 5 S ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 5, " 6 S ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 6, " 7 S ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 7, " 8 S ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 8, " 9 S ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 9, " 10 M ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 10, " 11 M ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 11, " 12 M ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 12, " 13 M ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 13, " 14 M ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 14, " 15 M ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 15, " 16 Q ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 16, " 17 Q ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 17, " 18 Q ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 18, " 19 Q ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr( 0, 19, " ", 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);
- /* 1111111111222222222233333333334444444444555555555566666666667777777777 */
- /* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * UPDATE THE DISPLAY
- *********************************************************************************************************
- */
- static void TaskStartDisp (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;
- OSTaskCreate(Klawiatura, (void *)0, &TaskStk[0][TASK_STK_SIZE - 1],1);
- OSTaskCreate(Edycja, (void *)0, &TaskStk[1][TASK_STK_SIZE - 1], 2);
- OSTaskCreate(Wyswietlanie, (void *)0, &TaskStk[2][TASK_STK_SIZE - 1], 3);
- OSTaskCreate(TaskSendAll, (void*)0, &TaskStk[3][TASK_STK_SIZE - 1], 4);
- for(i=0; i<6;++i){
- TaskData[i] = i;
- OSTaskCreate(Sem, (void *)&TaskData[i], &TaskStk[i+4][TASK_STK_SIZE - 1], i + 5);
- TaskData[i+6] = i + 6;
- OSTaskCreate(MBox, (void *)&TaskData[i+6], &TaskStk[i+10][TASK_STK_SIZE - 1], i + 11);
- }
- for(i=0; i<4 ;++i){
- TaskData[i+12] = i +12;
- OSTaskCreate(Queue, (void *)&TaskData[i+12], &TaskStk[i+16][TASK_STK_SIZE - 1], i + 17);
- }
- }
- /*
- *********************************************************************************************************
- * TASKS
- *********************************************************************************************************
- */
- void Klawiatura (void *pdata)
- {
- INT16S c;
- pdata = pdata;
- for (;;)
- {
- if(PC_GetKey(&c) == TRUE)OSQPost(CommKey, (void *)&c);
- OSTimeDly(13); /* Delay 1 clock tick */
- }
- }
- void Wyswietlanie(void *pdata)
- {
- TASKS_INFO *msg;
- INT8U err1;
- INT32U time[1][40];
- INT32U T1[16],T2[16],T3[16];
- INT32U temp2;
- char delta[BUF_SIZE];
- TASKS_INFO * info;
- INT8U p,i;
- INT32U intload;
- char ID[BUF_SIZE],load[BUF_SIZE];
- char entries[BUF_SIZE];
- char s[20], s1[BUF_SIZE];
- char T2Tab[BUF_SIZE],T1Tab[BUF_SIZE];
- unsigned long int temp;
- OS_MEM_DATA dane_pamiec;
- pdata = pdata;
- for(i=0;i<16;i++) T1[i]=0;
- for(;;)
- {
- info = (TASKS_INFO*)OSQPend(CommMessage, 0, &err1);
- p = info->ID;
- temp2 = info->counter;
- intload = info->load;
- strncpy(entries, info->entries, BUF_SIZE);
- strncpy(load,info->load,BUF_SIZE);
- sprintf(ID,"%d",p);
- //sprintf(load,"%d",intload);
- //ultoa(intload,load,10);
- if(p < 100) // jesli p - 'priorytet' jest mniejszy od 100, to znaczy, ze otrzymana wiadomosc pochodzi od jednego z zadan 1-18
- {
- T2[p]=temp2;
- if(OSTimeGet()>=250){
- for(i=0;i<16;++i){
- T3[i]=T2[i]-T1[i];
- T1[i]=T2[i];
- // sprintf(delta,"%d",T3[i]);
- ultoa(T3[i],delta,10);
- //PC_DispStr(45, i+3," ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- //PC_DispStr(45, i+3, delta , DISP_FGND_YELLOW + DISP_BGND_BLUE);
- }
- OSTimeSet(0);
- }
- PC_DispStr(48, p+3, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(48, p+3, delta, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(18, p+3, entries, DISP_FGND_YELLOW + DISP_BGND_BLUE);
- PC_DispStr(10, p+3, ID , DISP_FGND_YELLOW + DISP_BGND_BLUE);
- PC_DispStr(35, p+3," ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(35, p+3, load , DISP_FGND_YELLOW + DISP_BGND_BLUE);
- }
- else
- if(p == 100) // oznacza to, ze ta wiadomosc jest przeznaczona do wyswietlenia jako 'aktualna liczba'
- {
- temp = atol(entries);
- sprintf(s, "%lu", temp);
- PC_DispStr( 0, 0, "Aktualna liczba: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
- PC_DispStr(17, 0, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY );
- }
- else
- if(p==101) // wyswietlenie tego, co aktualnie uzytkownik wpisal
- {
- PC_DispStr(0, 24, entries, DISP_FGND_YELLOW + DISP_BGND_BLUE);
- }
- //OSTimeDlyHMSM(0, 0, 0, 1);
- }
- }
- void Edycja (void *pdata)
- {
- INT16S c;
- INT8U err1,err;
- INT8U x=0,i;
- INT8U flag=3;
- INT32U number=0;
- INT16S *msg;
- TASKS_INFO info,info1;
- char tab[BUF_SIZE]={0};
- pdata = pdata;
- memset(tab,' ',BUF_SIZE-1);
- tab[BUF_SIZE-1]='\0';
- for (;;) {
- msg = OSQPend(CommKey, 0, &err);
- c=*msg;
- if (c == 0x1B)PC_DOSReturn(); //escape wyjście
- else if (c == 0x08)flag=1; // użycie backspace
- else if (c == 0x0D)flag=2; // użycie entera
- else flag=0; //użycie zwykłego znaku
- if(flag == 1) //backspace
- {
- tab[x]=' ';
- if(x>0)x--;
- // OSQPost(CommMessage, (void *)&tab[0]);
- }
- else if(flag == 2)//enter
- {
- // tab[19]=c;
- x=0;
- number = atol(tab); // zamiana tablicy znaków na liczbe
- OSMboxPost(SendMBox,(void *)&number);
- info1.ID = 100;
- strncpy(info1.entries,tab,BUF_SIZE);
- err1=OSQPost(CommMessage, (void *)&info1);
- memset(tab,' ', BUF_SIZE-1);
- }
- else if(flag == 0 )
- {
- tab[x]=c;
- if(x < BUF_SIZE-1)x++;
- // OSQPost(CommMessage, (void *)&tab[0]);
- }
- info.ID= 101;
- memcpy(info.entries, tab , BUF_SIZE);
- err1 = OSQPost(CommMessage,(void*)&info);
- OSTimeDly(1); /* Delay 1 clock tick */
- }
- }
- void TaskSendAll(void *data)
- {
- INT32U i,j;
- INT8U err;
- TASKS_INFO info;
- INT8U BoxRequestSend[6]={0,0,0,0,0,0};
- INT32U number=0,previous=0,*msg,*MBoxPtr[6], *QueuePtr[4];
- data=data;
- // spróbuję bez zarządzania pamięci zrobić to na stosie
- // Potrzeba rozpatrzyć na przypadki, taki kiedy skrzynki nie nadążą z wysłaniem i taki gdy nadążą
- for(;;){
- msg=OSMboxPend(SendMBox,0,&err);
- number=*(INT32U*)msg;
- if(1){
- OSSemPend(Semafor,0,&err);
- globalN = number;
- OSSemPost(Semafor);
- for(i=0 ; i< 4 ; ++i){
- err = OSQPost(TaskMsgQueue,(void*)&number);
- }
- for(i=0 ; i<6 ; ++i){
- MBoxPtr[i]= OSMemGet(MemoryPtr, &err);
- if(err != OS_NO_ERR) PC_DispStr(0, 21, "blad przy przydzielaniu pamieci dla Mbox", DISP_FGND_YELLOW + DISP_BGND_BLUE);
- if(MBoxPtr[i] != NULL) *MBoxPtr[i] = number;
- err = OSMboxPost(TaskMBox[i],(void*)MBoxPtr[i]);
- if(err == OS_MBOX_FULL) BoxRequestSend[i] = 1;
- }
- previous = number;
- }
- for(i=0 ; i<6 ; ++i){
- if(BoxRequestSend[i] == 1){
- err = OSMboxPost(TaskMBox[i],(void*)MBoxPtr[i]);
- if(err != OS_MBOX_FULL) BoxRequestSend[i] = 0;
- }
- }
- // OSTimeDly(1);
- }
- }
- void Queue(void * data)
- {
- INT8U p = *(INT8U*)data;
- unsigned long int counter = 0, i, entries = 0;
- TASKS_INFO info;
- unsigned long int *msg;
- INT8U err;
- unsigned long int n;
- unsigned long int previous = 0;
- char s[BUF_SIZE],s1[BUF_SIZE];
- info.ID = p;
- for(;;)
- {
- msg = OSQAccept(TaskMsgQueue);
- if(msg != (void*)0)
- {
- //n = *(unsigned long int*)msg;
- n=*msg;
- }
- else
- n = previous;
- counter = 0;
- for(i = 0; i< n; ++i) // petla obciazajaca
- {
- counter++;
- }
- info.counter=entries;
- sprintf(s, "%lu", entries);
- strncpy(info.entries, s, BUF_SIZE);
- sprintf(s1, "%lu", n);
- strncpy(info.load, s1, BUF_SIZE);
- err = OSQPost(CommMessage, (void*)&info);
- if(err == OS_Q_FULL)
- {
- PC_DispStr(0, 21, "queue error", DISP_FGND_YELLOW + DISP_BGND_BLUE);
- }
- entries++;
- previous = n;
- OSTimeDly(1);
- }
- }
- /*
- *********************************************************************************************************
- * UseMbox
- *
- * Opis: Odczytanie wartosci petli obciazajacej ze skrzynek, a nastepnie wykonanie petli obciazajacej
- *********************************************************************************************************
- */
- void MBox(void * data)
- {
- //char s[20];
- unsigned long int n ;
- unsigned long int previous = 0;
- INT8U p = *(INT8U*)data;
- unsigned long int *msg;
- INT8U err;
- TASKS_INFO info;
- unsigned long int counter = 0, i, entries = 0;
- char s[BUF_SIZE];
- info.ID = p;
- for(;;)
- {
- msg = OSMboxAccept(TaskMBox[p - 6]);
- if(msg != (void*)0)
- {
- n = *msg;
- err = OSMemPut(MemoryPtr,(void*)msg); // zwolnienie pamięci zadeklarowanej w TaskSendAll
- }
- else
- n = previous;
- counter = 0;
- for(i = 0; i< n; ++i)
- {
- counter++;
- }
- info.counter=entries;
- sprintf(s, "%lu", entries);
- strncpy(info.entries, s, BUF_SIZE);
- sprintf(s, "%lu", n);
- strncpy(info.load, s, BUF_SIZE);
- err = OSQPost(CommMessage, (void*)&info);
- if(err == OS_Q_FULL)
- {
- PC_DispStr(0, 21, "mbox error <- full", DISP_FGND_YELLOW + DISP_BGND_BLUE);
- }
- //info.load = n;
- entries++;
- previous= n;
- OSTimeDly(1);
- }
- }
- /*
- *********************************************************************************************************
- * UseSem
- *
- * Opis: Odczytanie wartosci petli obciazajacej ze zmiennej globalnej chronionej semaforem, a nastepnie wykonanie petli obciazajacej
- *********************************************************************************************************
- */
- void Sem(void * data)
- {
- //char s[20];
- unsigned long int n;
- INT8U p = *(INT8U*)data;
- INT8U err;
- unsigned long int i, counter = 0, entries = 0;
- char s[BUF_SIZE];
- TASKS_INFO info;
- info.ID = p;
- for(;;)
- {
- OSSemPend(Semafor, 0, &err);
- n = globalN;
- OSSemPost(Semafor);
- counter = 0;
- for(i = 0; i<n; i++)
- {
- counter++;
- }
- info.counter = entries;
- sprintf(s, "%lu", entries);
- strncpy(info.entries, s, BUF_SIZE);
- sprintf(s, "%lu", n);
- strncpy(info.load, s, BUF_SIZE);
- err = OSQPost(CommMessage, (void*)&info);
- if(err == OS_Q_FULL)
- {
- PC_DispStr(0, 21, "sem error", DISP_FGND_YELLOW + DISP_BGND_BLUE);
- }
- // info.load = n;
- entries++;
- OSTimeDly(1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement