М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);
}
}
Результат роботи:
Висновок: завдяки цій лабораторній роботі я навчився розробляти найпростіші програми в даній системі, розробляти декілька процесів з одного тіла функції, а також передавати параметри процесів при ініціалізації.