- •Министерство образования и науки Украины
- •1. Определение системам реального времени
- •1.1. Основные понятия
- •1.2. Срв
- •1.3. Классификация срв
- •1.4. Структура срв
- •Основные требования к срв и их особенности
- •1.4.1. Ос
- •1.4.2. Основные архитектурные решения ос
- •1.4.3. Основные концепции ос
- •Прерывания
- •Системные вызовы
- •Файловая система
- •Процессы
- •Нити (потоки)
- •Понятие ресурса
- •1.5. Аппаратные среды срв
- •1.5.1. Мультипрограммная среда
- •Состояния процесса (см. Рисунок 4.).
- •1.5.2. Симметричная мультипроцессорная среда (рис. 5)
- •1.5.3. Распределенная среда (рис. 6)
- •1.6. Конфигурации клиент-серверных систем (рис.7.)
- •1.7. Средства ввода-вывода срв
- •2.1. Версии qnx
- •2.2. Posix-совместимость
- •2.3. Архитектура микроядра qnx
- •2.3.1. Микроядро
- •2.3.2. Системные процессы
- •2.3.3. Системные и пользовательские процессы
- •2.3.4. Драйверы устройств
- •2.3.5. Межпроцессное взаимодействие
- •2.3.6. Сеть qnx
- •2.4. Файлы и файловая система
- •2.4.1. Типы файлов
- •2.4.2. Жесткие ссылки
- •2.4.3. Символические ссылки
- •2.4.4. Named Special Device — именованные специальные устройства
- •2.4.5. Именованные программные каналы (fifo) (Именованный канал)
- •2.5. Структура файловой системы qnx
- •2.6. Концепция прав доступа
- •3. Начало работы
- •3.1. Интерфейс командной строки
- •3.2. Консоль командной строки
- •3.3. Соглашения по работе с командной строкой
- •3.4. Знакомство с shell
- •3.5. Обращение к домашнему каталогу
- •3.6. Базовые команды
- •3.6.1. Изменение текущего каталога
- •3.6.2. Просмотр содержимого каталогов
- •Жесткая ссылка обозначает ся так же, как файл, на который она ссылается, счетчик ссылок при этом будет иметь значение больше 1.
- •3.6.3. Создание новых каталогов
- •3.6.4. Копирование файлов
- •3.6.5. Перемещение файлов
- •3.6.6. Удаление файлов
- •3.6.7. Удаление каталогов
- •3.6.8. Просмотр содержимого файлов
- •3.6.9. Конкатенация (слияние) и просмотр файлов
- •3.6.10. Получение оперативной помощи
- •4. Объектно-ориентированное программирование
- •4.1. Системы программирования
- •4.2. Создание приложения
- •4.3. Средства отладки программ
- •5. Архитектура ос qnx
- •5.1. Типы процессов
- •5.2. Механизмы микроядра
- •5.3. Диспетчеризация потоков
- •5.4. Администратор процессов
- •5.5. Управление памятью
- •5.6. Управление пространством путевых имен
- •5.7. Пространство путевых имен
- •5.7.1. Файловая система qnx
- •5.7.2. Виртуальные устройства
- •Устройство /dev/null
- •Устройство /dev/zero
- •Устройство /dev/full
- •Устройства генерирования случайных чисел
- •5.8. Программы, процессы, нити
- •5.9. Свойства процессно-нитиевой структуры прв
- •5.10. Программный интерфейс qnx
- •5.10.1. Системные вызовы и функции стандартных библиотек
- •5.10.2. Обработка ошибок
- •5.11. Формальные параметры функции main
- •5.12. Разграничение доступа к файлам
- •5.13. Функции базового ввода/вывода
- •5.13.1. Открытие файла
- •5.13.2. Дублирование дескриптора файла
- •5.13.3. Доступ к файлу
- •6. Функции управления файловой системой
- •6.1. Смена корневого каталога
- •6.2. Смена текущего каталога
- •6.3. Создание каталога
- •6.4. Удаление каталога
- •6.5. Создание жесткой связи
- •6.6. Создание символической связи
- •6.7. Чтение символической связи
- •6.8. Переименование файла
- •6.9. Удаление файла
- •7. Микроядро
- •7.1. Запуск процессов
- •7.2. Запуск процесса из shell
- •7.3. Программный запуск процессов
- •7.3.1. Функция system()
- •7.3.2. Функции семейства exec*()
- •7.3.3. Функции семейства spawn*()
- •7.3.4. Функция fork()
- •7.3.5. Функция vfork()
- •7.4. Организация взаимодействия между процессами
- •7.5. Создание и удаление каналов Создание канала.
- •Удаление канала
- •7.6. Установление и удаление соединений с каналом Установление соединения
- •Int ConnectAttach(uint32_t nd, pid_t pid, int chid, unsigned index, int flags);
- •Разрыв соединения
- •Int ConnectDetach(int coid);
- •7.7. Передача сообщений
- •7.7.1. Посылка сообщения
- •IntMsgSend(int coid, constvoid* smsg, int sbytes, void* rmsg, int rbytes);
- •7.7.2. Прием сообщения
- •Int MsgReceive(int chid, void *msg, int bytes, struct _msg_info *info);
- •7.7.3. Посылка ответа
- •Int MsgReply(int rcvid,int status,const void* msg, int size);
- •7.7.4. Сценарии ответов
- •7.7.5. Управление сообщениями
- •7.7.6. Управление приемом сообщений
- •7.7.7. Управление передачей ответа
- •Int MsgSendv(int coid, const iov_t* siov, //Массив iov сообщения int sparts, //Количество iov сообщения const iov_t* riov, //Массив iov ответа int rbytes); //Количество iov ответа
- •Int MsgReceivev(int chid, const iov_t* riov, //Массив iov буфера int sparts, //Количество iov буфера struct_msg_info* riov);
4.2. Создание приложения
Базовым языком программирования в QNX является язык С. В качестве стандартного компилятора в QNX входит компилятор – qcc.
Процедура создания программ на языке приведена на рис.11.
Написание программ осуществляется с использованием любого текстового редактора, входящего в состав системных средств QNX. Создать текстовый файл можно, например, с использование стандартного текстового редактора Editor или с помощью встроенного редактора оболочки Midnight Commander.
При указании имени файла исходного модуля программы предлагается использовать стандартное расширение ".c".
И
так,
для получения приложения исходный текст
обрабатывается таким конвейером:
препроцессор — компилятор — компоновщик.
Эту цепочку удобнее всего вызывать
командой qcc.
Удобство
создается тем, что у этой команды есть
конфигурационные
файлы, позволяющие ей задавать по
умолчанию оптимальную
комбинацию опций для всех перечисленных
инструментов
(см. каталог /etc/qcc). Давайте создадим
текстовой файл I
с именем hello.с и наполним его банальным
текстом на языке С: main
() {
printf("Hello world!\n"); }
Обратите внимание, что я не потрудился написать директиву препроцессора «include <stdio.h> — qcc сама знает, что без stdio.h не обойтись.
Для того чтобы получить программу hello для Intel-совместимых целевых систем, следует выполнить команду
qcc -Vgcc_ntox86 hello.с -о hello
Ключ -V с параметром gcc_ntox86 определяет режим компиляции программы для платформы на базе процессора Intel.
Получить полный список целевых платформ, для которых можно сгенерировать приложение, можно командой
qcc -V
Например, gcc_ntoppcbe — для целевых систем PowerPC BigEndian, a gcc_ntomipsie — для MIPS LittleEndian.
С QNX Neutrino 6.3 поставляются два GCC-компилятора: версия 2.95.2 (используется по умолчанию) и 3.3.1. Откомпилируем ту же программу компилятором посвежее:
qcc -V3.3.I,gcc_ntox86 hello.с -о hello_new
Может это и случайность, но размер heiio_new у меня получился меньше, чем hello.
При завершении отладки программы для получения её коммерческого варианта может оказаться полезным использование при компиляции средств оптимизации кода исполняемого модуля. Есть несколько уровней оптимизации, для большинства случаев подходит второй. Для включения средств оптимизации используется опция "‑О<уровень оптимизации>". Следующая команда компилирует файл с включенным режимом оптимизации второго уровня:
# qcc -Vgcc_ntox86 –c -O2 example.c
Заметим, что включение средств оптимизации иногда приводит к проявлению скрытых ошибок, незаметных ранее.
4.3. Средства отладки программ
В качестве средства отладки программ QNX включает в себя отладчик gdb. Это программа, под управлением которой можно запустить исполняемый модуль программы. Чтобы можно было воспользоваться отладчиком, необходимо скомпилировать программу с включением в неё отладочной информации. Этой цели служит опция "-g" компилятора. В результате компилятор включает дополнительную информацию в объектные и исполняемые модули, позволяющую связать исходный текст программы с исполняемым модулем.
Чтобы воспользоваться отладчиком gdb, его необходимо запустить, указав в качестве аргумента имя исполняемого модуля:
# gdb <имя модуля>
После запуска появляется строка приглашения для ввода команд отладчика:
(gdb)
Перечислим наиболее ходовые команды отладчика:
run - запустить исполняемый модуль.
where - показать содержимое стека.
up -движение вверх по стеку.
print - показать значение переменной.
break - установить контрольную точку (точка остановки).
next - перейти после остановки на следующую строку.
step - войти внутрь функции.
Например, запуск исполняемого модуля осуществляется командой:
(gdb)run
Подробную информацию о командах отладчика можно получить с помощью команды help. Например:
(gdb) help run
