Операционные системы - статьи


RTLinux - часть 2


Для обмена данными между операционными системами реального времени и Linux могут использоваться следующие механизмы:

  • разделяемые области памяти;
  • псевдоустройства, предоставляющие возможность обмена данными с приложениями реального времени.

Ключевой принцип построения RTLinux - как можно больше использовать Linux и как можно меньше собственно RTLinux. Действительно, именно Linux заботится об инициализации системы и устройств, а также о динамическом выделении ресурсов. "На плечи" RTLinux ложится только планирование задач реального времени и обработка прерываний. Для простоты запуска в контексте ядра, сохранения модульности и расширяемости системы процессы реального времени реализованы в виде загружаемых модулей Linux. Как правило, приложение реального времени с RTLinux состоит из двух независимых частей: процесса, исполняемого ядром RTLinux, и обыкновенного Linux-приложения.

Для иллюстрации работы приложения реального времени рассмотрим прикладной модуль, который использует ядро реального времени RTLinux в виде загружаемого модуля Linux: #define MODULE #include <linux/module.h> /* необходимо для задач реального времени */ #include <linux/rt_sched.h> #inlcude <linux/rt_fifo.h> RT_TASK mytask;

В заголовке модуля определяется структура RT_TASK, которая содержит указатели на структуры данных модуля, а также управляющую информацию. В нашем случае, для связи между процессами, используются очереди сообщений FIFO (рис. 2).

Рис. 2. Механизм межпроцессной связи через очереди сообщений FIFO

Модуль реального времени читает данные из устройства и кладет их в очередь сообщений, откуда их потом забирает обыкновенное приложение Linux.

Как и каждый модуль Linux-ядра, процесс реального времени должен выполнить процедуры инициализации и завершения аналогичные модулям Linux: int init_module(void) { /* определить номер очереди сообщений */ #define RTFIFODESC 1 /* взять локальное время */ RTIME now = rt_get_time() rt_task_init(&mytask, mainloop, RTFIFODESC,3000, 4); rt_task_make_periodic(&mytask, now+1000, 25000); return 0; }




Начало  Назад  Вперед



Книжный магазин