URC220_QNX (Раздаточные материалы)
Описание файла
Файл "URC220_QNX" внутри архива находится в следующих папках: Раздаточные материалы, Документация. PDF-файл из архива "Раздаточные материалы", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "поук" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
Московский государственный технический университет им. Н.Э. БауманаФакультет «Робототехника и комплексная автоматизация»Кафедра «Робототехнические системы»Куренев П.Н.Описание драйвера и алгоритма работы ПО длямногофункционального устройства URC220в ОСРВ QNXМосква20071. Техническое заданиеНеобходимо разработать для операционной системы реального времени QNXдрайвер устройства URC220, подключаемого к компьютеру через универсальнуюпоследовательную шину (USB).Также необходимо разработать библиотеку для облегчения написанияпользовательских программ на C++, а также описание этой библиотеки идемонстрационные программы.22.
ДрайверДля многих задач не всегда требуется писать программу непосредственно длямикроконтроллера, так как достаточно простого управления с компьютера. Дляэтого была реализована программа для микроконтроллера, которая принимаеткоманды от компьютера по USB интерфейсу и управляет всеми периферийнымиустройствами на плате. Для компьютера создан драйвер и библиотека, котораяпозволяет легко управлять платой из любой программы под QNX.Драйвер USB устройства URC220 реализован в виде исполняемого файла “URCSrv”.Кроме драйвера, программа также является нумератором подключаемыхустройств. Выполнена в виде консольного приложения.Программа URCSrv, выполняет следующие задачи:- определение факта подключения устройства;- назначение номера подключённому устройству;- обработка подключения, установление соединения;- корректное отключение от устройства;предоставлениеинтерфейсадлявзаимодействияпользовательским программам.сустройствами2.1 Алгоритм работыПосле запуска, драйвер подключается к USB стеку QNX и назначает функции,которые операционная система вызывает в случае подключения и отключенияустройства.Функция также создаёт объект общего доступа к памяти под именем“/dev/shmem/urc_srv_100”.
С помощью этого объекта происходит взаимодействиемежду драйвером и пользовательскими программами.После подключения устройства, программа ищет незанятый номер в диапазоне [0;(URC_MAXDEV-1)] (URC_MAXDEV = 127) и присваивает его вновь подключённомуустройству. Все дальнейшие обращения к устройству будут производиться поэтому номеру (номер является индексом элемента в массиве объектов структурописателей).Далее происходит подключение к устройству и считывание его дескрипторов(дескриптор устройства, конфигурации, конечных точек (endpoints)) и проверка ихсоответствия тем, которые должны быть у устройств, для которых написан этотдрайвер. Это вторая проверка, так как ещё при подключении к USB стеку былизаданы VID (Vendor ID) и PID (Product ID) того устройства, подключение которогонужно обрабатывать.Затем создаются потоки чтения и записи (pipes) и выделяется память для буфераданных.
Теперь устройство готово к работе, поэтому создаётся поток (thread) дляобработки команд пользовательского приложения. То есть, кроме основногопотока программы создаётся ещё по одному потоку на каждое подключённоеустройство.3Послевсехэтихдействийданные об устройстве заносятсявобщуюпамять,чтобыпользовательскиеприложениясмогли работать с ним.Общаяпамятьпредставляетсобой массив из URC_MAXDEVэлементов.Каждыйэлементмассива – структура. Поляструктуры составляют:- mutex для распределениядоступакпамятимеждудрайвером и приложениями;- состояние этого слотаподключения;- данные, отправляемые илипринимаемые из устройства;- команда; которую долженвыполнить сервер.Рис.1.1 Внешний вид программы URCSrvПосле отключения устройства происходит удаление всех созданных объектов(mutex, pipes, буфер и т.д.) и отсоединение от устройства.При закрытии программы происходит принудительное отключение от всехподключённых устройств, а также удаление объекта общего доступа к памяти.Все действия драйвера отображаются в окне программы (см.
рис.1.1).43. Библиотека для работы с платой на компьютереБиблиотекапредставляетсобойклассCURC220,которыйупрощаетвзаимодействие между пользовательской программой и драйвером, то есть собъектом общего доступа к памяти, который создаёт драйвер.Библиотека автоматически производит адресацию к общей памяти, после чегочерез оболочку в виде класса CURC220 предоставляет программе доступ к этойпамяти.3.1 Алгоритм работы с библиотекойВся работа с библиотекой происходит через объект класса CURC220. Прототипкласса находится в заголовочном файле “urc220.h”:#include “urc220.h”CURC220 urc;Сначала необходимо определить, устройства с какими номерами подключены ккомпьютеру. Для этого используется функция GetDevStates() класса, котораявозвращает состояние всех слотов для подключения устройств. Перебрав в циклезначения всех ячеек, можно определить номера подключённых плат, так какномера ячеек, значение которых равно URCSTATE_OPENED, являются номерамиподключённых плат.Для начала работы с платой нужно открыть устройство функцией Open(), а поокончании работы вызвать функцию Close().
Если устройство успешно открыто,то записывать и считывать данные можно при помощи функций Read() и Write().Сначала вызывается функция для чтения (Read), далее производятсянеобходимые действия (функции GetInput, SetOutput, GetOutput, GetADC и т.д.), апо окончании всех действий вызывается функция для записи (Write). Затем циклповторяется.3.2 Описание функций класса CURC220Функция GetDevStatesПрототип:int CURC220::GetDevStates(uint32 states[URC_MAXDEV]);Описание:Функция записывает в массив states состояние всех слотов для подключенияустройств. Элементы массива могут принимать следующие значения:- URCSTATE_CLOSED – устройство с номером, соответствующем номеруэлемента массива, не подключено- URCSTATE_OPENED – устройство подключеноПринимаемые параметры:states – массив чисел из URC_MAXDEV элементовВозвращаемое значение:Функция возвращает 0 в случае ошибки5Функция CloseПрототип:void CURC220::Close();Описание:Функция закрывает устройствоПринимаемые параметры: нетВозвращаемое значение: нетФункция OpenПрототип:int CURC220::Open(uint32 index);Описание:Функция открывает устройствоПринимаемые параметры:index - номер устройства (начиная с 0)Возвращаемое значение:Функция возвращает 0 в случае ошибкиФункция ReadПрототип:int CURC220::Read();Описание:Считывает текущее состояние устройстваПринимаемые параметры: нетВозвращаемое значение:Функция возвращает 0 в случае ошибкиФункция WriteПрототип:int CURC220::Write();Описание:Записывает внесенные изменения параметров в устройствоПринимаемые параметры: нетВозвращаемое значение:Функция возвращает 0 в случае ошибкиФункция GetInputПрототип:int CURC220::GetInput(uint32 index, uint8 *value);Описание:Считывает значение на порту вводаПринимаемые параметры:index - номер порта: 0..3value - указатель на число для записи значения: 0 или !0Возвращаемое значение:Функция возвращает 0 в случае ошибкиФункция SetOutputПрототип:int CURC220::SetOutput(uint32 index, uint8 value);6Описание:Записывает значение в порт выводаПринимаемые параметры:index - номер порта: 0..7value - число для записи в порт: 0 или !0Возвращаемое значение:Функция возвращает 0 в случае ошибкиФункция GetOutputПрототип:int CURC220::GetOutput(uint32 index, uint8 *value);Описание:Возвращает значение, которое сейчас установлено на порту выводаПринимаемые параметры:index - номер порта: 0..7value - указатель на число для записи значения: 0 или !0Возвращаемое значение:Функция возвращает 0 в случае ошибкиФункция GetADCПрототип:int CURC220::GetADC(uint32 channel, uint16 *value);Описание:Считывает значение АЦППринимаемые параметры:channel - номер канала: 0..3value - указатель на число для записи значения: 0..1023Возвращаемое значение:Функция возвращает 0 в случае ошибкиФункция SetPWMПрототип:int CURC220::SetPWM(uint32 channel, int16 value);Описание:Устанавливает значение ШИМПринимаемые параметры:channel - номер канала: 0..3value - новое значение ШИМ: -1000...+1000Возвращаемое значение:Функция возвращает 0 в случае ошибкиФункция GetPWMПрототип:int CURC220::GetPWM(uint32 channel, int16 *value);Описание:Возвращает установленое значение ШИМПринимаемые параметры:channel - номер канала: 0..3value - указатель на число для записи значения: -1000...+1000Возвращаемое значение:7Функция возвращает 0 в случае ошибкиФункция GetEncПрототип:int CURC220::GetEnc(uint32 index, int32 *value);Описание:Считывает значение энкодеровПринимаемые параметры:index - номер энкодера: 0..1value - указатель на число для записи значенияВозвращаемое значение:Функция возвращает 0 в случае ошибки84.
Применение библиотеки4.1 Создание проектаСначала загрузите QNX Momentics IDE (“Launch” – “QNX Momentics DevelopmentSuite 6.3.2” – “Integrated Development Environment”).Если вы загружаете эту среду первый раз, то вам будет предложено выбратьпапку для хранения проектов.Если оставить ту, что стоит поумолчанию,тоworkspace(пространстводляхраненияобъектов) будет создано в папке“/user_name/ide4-workspace/”(user_name – имя пользователя).Все вновь создаваемые проектыбудутдобавлятьсявэтотworkspace.После загрузки среды выберетеменю “File” – “New” – “Project”. Впоявившемся окне выберете типпроекта: “C++” – “QNX C++Project” и нажмите на “Next”.Затем введите имя проекта(“ProjectName”),например"test_simple”,атакжевидконечного файла (“Type”) “Application” (приложение).Далее нажмите на “Next”.