Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.39 KB | None | 0 0
  1. /*
  2. *********************************************************************************************************
  3.  
  4.  
  5.  
  6.  
  7. * uC/OS-II
  8. * The Real-Time Kernel
  9. *
  10. * (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
  11. * All Rights Reserved
  12. *
  13. * EXAMPLE #1
  14.  
  15. *********************************************************************************************************
  16. */
  17.  
  18. #include "includes.h"
  19.  
  20. /*
  21. *********************************************************************************************************
  22. * CONSTANTS
  23. *********************************************************************************************************
  24. */
  25. #define BUFFER_SIZE 40 //Deklaracja maksymalnej dlugosci bufora
  26. #define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
  27. #define N_TASKS 10 /* Number of identical tasks */
  28.  
  29.  
  30. /*
  31. *********************************************************************************************************
  32. * Tasks
  33. *********************************************************************************************************
  34. */
  35. //Wyswietlanie
  36. void TaskDIS(void *data);
  37. OS_STK taskDISStk[TASK_STK_SIZE];
  38.  
  39. //Wprowadzanie klawiszy z klawiatury
  40. void TaskKEY(void *data);
  41. OS_STK taskKEYStk[TASK_STK_SIZE];
  42.  
  43. //Deklaracja kolejki
  44. void *qKeyBuff[BUFFER_SIZE];
  45. OS_EVENT *qKey;
  46.  
  47. //Edycja
  48. void TaskEDI(void *data);
  49. OS_STK taskEDIStk[TASK_STK_SIZE];
  50.  
  51. //Deklaracja mailbox
  52. OS_EVENT *TxMbox;
  53.  
  54. void Task(void *data);
  55. OS_STK TaskStk[N_TASKS][TASK_STK_SIZE];
  56. char TaskData[N_TASKS];
  57.  
  58. OS_STK TaskStartStk[TASK_STK_SIZE];
  59. void TaskStart(void *data);
  60.  
  61. OS_EVENT *RandomSem;
  62.  
  63.  
  64.  
  65. /*
  66. *********************************************************************************************************
  67. * FUNCTION PROTOTYPES
  68. *********************************************************************************************************
  69. */
  70. static void DISinit(void);
  71. static void DISclear(void);
  72. static void TaskStartCreateTasks(void);
  73. /*
  74. *********************************************************************************************************
  75. * MAIN
  76. *********************************************************************************************************
  77. */
  78.  
  79.  
  80. void main(void)
  81. {
  82. int i;
  83. PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */
  84.  
  85. OSInit(); /* Initialize uC/OS-II */
  86.  
  87. PC_DOSSaveReturn(); /* Save environment to return to DOS */
  88. PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
  89.  
  90.  
  91. //OSTaskCreate(TaskDIS, (void *)0, &taskDISStk[TASK_STK_SIZE - 1], 0);
  92.  
  93. //Utworzenie mailbox
  94. TxMbox = OSMboxCreate((void *)0);
  95. //OSTaskCreate(TaskKEY, (void *)0, &taskKEYStk[TASK_STK_SIZE - 1], 1);
  96.  
  97. //Utworzenie queue
  98. qKey = OSQCreate(&qKeyBuff[0], BUFFER_SIZE);
  99. //OSTaskCreate(TaskEDI, (void *)0, &taskEDIStk[TASK_STK_SIZE - 1], 2);
  100.  
  101. RandomSem = OSSemCreate(1);
  102.  
  103. OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
  104.  
  105.  
  106. OSStart();
  107. }
  108.  
  109. /*
  110. *********************************************************************************************************
  111. * STARTUP TASK
  112. *********************************************************************************************************
  113. */
  114.  
  115. void TaskStart (void *pdata)
  116. {
  117. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
  118. OS_CPU_SR cpu_sr;
  119. #endif
  120. char s[100];
  121. INT16S key;
  122.  
  123.  
  124. pdata = pdata;
  125.  
  126. DISinit();
  127.  
  128. OS_ENTER_CRITICAL();
  129. PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
  130. PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
  131. OS_EXIT_CRITICAL();
  132. OSStatInit();
  133.  
  134.  
  135.  
  136. TaskStartCreateTasks();
  137.  
  138. for (;;) {
  139. DISclear(); /* Update the display */
  140.  
  141. if (PC_GetKey(&key) == TRUE) { /* See if key has been pressed */
  142. if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */
  143. PC_DOSReturn(); /* Return to DOS */
  144. }
  145. }
  146.  
  147. OSCtxSwCtr = 0; /* Clear context switch counter */
  148. OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
  149. }
  150. }
  151.  
  152. void DISinit(void)
  153. {
  154. int i;
  155. char text[30];
  156. PC_DispStr( 0, 0, " Laboratorium - Systemy Operacyjne ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
  157. PC_DispStr( 0, 1, " WRAAH i GRAAH ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  158. PC_DispStr( 0, 2, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  159. PC_DispStr( 0, 3, " Zadanie 1 ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  160. PC_DispStr(0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  161. PC_DispStr(0, 5, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  162. PC_DispStr(0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  163. PC_DispStr(0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  164. PC_DispStr(0, 8, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  165. PC_DispStr(0, 9, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  166. PC_DispStr(0, 10, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  167. PC_DispStr(0, 11, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  168. PC_DispStr(0, 12, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  169. PC_DispStr(0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  170. PC_DispStr(0, 14, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  171. PC_DispStr(0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  172. PC_DispStr(0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  173. PC_DispStr(0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  174. PC_DispStr(0, 18, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  175. PC_DispStr(0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  176. PC_DispStr(0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  177. PC_DispStr(0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  178. PC_DispStr(0, 22, "#Tasks : CPU Usage: % ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  179. PC_DispStr(0, 23, "#Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  180. PC_DispStr(0, 24, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
  181.  
  182. }
  183.  
  184. void DISclear(void)
  185. {
  186. char s[80];
  187.  
  188.  
  189. sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */
  190. PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  191.  
  192. #if OS_TASK_STAT_EN > 0
  193. sprintf(s, "%3d", OSCPUUsage); /* Display CPU usage in % */
  194. PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  195. #endif
  196.  
  197. sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */
  198. PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  199.  
  200. sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* Display uC/OS-II's version number */
  201. PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  202.  
  203. switch (_8087) { /* Display whether FPU present */
  204. case 0:
  205. PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE);
  206. break;
  207.  
  208. case 1:
  209. PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
  210. break;
  211.  
  212. case 2:
  213. PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
  214. break;
  215.  
  216. case 3:
  217. PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
  218. break;
  219. }
  220. }
  221. /*$PAGE*/
  222. /*
  223. *********************************************************************************************************
  224. * CREATE TASKS
  225. *********************************************************************************************************
  226. */
  227.  
  228. static void TaskStartCreateTasks (void)
  229. {
  230. INT8U i;
  231. int a=4;
  232.  
  233.  
  234.  
  235. for (i = 0; i < N_TASKS; i++) { /* Create N_TASKS identical tasks */
  236. TaskData[i] = '0' + i; /* Each task will display its own letter */
  237. OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], a);
  238. a++;
  239. }
  240.  
  241. OSTaskCreate(TaskDIS, (void *)0, &taskDISStk[TASK_STK_SIZE - 1], 1);
  242.  
  243. //TxMbox = OSMboxCreate((void *)0);
  244. OSTaskCreate(TaskKEY, (void *)0, &taskKEYStk[TASK_STK_SIZE - 1], 2);
  245.  
  246. //qKey = OSQCreate(&qKeyBuff[0], BUFFER_SIZE);
  247. OSTaskCreate(TaskEDI, (void *)0, &taskEDIStk[TASK_STK_SIZE - 1], 3);
  248.  
  249. }
  250.  
  251. void TaskEDI(void *pdata)
  252. {
  253. INT8U error;
  254. int i = 0;
  255. int a = 0;
  256. char debug[80];
  257. char bufor[BUFFER_SIZE];
  258. char bufor2[BUFFER_SIZE];
  259. char bufor3[BUFFER_SIZE];
  260. char buffer[BUFFER_SIZE];
  261. char null[BUFFER_SIZE];
  262. INT8S key;
  263. void *data;
  264. pdata = pdata;
  265. for(;;)
  266. {
  267. data = OSMboxPend(TxMbox, 0, &error);
  268. if (data != NULL)
  269. {
  270. key = *(INT8S*)data;
  271. if(key == 0x08) //BACKSPACE
  272. {
  273. bufor[strlen(bufor)-1] = null[0]; //Zamienia wartosc (przed kursorem) bufora na wartości pustej tablicy null
  274. }
  275. else if(key == 0x00) //DELETE
  276. {
  277. strcpy(bufor, ""); //Kopiuje tekst z tablicy "" do tablicy bufor (czysci bufor)
  278. }
  279. else if(key == 0x0D) //ENTER
  280. {
  281. strcpy(bufor3, bufor2); //Kopiuje tekst z tablicy bufor2 do tablicy bufor3
  282. for(i = 0;i<strlen(bufor);i++)
  283. {
  284. bufor[i]=null[0]; //"Czysci" bufory
  285. bufor2[i]=null[0];
  286. }
  287. //strcpy(&buffer[0], bufor3);
  288. //OSQPost(qKey, (void *)&buffer[0]);
  289. PC_DispStr(30, a+5, bufor3, DISP_FGND_BLACK + DISP_BLINK); //Wypisuje bufor3
  290. //a++;
  291. }
  292. else
  293. {
  294. if(strlen(bufor)<BUFFER_SIZE-1) //Jezelo bufor jest krotszy od BUFFER_SIZE
  295. {
  296. strcat(bufor, &key); //Dopisuje tekst z key na koniec tablicy bufor
  297. }
  298. }
  299. strcpy(bufor2,bufor); //Kopiuje tekst z tablicy bufor do tablicy bufor2
  300. for(i = strlen(bufor2);i<BUFFER_SIZE-1;i++)
  301. {
  302. strcat(bufor2, " "); //Tworzy obszar w ktorym beda wypisywane znaki
  303. }
  304. strcpy(&buffer[0], bufor2);
  305. OSQPost(qKey, (void *)&buffer[0]);
  306. //PC_DispStr(30, 3, bufor2, DISP_FGND_BLACK + DISP_BLINK); //Wypisuje bufor2
  307. }
  308. //OSTimeDlyHMSM (0, 0, 0, 5);
  309. }
  310. }
  311. void TaskDIS(void *data)
  312. {
  313. char *buffer;
  314. INT8U err;
  315. //int i = 0;
  316. char debug[80];
  317. data = data;
  318.  
  319.  
  320. for(;;)
  321. {
  322. sprintf(debug , "Prosze wprowadzic tekst: ");
  323. PC_DispStr(2, 4, debug, DISP_FGND_BLACK + DISP_BLINK);
  324. buffer = (char *)OSQPend(qKey, 0, &err);
  325. PC_DispStr(30, 4, buffer, DISP_FGND_BLACK + DISP_BLINK);
  326.  
  327. //DISclear(); //NIEPOTRZEBNE 71830
  328.  
  329. //OSTimeDlyHMSM(0, 0, 0, 5);
  330. }
  331. }
  332.  
  333. void TaskKEY(void *data)
  334. {
  335. int i = 0;
  336. char debug[80];
  337. INT16S znak;
  338. data = data;
  339. for(;;)
  340. {
  341. i++;
  342. if (PC_GetKey(&znak) == TRUE)
  343. {
  344. if(znak == 0x1B)
  345. {
  346. PC_DOSReturn();
  347. }
  348. else
  349. {
  350. OSMboxPost(TxMbox, (void*)&znak);
  351. }
  352. }
  353. OSTimeDly(1);
  354. }
  355. }
  356.  
  357. /*
  358. *********************************************************************************************************
  359. * TASKS
  360. *********************************************************************************************************
  361. */
  362.  
  363. void Task (void *pdata)
  364. {
  365. INT8U x;
  366. INT8U y;
  367. INT8U err;
  368.  
  369.  
  370. for (;;) {
  371. OSSemPend(RandomSem, 0, &err); /* Acquire semaphore to perform random numbers */
  372. x = random(80); /* Find X position where task number will appear */
  373. y = random(16); /* Find Y position where task number will appear */
  374. OSSemPost(RandomSem); /* Release semaphore */
  375. /* Display the task number on the screen */
  376. PC_DispChar(x, y + 6, *(char *)pdata, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  377. OSTimeDly(1); /* Delay 1 clock tick */
  378. }
  379. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement