Роб Кёртен - Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
- Название:Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
- Автор:
- Жанр:
- Издательство:Петрополис
- Год:2001
- Город:Санкт-Петербург
- ISBN:5-94656-025-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Роб Кёртен - Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform краткое содержание
Книга "Введение в QNX/Neutrino 2» откроет перед вами в мельчайших подробностях все секреты ОСРВ нового поколения от компании QNX Software Systems Ltd (QSSL) — QNX/Neutrino 2. Книга написана в непринужденной манере, легким для чтения и понимания стилем, и поможет любому, от начинающих программистов до опытных системотехников, получить необходимые начальные знания для проектирования надежных систем реального времени, от встраиваемых управляющих приложений до распределенных сетевых вычислительных систем
В книге подробно описаны основные составляющие ОС QNX/Neutrino и их взаимосвязи. В частности, уделено особое внимание следующим темам:
• обмен сообщениями: принципы функционирования и основы применения;
• процессы и потоки: базовые концепции, предостережения и рекомендации;
• таймеры: организация периодических событий в программах;
• администраторы ресурсов: все, что относится к программированию драйверов устройств;
• прерывания: рекомендации по эффективной обработке.
В книге представлено множество проверенных примеров кода, подробных разъяснений и рисунков, которые помогут вам детально вникнуть в и излагаемый материал. Примеры кода и обновления к ним также можно найти на веб-сайте автора данной книги, www.parse.com.
Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Чтобы не путать точки входа в функции-обработчики сообщений с вызовами клиентской Си-библиотеки (например, open() ), к именам всех приведенных здесь функций добавлен префикс « io_ ». Например, обработчик функции установления соединения open() будет называться io_open() .
int io_chmod(resmgr_context_t * ctp , io_chmod_t * msg ,
RESMGR_OCB_T * ocb )
Классификация: Функция ввода/вывода
Обработчик по умолчанию: iofunc_chmod_default()
Вспомогательные функции: iofunc_chmod()
Клиентская функция: chmod() , fchmod()
Сообщения: _IO_CHMOD
Структура данных:
struct _io_chmod {
uint16_t type ;
uint16_t combine_len ;
mode_t mode ;
};
typedef union {
struct _io_chmod i ;
} io_chmod_t;
Описание: Отвечает за изменение режима доступа к ресурсу, указанному в переданном ей параметре ocb , в значение, содержащееся в поле сообщения mode.
Возвращает: Код завершения, при помощи вспомогательного макроса _RESMGR_STATUS .
int io_chown(resmgr_context_t * ctp , io_chown_t * msg ,
RESMGR_OCB_T * ocb )
Классификация: Функция ввода/вывода
Обработчик по умолчанию: iofunc_chown_default()
Вспомогательные функции: iofunc_chown()
Клиентская функция: chown() , fchown()
Сообщения: _IO_CHOWN
Структура данных:
struct _io_chown {
uint16_t type ;
uint16_t combine_len ;
int32_t gid ;
int32_t uid ;
};
typedef union {
struct _io_chown i ;
} io_chown_t;
Описание: Ответственна за изменение полей идентификатора пользователя и группы для ресурса, указанному в переданном ей параметре ocb, соответственно в значения uid и gid . Отметим, что чтобы узнать, позволяет ли данная файловая система выполнять chown() кому-либо, кроме суперпользователя (root), надо проверить запись точки монтирования на предмет флага IOFUNC_PC_CHOWN_RESTRICTED, а также поле flags в OCB.
Возвращает: Код завершения, при помощи вспомогательного макроса _RESMGR_STATUS .
int io_close_dup(resmgr_context_t * ctp , io_close_t * msg ,
RESMGR_OCB_T * ocb )
Классификация: Функция ввода/вывода
Обработчик по умолчанию: iofunc_close_dup_default()
Вспомогательные функции: iofunc_close_dup()
Клиентская функция. close() , fclose()
Сообщения: _IO_CLOSE_DUP
Структура данных:
struct _io_close {
uint16_t type ;
uint16_t combine_len ;
};
typedef union {
struct _io_close i ;
} io_close_t;
Описание: Это реальный обработчик клиентских вызовов close() и fclose() . Отметим, что вам почти никогда не придется переназначать эту функцию; оставляйте в таблице функций ввода/вывода значение iofunc_close_dup_default() . Причиной этому служит то, что базовый уровень библиотеки отслеживает число сообщений open() , dup() и close() , выданных по каждому OCB, и синтезирует вызов io_close_ocb() (см. ниже) после получения для данного OCB последнего сообщения close() . Отметим, что идентификаторы отправителей, расположенные в ctp->rcvid
, могут и не совпадать с переданными функции io_open() ; однако, совпадение по меньшей мере одного идентификатора гарантируется. «Лишние» идентификаторы отправителей являются результатом (возможно, внутренних) вызовов типа dup() .
Возвращает: Код завершения, при помощи вспомогательного макроса _RESMGR_STATUS .
int io_close_ocb(resmgr_context_t * ctp , void* reserved ,
RESMGR_OCB_T * ocb )
Классификация: Функция ввода/вывода (синтезируется библиотекой)
Обработчик по умолчанию: iofunc_close_default()
Вспомогательные функции: Нет
Клиентская функция: Нет (синтезируется библиотекой)
Сообщения: Нет (синтезируется библиотекой)
Структура данных:
// Синтезируется библиотекой
struct _io_close {
uint16_t type ;
uint16_t combine_len ;
};
typedef union {
struct _io_close i ;
} io_close_t;
Описание: Это функция, которая синтезируется базовым уровнем библиотеки, когда для некоего OCB получено последнее сообщение close() . Это то самое место, где вам следует «подчистить» все перед уничтожением OCB. Отметим, что идентификатор отправителя в ctp->rcvid
есть нуль (0), потому что данная функция синтезируется библиотекой и не обязательно соответствует какому-либо конкретному сообщению.
Возвращает: Код завершения, при помощи вспомогательного макроса _RESMGR_STATUS .
int io_devctl(resmgr_context_t * ctp , io_devctl_t * msg ,
RESMGR_OCB_T * ocb )
Классификация: Функция ввода/вывода
Обработчик по умолчанию: iofunc_devctl_default()
Вспомогательные функции: iofunc_devctl()
Клиентская функция: devctl() , ioctl()
Сообщения: _IO_DEVCTL
Структура данных:
struct _io_devctl {
uint16_t type ;
uint16_t combine_len ;
int32_t dcmd ;
int32_t nbytes ;
int32_t zero ;
};
struct _io_devctl_reply {
uint32_t zero ;
int32_t ret_val ;
int32_t nbytes ;
int32_t zero2 ;
};
typedef union {
struct _io_devctl i ;
struct _io_devctl_reply o ;
} io_devctl_t;
Описание: Выполняет над устройством операцию ввода/вывода, переданную от клиентской функции devctl() в параметре dcmd . Клиент кодирует направление передачи данных двумя старшими разрядами dcmd , указывая этим, как функция devctl() должна передавать данные (поле «to» соответствует биту _POSIX_DEVDIR_TO, поле «from» — биту _POSIX_DEVDIR_FROM):
Поле «to» | Поле «from» | Значение |
---|---|---|
0 | 0 | Передачи данных нет |
0 | 1 | Передача от драйвера клиенту |
1 | 0 | Передача от клиента драйверу |
1 | 1 | Двунаправленная передача |
В случае, когда передачи данных нет, предполагается, что драйвер просто выполняет команду, заданную в dcmd . В случае передачи данных предполагается, что драйвер передает данные клиенту и/или обратно, используя вспомогательные функции resmgr_msgreadv() и resmgr_msgwritev() . Клиент указывает размер передачи в поле nbytes ; драйвер должен установить число передаваемых байт в поле nbytes исходящей структуры.
Отметим, что структуры данных, предназначенные для ввода и вывода, дополнены нулями, чтобы быть выровненными друг относительно друга. Это означает, что неявная область данных начинается в этих структурах с того же самого адреса.
Читать дальшеИнтервал:
Закладка: