[<<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 }