Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3 / T3_Navolockiy_1374

.c
Скачиваний:
0
Добавлен:
09.11.2025
Размер:
5.3 Кб
Скачать
/*
 Выполнил: Наволоцкий Илья, гр. 1374
 Задание: Циклическая система управления
 Дата выполнения: 12 марта 2025
 */

/*
 Описание программы:
    Данная программа создает три программных таймера с периодами 500, 750 и 1000 мс соответственно. 
    Каждый таймер отправляет сигнал по истечении заданного интервала времени, вызывая соответствующую управляющую процедуру.
    При каждом вызове фиксируется текущее время и вычисляется интервал с момента предыдущего вызова.

 Основные функции:
  - doControl_1, doControl_2, doControl_3:
      Обработчики сигналов, вызываются при срабатывании соответствующих таймеров.
      Каждая из них вызывает print_time_diff для вычисления времени с предыдущего вызова.
  - setup_timer:
      Создает таймер, привязывает его к сигналу и настраивает его на периодический вызов.
      При создании таймера фиксируется время первого вызова для последующих вычислений.
  - print_time_diff:
      Фиксирует текущее время и вычисляет разницу с предыдущим вызовом данной процедуры.
      Выводит на экран номер процедуры, текущее время вызова и прошедшее время с предыдущего вызова.
 */
 
/*
 Скрипт для компиляции и запуска программы:
 Сборка: gcc T3_Navolockiy_1374.c -o T3_Navolockiy_1374 -lrt
 Запуск: ./T3_Navolockiy_1374
 */

#define _POSIX_C_SOURCE 199309L
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>

// Глобальные переменные для хранения времени предыдущего вызова
struct timespec last_exec_time[3];

void print_time_diff(int proc_num) {
    struct timespec current_time;
    clock_gettime(CLOCK_MONOTONIC, &current_time);
    
    double elapsed_time = (current_time.tv_sec - last_exec_time[proc_num].tv_sec) * 1000.0 +
                          (current_time.tv_nsec - last_exec_time[proc_num].tv_nsec) / 1.0e6;
    
    printf("Procedure #%d [%ld.%03ld] ms, [Period] %.2f ms\n", proc_num + 1,
           current_time.tv_sec, current_time.tv_nsec / 1000000, elapsed_time);
    
    last_exec_time[proc_num] = current_time;
}

void doControl_1(int sig) { print_time_diff(0); }
void doControl_2(int sig) { print_time_diff(1); }
void doControl_3(int sig) { print_time_diff(2); }

void setup_timer(int proc_num, int interval_ms, void (*handler)(int)) {
    struct sigaction sa;
    sa.sa_flags = 0;
    sa.sa_handler = handler;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGRTMIN + proc_num, &sa, NULL);
    
    struct sigevent sev;
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIGRTMIN + proc_num;
    sev.sigev_value.sival_ptr = NULL;
    
    timer_t timer_id;
    timer_create(CLOCK_MONOTONIC, &sev, &timer_id);
    
    struct itimerspec its;
    its.it_value.tv_sec = interval_ms / 1000;
    its.it_value.tv_nsec = (interval_ms % 1000) * 1000000;
    its.it_interval = its.it_value;
    
    timer_settime(timer_id, 0, &its, NULL);
    
    clock_gettime(CLOCK_MONOTONIC, &last_exec_time[proc_num]);
}

int main() {
    setup_timer(0, 500, doControl_1);
    setup_timer(1, 750, doControl_2);
    setup_timer(2, 1000, doControl_3);
    
    while (1) {
        pause(); // Ждём сигналов
    }
    return 0;
}


/*
Лог программы:
> ./T3_Navolockiy_1374
Procedure #1 [5166.505] ms, [Period] 500.03 ms
Procedure #2 [5166.755] ms, [Period] 750.03 ms
Procedure #3 [5167.005] ms, [Period] 1000.03 ms
Procedure #1 [5167.005] ms, [Period] 500.05 ms
Procedure #2 [5167.505] ms, [Period] 750.00 ms
Procedure #1 [5167.505] ms, [Period] 499.98 ms
Procedure #3 [5168.005] ms, [Period] 1000.28 ms
Procedure #1 [5168.005] ms, [Period] 500.31 ms
Procedure #2 [5168.255] ms, [Period] 750.02 ms
Procedure #1 [5168.505] ms, [Period] 499.66 ms
Procedure #3 [5169.005] ms, [Period] 999.70 ms
Procedure #2 [5169.005] ms, [Period] 749.99 ms
Procedure #1 [5169.005] ms, [Period] 500.02 ms
Procedure #1 [5169.505] ms, [Period] 500.24 ms
Procedure #2 [5169.755] ms, [Period] 750.00 ms
Procedure #3 [5170.005] ms, [Period] 1000.28 ms
Procedure #1 [5170.005] ms, [Period] 500.07 ms
Procedure #2 [5170.505] ms, [Period] 749.99 ms
Procedure #1 [5170.505] ms, [Period] 499.70 ms
Procedure #3 [5171.005] ms, [Period] 999.77 ms
Procedure #1 [5171.005] ms, [Period] 500.05 ms
Procedure #2 [5171.255] ms, [Period] 750.01 ms
Procedure #1 [5171.505] ms, [Period] 499.91 ms
Procedure #3 [5172.005] ms, [Period] 999.98 ms
Procedure #2 [5172.005] ms, [Period] 750.04 ms
Procedure #1 [5172.005] ms, [Period] 500.07 ms
^C
 */