Advertisement
Guest User

Untitled

a guest
Nov 19th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.62 KB | None | 0 0
  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 10 /* Number of identical tasks */
  23. #define QUEUE_SIZE 10 /* Rozmiar kolejki */
  24.  
  25.  
  26.  
  27. /*
  28. *********************************************************************************************************
  29. * VARIABLES
  30. *********************************************************************************************************
  31. */
  32.  
  33. OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */
  34. OS_STK TaskStartStk[TASK_STK_SIZE];
  35. char TaskData[N_TASKS]; /* Parameters to pass to each task */
  36. OS_EVENT *RandomSem;
  37. OS_EVENT *Queue;
  38. OS_EVENT *MailBox;
  39. char PostedMsg[QUEUE_SIZE];//Wiadomosc
  40. void *Storage[QUEUE_SIZE]; //Magazyn wiadomosci
  41.  
  42.  
  43. /*
  44. *********************************************************************************************************
  45. * FUNCTION PROTOTYPES
  46. *********************************************************************************************************
  47. */
  48.  
  49. void Task(void *data); /* Function prototypes of tasks */
  50. void TaskStart(void *data); /* Function prototypes of Startup task */
  51. static void TaskStartCreateTasks(void);
  52. static void TaskStartDispInit(void);
  53. static void TaskStartDisp(void);
  54.  
  55. void Keypad(void *data);
  56.  
  57. void QueueTask(void *data);
  58.  
  59. void MailBoxTask(void *data);
  60.  
  61. void DisplayMsg(void *data);
  62.  
  63. /*$PAGE*/
  64. /*
  65. *********************************************************************************************************
  66. * MAIN
  67. *********************************************************************************************************
  68. */
  69.  
  70. void main (void)
  71. {
  72. PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */
  73.  
  74. OSInit(); /* Initialize uC/OS-II */
  75.  
  76. PC_DOSSaveReturn(); /* Save environment to return to DOS */
  77. PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
  78.  
  79. RandomSem = OSSemCreate(1); /* Random number semaphore */
  80. Queue = OSQCreate(&Storage[0], QUEUE_SIZE);//Tworzenie kolejki
  81. MailBox = OSMboxCreate((void *)0);//Tworzenie mailboxa */
  82. OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
  83. OSStart(); /* Start multitasking */
  84. }
  85.  
  86.  
  87. /*
  88. *********************************************************************************************************
  89. * STARTUP TASK
  90. *********************************************************************************************************
  91. */
  92. void TaskStart (void *pdata)
  93. {
  94. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
  95. OS_CPU_SR cpu_sr;
  96. #endif
  97. char s[100];
  98. INT16S key;
  99.  
  100.  
  101. pdata = pdata; /* Prevent compiler warning */
  102.  
  103. TaskStartDispInit(); /* Initialize the display */
  104.  
  105. OS_ENTER_CRITICAL();
  106. PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
  107. PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
  108. OS_EXIT_CRITICAL();
  109.  
  110. OSStatInit(); /* Initialize uC/OS-II's statistics */
  111. OSTaskCreate(Keypad, (void *)0, &TaskStk[N_TASKS-1][TASK_STK_SIZE - 1], 5); /* Tworzymy zadanie sczytujące z klawiatury */
  112. OSTaskCreate(QueueTask, (void *)0, &TaskStk[N_TASKS-2][TASK_STK_SIZE - 1], 4); /* Tworzymy zadanie przepisujące z kolejki do Mailbox */
  113. OSTaskCreate(DisplayMsg, (void *)0, &TaskStk[N_TASKS-3][TASK_STK_SIZE - 1], 2); /* Tworzymy zadanie wyświetlające */
  114.  
  115. TaskStartCreateTasks(); /* Create all the application tasks */
  116.  
  117. for (;;) {
  118. TaskStartDisp(); /* Update the display */
  119. OSCtxSwCtr = 0; /* Clear context switch counter */
  120. OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
  121. }
  122. }
  123.  
  124. /*$PAGE*/
  125. /*
  126. *********************************************************************************************************
  127. * INITIALIZE THE DISPLAY
  128. *********************************************************************************************************
  129. */
  130.  
  131. static void TaskStartDispInit (void)
  132. {
  133. /* 1111111111222222222233333333334444444444555555555566666666667777777777 */
  134. /* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
  135. PC_DispStr( 0, 0, " uC/OS-II, The Real-Time Kernel ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
  136. PC_DispStr( 0, 1, " Jean J. Labrosse ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  137. PC_DispStr( 0, 2, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  138. PC_DispStr( 0, 3, " EXAMPLE #1 ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  139. PC_DispStr( 0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  140. PC_DispStr( 0, 5, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  141. PC_DispStr( 0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  142. PC_DispStr( 0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  143. PC_DispStr( 0, 8, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  144. PC_DispStr( 0, 9, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  145. PC_DispStr( 0, 10, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  146. PC_DispStr( 0, 11, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  147. PC_DispStr( 0, 12, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  148. PC_DispStr( 0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  149. PC_DispStr( 0, 14, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  150. PC_DispStr( 0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  151. PC_DispStr( 0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  152. PC_DispStr( 0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  153. PC_DispStr( 0, 18, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  154. PC_DispStr( 0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  155. PC_DispStr( 0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  156. PC_DispStr( 0, 21, " Wiadomosc: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  157. PC_DispStr( 0, 22, "#Tasks : CPU Usage: % ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  158. PC_DispStr( 0, 23, "#Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  159. PC_DispStr( 0, 24, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
  160. /* 1111111111222222222233333333334444444444555555555566666666667777777777 */
  161. /* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
  162. }
  163.  
  164. /*$PAGE*/
  165. /*
  166. *********************************************************************************************************
  167. * UPDATE THE DISPLAY
  168. *********************************************************************************************************
  169. */
  170.  
  171. static void TaskStartDisp (void)
  172. {
  173. char s[80];
  174.  
  175.  
  176. sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */
  177. PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  178.  
  179. #if OS_TASK_STAT_EN > 0
  180. sprintf(s, "%3d", OSCPUUsage); /* Display CPU usage in % */
  181. PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  182. #endif
  183.  
  184. sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */
  185. PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  186.  
  187. sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* Display uC/OS-II's version number */
  188. PC_DispStr(75, 25, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  189.  
  190. switch (_8087) { /* Display whether FPU present */
  191. case 0:
  192. PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE);
  193. break;
  194.  
  195. case 1:
  196. PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
  197. break;
  198.  
  199. case 2:
  200. PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
  201. break;
  202.  
  203. case 3:
  204. PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
  205. break;
  206. }
  207. }
  208.  
  209. /*$PAGE*/
  210. /*
  211. *********************************************************************************************************
  212. * CREATE TASKS
  213. *********************************************************************************************************
  214. */
  215.  
  216. static void TaskStartCreateTasks (void)
  217. {
  218. INT8U i;
  219.  
  220.  
  221. for (i = 0; i < N_TASKS-3; i++) { /* Create N_TASKS identical tasks */
  222. TaskData[i] = '0' + i; /* Each task will display its own letter */
  223. OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], i + 1);
  224. }
  225. }
  226.  
  227. /*
  228. *********************************************************************************************************
  229. * TASKS
  230. *********************************************************************************************************
  231. */
  232.  
  233. void Task (void *pdata)
  234. {
  235. INT8U x;
  236. INT8U y;
  237. INT8U err;
  238.  
  239.  
  240. for (;;) {
  241. OSSemPend(RandomSem, 0, &err); /* Acquire semaphore to perform random numbers */
  242. x = random(80); /* Find X position where task number will appear */
  243. y = random(16); /* Find Y position where task number will appear */
  244. OSSemPost(RandomSem); /* Release semaphore */
  245. /* Display the task number on the screen */
  246. PC_DispChar(x, y + 5, *(char *)pdata, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  247. OSTimeDly(1); /* Delay 1 clock tick */
  248. }
  249. }
  250.  
  251.  
  252. /*
  253. Klawiatura
  254. */
  255.  
  256. void Keypad (void *data)
  257. {
  258. INT8U err;
  259. INT16S key;
  260. int i = 0;
  261. int k;
  262.  
  263. data = data;
  264.  
  265. for (;;) {
  266. if (PC_GetKey(&key) == TRUE) {
  267. if(key == 0x08 && i > 0) //Backspace
  268. {
  269. PostedMsg[--i] = 0x20;
  270. }
  271.  
  272. else if(key == 0x09) //Delete Key
  273. {
  274. for(k = 0; k < i; ++k )
  275. {
  276. PostedMsg[k] = ' ';
  277. }
  278. i = 0;
  279. }
  280.  
  281. else if(key == 0x0D ) //Enter
  282. {
  283. err = OSQPost(Queue, (void *)&PostedMsg[0]);
  284. if( err == OS_NO_ERR )
  285. {
  286. for(k = 0; k < i; ++k )
  287. {
  288. PostedMsg[k] = ' ';
  289. }
  290. i = 0;
  291.  
  292. }
  293. }
  294.  
  295. else if(key == 0x1B) //Esc
  296. {
  297. PC_DOSReturn();
  298. }
  299. else if(i < (QUEUE_SIZE-1))
  300. {
  301. PostedMsg[i] = key;
  302. ++i;
  303. }
  304.  
  305. }
  306.  
  307. PC_DispStr( 0, 21, PostedMsg, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  308. OSTimeDly(1); /* Delay 1 clock tick */
  309. }
  310. }
  311.  
  312. /*
  313. Queue --> Mailbox
  314. */
  315.  
  316. void QueueTask (void *data)
  317. {
  318. INT8U err;
  319. void *msg;
  320. INT16S key;
  321. data = data;
  322.  
  323. for(;;)
  324. {
  325. msg = OSQPend(Queue, 100, &err); // oczekiwanie na msg z queue
  326. if (err == OS_NO_ERR)
  327. {
  328.  
  329. err = OSMboxPost(MailBox, (void *)msg); // przekazanie msg do mailbox
  330. if( err == OS_NO_ERR )
  331. {
  332. OSQFlush(Queue);
  333. }
  334.  
  335. }
  336. OSTimeDly(1);
  337. }
  338. }
  339.  
  340. /*
  341. Mailbox ->Display
  342. */
  343.  
  344. void DisplayMsg (void *data)
  345. {
  346. INT8U err;
  347. void *msg;
  348. data = data;
  349.  
  350. for(;;)
  351. {
  352. msg = OSMboxPend(MailBox, 100, &err);
  353. if (err == OS_NO_ERR)
  354. {
  355. PC_DispStr( 25, 21, msg, DISP_FGND_YELLOW + DISP_BGND_BLUE);
  356. }
  357. OSTimeDly(2);
  358. }
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement