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

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

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

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

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

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

Мiнiстерство освiти і науки, молоді та спорту України Національний університет “Львівська політехніка” Кафедра ЕОМ  Звіт до лабораторної роботи №2 з диcципліни: «Програмовані системи реального часу» на тему: «Створення різних процесів із одного тіла функції. Передача параметрів процесу при ініціалізації» Мета роботи: розробити програму, в якій створюються три різних задачі, використовуючи ідентичний код самого процесу. Кожен із процесів повинен виводити лічильник, значення якого інкрементується через заданий інтервал часу. Задачі передаються три параметри: координати рядку, в якому виводиться лічильник, значення інкременту і період затримки в тіках системного таймеру, через які повинен лічильних інкрементуватися. Теоретична частина В системі UCOS-II функція процесу являє собою функцію, яка не повертає значення і в якості параметру отримує нетипізований вказівник: void Task (void *par); Саме вказівник par використовується для передачі задачі параметрів. Для передачі задачі параметрів необхідно створити структуру, полями якої будуть необхідні для задачі параметри і передати при створенні задачі вказівник на неї. Оскільки при створенні задачі за допомогою функції OSTaskCreate копіюється лише сам вказівник, а не структура із параметрами, то для кожної задачі доцільно мати окрему структуру, адреса якої передається при створенні процесу (задачі). lab2.c: #include "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]; //------------------Struct------------------ struct values{ int x; int y; int inc; int delay; }; struct values TaskData[N_TASKS]; 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("\nInput x for process #%d:\t",i+1); scanf("%d",&TaskData[i].x); printf("\nInput y for process #%d:\t",i+1); scanf("%d",&TaskData[i].y); printf("\nInput inc value for process #%d:\t",i+1); scanf("%d",&TaskData[i].inc); printf("\nInput delay for process #%d:\t\t",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 */ 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 */ 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 (;;) { 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; int counter=0; struct values *temp=(struct values*)parg; for (;;) { gotoxy(temp->x,temp->y); printf("%d",counter+=temp->inc); OSTimeDly(temp->delay); } } Результат роботи:  Висновок: завдяки цій лабораторній роботі я навчився розробляти найпростіші програми в даній системі, розробляти декілька процесів з одного тіла функції, а також передавати параметри процесів при ініціалізації.
Антиботан аватар за замовчуванням

22.03.2013 13:03-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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