Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №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 */
}
}
Висновок: завдяки цій лабораторній роботі я навчився розробляти найпростіші програми в даній системі, розробляти декілька процесів з одного тіла функції, а також передавати параметри процесів при ініціалізації.