[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Пример исполнения в режиме реального времени

Этот пример, исполняющийся в реальном времени, изменяет свечение
процессора 3В каждые пять секунд с постоянного на мерцающее. Пример
работает следующим образом:
29-30     Получения атрибутов класса для класса реального времени.
             ПРИМЕР ИСПОЛНЕНИЯ В РЕЖИМЕ РЕАЛЬНОГО ВРЕМЕНИ

 1 #include <unistd.h>
 2 #include <sys/types.h>
 3 #include <sys/priocntl.h>
 4 #include <sys/rtpriocntl.h>
 5 #include <sys/mman.h>
 6 #include <sys/time.h>
 7 #include <signal.h>
 8 #include <string.h>
 9 #include <sys/sys3b.h>
10
11 /*
12  * Toggle light every 5 second
13  * while executing CPU bound loop.  Error
14  * checking removed for clarity.
15  */
16
17 static void toggle_switch(int);
18
19
20 main()
21 {
22    pcinfo_t pcinfo;
23    pcparms_t pcparms;
24    struct sigaction sigact;
25    struct itimerval itimerval;
26    int count = 0;
27
28    /* Get real time class ID */
29    strcpy(pcinfo.pc_clname, "RT");
30    priocntl(0, 0, PC_GETCID, &pcinfo);
31

36   Идентификатор класса, полученный в строке 30, присваивается полю
pc_cid структуры pcparms.
37-38     Максимальный приоритет для процессов реального времени,
полученный в строке 30, присваивается полю pc_clparms структуры
pcparms.
39-40     Неограниченный временной квант присваивается полю pc_pcparms
структуры psparms.
41   Текущему процессу присваивается максимальный приоритет процессов
реального времени и неограниченный временной квант.
44   Все текущие и будущие отображения страниц процесса реального
времени фиксируются в памяти.
47-50     Обработка сигналов обсуждается в курсе Системные вызовы и
библиотеки ОС UNIX - Часть 2. Таймер, устанавливаемый в строке 57,
посылает сигнал SIGPROF, когда кончается время. Строки 47-50
устанавливают перехват сигнала. В поле sa_handler записывается
функция, которая будет выполняться при получении сигнала. Функция
toggle_switch приведена на странице 7-43. Эта функция будет
выполняться по получению сигнала SIGPROF. sa_mask определяет множество
сигналов, которые будут заблокированы во время исполнения функции
обработки. sigfillset(3C) устанавливает sa_mask так, чтобы эта маска
включала все сигналы. Другими словами, пока выполняется функция
toggle_switch, все сигналы заблокированы.
53-57     Признак ITIMER_PROF устанавливается для таймера в строке 57.
Время таймера уменьшается, когда процесс работает в пользовательском и
системном режиме. Первое уменьшение произойдет после 50000
микросекунд. Таймер будет потом устанавливаться на срабатывание каждые
5 секунд после первого срабатывания.
60-64     Этот цикл моделирует процесс, выполняющий некоторую
обработку данных в реальном времени.

32    /*
33     * Give process highest real time
34     * priority and infinite time quantum
35     */
36    pcparms.pc_cid = pcinfo.pc_cid;
37    ((rtparms_t *)pcparms.pc_clparms)->rt_pri =
38       ((rtinfo_t *)pcinfo.pc_clinfo)->rt_maxpri;
39    ((rtparms_t *)pcparms.pc_clparms)->rt_tqnsecs =
40        RT_TQINF;
41    priocntl(P_PID, P_MYID, PC_SETPARMS, &pcparms);
42
43    /* Lock our address space */
44    memcntl(0,0,MC_LOCKAS,MCL_CURRENT|MCL_FUTURE,0,0);
45
46    /* Arrange for signal handling */
47    sigact.sa_handler = toggle_switch;
48    sigfillset(&sigact.sa_mask);
49    sigact.sa_flags = 0;
50    sigaction(SIGPROF, &sigact, 0);
51
52    /* Start interval timer */
53    itimerval.it_interval.tv_sec = 5;
54    itimerval.it_interval.tv_usec = 0;
55    itimerval.it_value.tv_sec = 0;
56    itimerval.it_value.tv_usec = 50000;
57    setitimer(ITIMER_PROF, &itimerval, NULL);
58
59    /* Enter CPU Bound Loop */
60    while (1) {
61       count++;
62    if (count == 10000)
63       count = 0;
64    }
65 }

Функция toggle_switch исполняется, когда истекает время таймера (через
50000 микросекунд, а потом через каждые 5 секунд). В зависимости от
значения toggle, свечение процессора 3В будет либо постоянным, либо
мерцающим. sys3b(2) с аргументом GRNFLASH устанавливает мерцающее
свечении процессора 3В, а с аргументом GRNON - постоянное. Эта функция
просто изменяет свечение процессора 3В. Тем не менее эта функция могла
быть написана так, чтобы управлять переключателем, который
контролировал бы некоторые действия производственной операции в
реальном времени.

66
67 static void toggle_switch(int sig)
68 {
69    static int toggle = 0;
70
71    if (toggle == 0) {
72       sys3b(GRNFLASH);
73       toggle = 1;
74    }
75    else {
76       sys3b(GRNON);
77       toggle = 0;
78    }
79 }