Добавил:
hiiamfool
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:3 / T3_Navolockiy_1374
.c/*
Выполнил: Наволоцкий Илья, гр. 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, ¤t_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
*/
