DevioLab CRYPTO TRADING AUTOMATION
LIVE
AUTOMATED CRYPTO TRADING • BINANCE
Автоматизуйте свій криптопортфель
Торгові боти DevioLab аналізують крипторинок, автоматично відкривають і закривають позиції та керують вашим портфелем на Binance 24/7.
CRYPTO 80 Bots
BINANCE Spot Trading
TRADING 24 / 7
Спробувати DevioLab
deviolab.com

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

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

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

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

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

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

Міністерство освіти та науки України Національний університет “Львівська політехніка” Кафедра ЕОМ Лабораторна робота №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:34

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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