Створення різних процесів із одного тіла функції. Передача параметрів процесу при ініціалізації

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2011
Тип роботи:
Лабораторна робота
Предмет:
Інші

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти та науки України Національний університет “Львівська політехніка” Кафедра ЕОМ Лабораторна робота №2 з диципліни: «Програмовані системи реального чаму» на тему: «Створення різних процесів із одного тіла функції. Передача параметрів процесу при ініціалізації» Мета роботи: розробити програму, в якій створюються три різних задачі, використовуючи ідентичний код самого процесу. Кожен із процесів повинен виводити лічильник, значення якого інкрементується через заданий інтервал часу. Задачі передаються три параметри: координати рядку, в якому виводиться лічильник, значення інкременту і період затримки в тіках системного таймеру, через які повинен лічильних інкрементуватися. Теоретична частина В системі UCOS-II функція процесу являє собою функцію, яка не повертає значення і в якості параметру отримує нетипізований вказівник: void Task (void *par); Саме вказівник par використовується для передачі задачі параметрів. Для передачі задачі параметрів необхідно створити структуру, полями якої будуть необхідні для задачі параметри і передати при створенні задачі вказівник на неї. Оскільки при створенні задачі за допомогою функції OSTaskCreate копіюється лише сам вказівник, а не структура із параметрами, то для кожної задачі доцільно мати окрему структуру, адреса якої передається при створенні процесу (задачі). Хід роботи #include "..\test\includes.h" #include <conio.h> #include <stdio.h> #define TASK_STK_SIZE 512/* Size of each task's stacks (# of WORDs)*/ #define N_TASKS 3 /* Number of identical tasks */ OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */ OS_STK TaskStartStk[TASK_STK_SIZE]; //char TaskData[N_TASKS]; /* Parameters to pass to each task*/ //OS_EVENT *RandomSem; struct Data{ int X; int Y; int Inc; int Delay; }; struct Data TaskData[N_TASKS];//={{10,10,1,5},{20,20,1,5},{30,30,1,5}}; void Task(void *p_arg); /* Function prototypes of tasks*/ void TaskStart(void *p_arg);/*Function prototypes of Startup task*/ static void TaskStartCreateTasks(void); void main (void) { int i; clrscr(); for(i=0;i<N_TASKS;i++) { printf("Process #%d: x = ",i+1); scanf("%d",&TaskData[i].X); printf("Process #%d: y = ",i+1); scanf("%d",&TaskData[i].Y); printf("Process #%d: inc = ",i+1); scanf("%d",&TaskData[i].Inc); printf("Process #%d: delay = ",i+1); scanf("%d",&TaskData[i].Delay); } clrscr(); 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); OSStart(); /* Start multitasking */ } void TaskStart (void *parg) { #if OS_CRITICAL_METHOD == 3/* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr; #endif char s[100]; INT16S key; parg = parg; /* Prevent compiler warning */ //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 */ 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 */ } } static void TaskStartCreateTasks (void) { INT8U i; for (i = 0; i < N_TASKS; i++) { /* Create N_TASKS identical tasks*/ OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], i + 1); } } void Task (void *parg) { INT8U x; INT8U y; INT8U err; static int counter=0; struct Data *p=(struct Data*)parg; for (;;) { gotoxy(p->X,p->Y); printf("%d",counter+=p->Inc); OSTimeDly(p->Delay); /* Delay clock tick */ } } Висновок: завдяки цій лабораторній роботі я навчився розробляти найпростіші програми в даній системі, розробляти декілька процесів з одного тіла функції, а також передавати параметри процесів при ініціалізації.
Антиботан аватар за замовчуванням

22.03.2013 13:03-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!