· 5 years ago · Oct 18, 2020, 11:14 AM
1/*
2*********************************************************************************************************
3* uC/OS-II
4* The Real-Time Kernel
5*
6* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
7* All Rights Reserved
8*
9* EXAMPLE #1
10*********************************************************************************************************
11*/
12
13#include "includes.h"
14
15/*
16*********************************************************************************************************
17* CONSTANTS
18*********************************************************************************************************
19*/
20
21#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
22#define N_TASKS 5 /* Number of identical tasks */
23#define Mess_SIZE 80
24/*
25typedef struct {
26 char TaskName[5];
27 INT32U Obciazenie
28 INT32U Licznik;
29 INT32U Delta;
30} TASK_USER_DATA;
31*/
32/*
33*********************************************************************************************************
34* VARIABLES
35*********************************************************************************************************
36*/
37
38//OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */
39OS_STK TaskStartStk[TASK_STK_SIZE];
40OS_STK ReadStk[TASK_STK_SIZE];
41OS_STK TextStk[TASK_STK_SIZE];
42OS_STK PrintStk[TASK_STK_SIZE];
43//OS_STK QTaskStk[N_TASKS][TASK_STK_SIZE];
44//OS_STK MTaskStk[N_TASKS][TASK_STK_SIZE];
45//OS_STK STaskStk[N_TASKS][TASK_STK_SIZE];
46
47//char QTaskData[N_TASKS]; /* Parameters to pass to each task */
48//char MTaskData[N_TASKS];
49//char STaskData[N_TASKS];
50char ReadData;
51char TextData;
52char PrintData;
53
54OS_EVENT *RandomSem;
55OS_EVENT *ReadText;
56OS_EVENT *TextPrint;
57OS_EVENT *Kolejka;
58
59
60void *RTQue[20];
61void *PTQue[20];
62void *KolejkaQue[100];
63
64/*
65*********************************************************************************************************
66* FUNCTION PROTOTYPES
67*********************************************************************************************************
68*/
69/*
70 void QTask(void *data);
71 void MTask9(void *data);
72 void MTask10(void *data);
73 void MTask11(void *data);
74 void MTask12(void *data);
75 void MTask13(void *data);
76 void STask(void *data);
77*/
78 void ReadTask(void *data);
79 void TextTask(void *data);
80 void PrintTask(void *data);
81
82 void TaskStart(void *data); /* Function prototypes of Startup task */
83static void TaskStartCreateTasks(void);
84static void TaskStartDispInit(void);
85static void TaskStartDisp(void);
86
87INT32U obciazenieglobalne;
88
89/*$PAGE*/
90/*
91*********************************************************************************************************
92* MAIN
93*********************************************************************************************************
94*/
95
96void main (void)
97{
98 PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */
99
100 OSInit(); /* Initialize uC/OS-II */
101
102 PC_DOSSaveReturn(); /* Save environment to return to DOS */
103 PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
104
105 RandomSem = OSSemCreate(1); /* Random number semaphore */
106
107 OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
108 OSStart(); /* Start multitasking */
109}
110
111
112/*
113*********************************************************************************************************
114* STARTUP TASK
115*********************************************************************************************************
116*/
117void TaskStart (void *pdata)
118{
119#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
120 OS_CPU_SR cpu_sr;
121#endif
122 char s[100];
123 INT16S key;
124
125
126 pdata = pdata; /* Prevent compiler warning */
127
128 TaskStartDispInit(); /* Initialize the display */
129
130 OS_ENTER_CRITICAL();
131 PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
132 PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
133 OS_EXIT_CRITICAL();
134
135 OSStatInit(); /* Initialize uC/OS-II's statistics */
136
137 ReadText = OSQCreate(&RTQue[0], 20);
138 if( ReadText == NULL)
139 {
140 PC_DispStr(60, 4 , "Blad",DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
141 }
142 TextPrint = OSQCreate(&PTQue[0], 20);
143 if( TextPrint == NULL)
144 {
145 PC_DispStr(40, 4 , "Blad",DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
146 }
147
148 TaskStartCreateTasks(); /* Create all the application tasks */
149
150
151 OSCtxSwCtr = 0; /* Clear context switch counter */
152 OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
153
154}
155
156/*$PAGE*/
157/*
158*********************************************************************************************************
159* INITIALIZE THE DISPLAY
160*********************************************************************************************************
161*/
162
163static void TaskStartDispInit (void)
164{
165/* 1111111111222222222233333333334444444444555555555566666666667777777777 */
166/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
167 PC_DispStr( 0, 0, " uC/OS-II, The Real-Time Kernel ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
168 PC_DispStr( 0, 1, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
169 PC_DispStr( 0, 2, " Szymon Jasiok & Przemyslaw Grobner ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
170 PC_DispStr( 0, 3, " API ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
171 PC_DispStr( 0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
172 PC_DispStr( 0, 5, "Nr Obciazenie Licznik Delta Stan ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
173 PC_DispStr( 0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
174 PC_DispStr( 0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
175 PC_DispStr( 0, 8, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
176 PC_DispStr( 0, 9, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
177 PC_DispStr( 0, 10, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
178 PC_DispStr( 0, 11, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
179 PC_DispStr( 0, 12, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
180 PC_DispStr( 0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
181 PC_DispStr( 0, 14, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
182 PC_DispStr( 0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
183 PC_DispStr( 0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
184 PC_DispStr( 0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
185 PC_DispStr( 0, 18, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
186 PC_DispStr( 0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
187 PC_DispStr( 0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
188 PC_DispStr( 0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
189 PC_DispStr( 0, 22, "#Tasks : CPU Usage: % ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
190 PC_DispStr( 0, 23, "#Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
191 PC_DispStr( 0, 24, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
192/* 1111111111222222222233333333334444444444555555555566666666667777777777 */
193/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
194}
195
196/*$PAGE*/
197/*
198*********************************************************************************************************
199* UPDATE THE DISPLAY
200*********************************************************************************************************
201*/
202
203static void TaskStartDisp (void)
204{
205 char s[80];
206
207
208 sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */
209 PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
210
211#if OS_TASK_STAT_EN > 0
212 sprintf(s, "%3d", OSCPUUsage); /* Display CPU usage in % */
213 PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
214#endif
215
216 sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */
217 PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
218
219 sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* Display uC/OS-II's version number */
220 PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
221
222 switch (_8087) { /* Display whether FPU present */
223 case 0:
224 PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE);
225 break;
226
227 case 1:
228 PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
229 break;
230
231 case 2:
232 PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
233 break;
234
235 case 3:
236 PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
237 break;
238 }
239}
240
241/*$PAGE*/
242/*
243*********************************************************************************************************
244* CREATE TASKS
245*********************************************************************************************************
246*/
247
248static void TaskStartCreateTasks (void)
249{
250 INT8U i;
251
252
253/* for (i = 0; i < 5; i++) {
254 QTaskData[i] = '0' + i;
255 MTaskData[i] = '0' + i;
256 STaskData[i] = '0' + i;
257 OSTaskCreate(QTask, (void *)&QTaskData[i], &QTaskStk[i][TASK_STK_SIZE - 1], i + 4);
258 OSTaskCreate(STask, (void *)&STaskData[i], &STaskStk[i][TASK_STK_SIZE - 1], i + 14);
259 }
260
261 OSTaskCreate(MTask9, (void *)&MTaskData[0], &MTaskStk[0][TASK_STK_SIZE - 1], 9);
262 OSTaskCreate(MTask10, (void *)&MTaskData[1], &MTaskStk[1][TASK_STK_SIZE - 1], 10);
263 OSTaskCreate(MTask11, (void *)&MTaskData[2], &MTaskStk[2][TASK_STK_SIZE - 1], 11);
264 OSTaskCreate(MTask12, (void *)&MTaskData[3], &MTaskStk[3][TASK_STK_SIZE - 1], 12);
265 OSTaskCreate(MTask13, (void *)&MTaskData[4], &MTaskStk[4][TASK_STK_SIZE - 1], 13);
266*/
267 ReadData = 0;
268 TextData = 0;
269 PrintData = 0;
270
271 OSTaskCreate(ReadTask, (void *)&ReadData, &ReadStk[TASK_STK_SIZE - 1], 1);
272 OSTaskCreate(TextTask, (void *)&TextData, &TextStk[TASK_STK_SIZE - 1], 2);
273 //OSTaskCreate(PrintTask, (void *)&PrintData, &PrintStk[TASK_STK_SIZE - 1], 3);
274}
275
276/*
277*********************************************************************************************************
278* TASKS
279*********************************************************************************************************
280*/
281
282/*void QTask (void *pdata)
283{
284 INT32U i;
285 INT32U Qcos = 0;
286 INT8U err;
287 pdata = pdata;
288 INT32U obciazenie = 0;
289 for(;;)
290 {
291 obciazenie = (INT32U*)OSQPend(ObQue, 0, &err);
292
293 for (i = 0;i < *obciazenie; i++)
294 {
295 Qcos++;
296 }
297 Qcos = 0;
298 OSTimeDly(1);
299 }
300}
301
302void MTask1 (void *pdata)
303{
304 INT32U i;
305 INT32U Mcos = 0;
306 INT32U obciazenie = 0;
307 INT8U err;
308 for(;;)
309 {
310 obciazenie = (INT32U*)OSMboxPend(ObMbox, 0, &err);
311 for (i = 0;i < *obciazenie; i++)
312 {
313 Mcos++
314 }
315 Mcos = 0;
316 OSTimeDly(1);
317 }
318}
319
320void STask (void *pdata)
321{
322 INT8U x;
323 INT8U y;
324 INT8U err;
325 INT32U i;
326 INT32U Scos = 0;
327 INT32U obciazenie = 0;
328pdata = pdata;
329 for(;;)
330 {
331 OSSemPend(RandomSem, 0, &err);
332 obciazenie = obciazenieglobalne;
333 Scos = 0;
334 for (i = 0;i < obciazenie; i++)
335 {
336 Scos++;
337 }
338
339 OSSemPost(RandomSem);
340 OSTimeDly(1);
341 }
342}*/
343
344void ReadTask(void *pdata)
345{
346 INT16S key;
347 pdata = pdata;
348 for(;;){
349 if (PC_GetKey(&key))
350 {
351 OSQPost(ReadText,&key);
352 }
353 OSTimeDly(6);
354 }
355}
356void TextTask(void *pdata)
357{
358 INT32U obciazenie = 0;
359 INT16S *key;
360 char msg;
361 char msgd;
362 INT8U err;
363 INT8U j = 0;
364 //INT8U i = 0;
365 INT8U x = 0;
366 char tab[Mess_SIZE];
367 pdata = pdata;
368
369 for(;;)
370 {
371 key = OSQPend(ReadText,0,&err);
372 if(err == OS_NO_ERR)
373 {
374 //msg = *(bufor);
375 //msgd = (char)msg;
376 msg = *key;
377 {
378 if(msg == 0x1B)
379 {
380 PC_DOSReturn();
381 }
382 else if(msg == 8 && x > 0)
383 {
384
385 msg = 'B';
386 //OSQPost(TextPrint,&key);
387 tab[x] = ' ';
388 x = x -1;
389
390 }
391 else if(msg == 13)
392 {
393 /*
394 for(i = 0; i < x; i++)
395 {
396 obciazenie = obciazenie + ((tab[x - i] - '0')*pow(10 , i));
397 }
398 obciazenieglobalne = obciazenie;
399 */
400 msg = 'E';
401 //OSQPost(TextPrint,&key;
402 x = 0;
403 j = 0;
404 }
405 else if( x < Mess_SIZE)
406 {
407 //OSQPost(TextPrint,&key);
408
409 j++;
410 x++;
411 }
412 }
413 }
414 }
415}
416void PrintTask(void *pdata)
417{
418 pdata = pdata;
419 /*
420 char *msgp;
421 INT8U err;
422 INT8U j = 0;
423 void *buforp;
424 char wys;
425
426 pdata = pdata;
427
428 for(;;)
429 {
430 buforp = OSQPend(TextPrint,0,&err);
431 msgp = (char*)buforp;
432 wys = *(char*)buforp;
433 {
434 if(*msgp == 'B')
435 {
436 PC_DispChar(j,21,' ',DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
437 j = j-1;
438 }else if(*msgp == 'E')
439 {
440 j = 0;
441 PC_DispStr( 0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
442 }
443 PC_DispChar(j,21, wys,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
444 j++;
445 }
446 }*/
447}