КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Лекция 5. Опишем простой пример для демонстрации общих принцпов построения программ с использованием API для С nxtOSEK
Иерархия классов Пример Опишем простой пример для демонстрации общих принцпов построения программ с использованием API для С nxtOSEK. Текст примера предоставил студент математико- механического факультета Михаил Липкович. В этом примере реализована управляющая программа для робота, движущегося вдоль стенки. Прежде всего рассмотрим файл описания OSEK Implementation Language (OIL). Подробную справку по синтаксису OIL-файла можно найти на сайте концерна VXD/OSEK. /* wall_osek.oil*/#include "implementation.oil" CPU ATMEL_AT91SAM7S256{ OS LEJOS_OSEK { STATUS = EXTENDED; STARTUPHOOK = FALSE; ERRORHOOK = FALSE; SHUTDOWNHOOK = FALSE; PRETASKHOOK = FALSE; POSTTASKHOOK = FALSE; USEGETSERVICEID = FALSE; USEPARAMETERACCESS = FALSE; USERESSCHEDULER = FALSE; }; APPMODE appmode1{}; TASK Motion //определение свойств задачи Motion { AUTOSTART = FALSE; //не запускаться самой при запуске //программыPRIORITY = 2; //приоритет. чем больше число, тем //выше приоритетACTIVATION = 1; //максимально число одновременно //работающих задач MotionSCHEDULE = FULL; //возможность вытеснять эту задачу //задачами более высокого приоритета STACKSIZE = 512; //размер стека }; ALARM cyclic_alarm1 //определение будильника (генератора //событий запуска задачи) { COUNTER = SysTimerCnt; //счетчик SysTimerCnt ACTION = ACTIVATETASK //при запуске будильника вызвать //задачу Motion { TASK = Motion; }; AUTOSTART = TRUE //автоазапуск будильника { ALARMTIME = 1; //время запуска будильника впервый //раз CYCLETIME = 50; //период последующих запусков APPMODE = appmode1; }; }; COUNTER SysTimerCnt //определение счетчика { MINCYCLE = 1; //минимально возможное число тиков //счетчика для использования //будильником MAXALLOWEDVALUE = 10000; //максимально//возможноезначение счетчика TICKSPERBASE = 1; //размер тика (в миллисекундах) };};Сам текст программы находится в файле wall_osek.c. Точкой входа этой программы (места с которого начинается выполнение программы) является задача task(Motion), как следует из файла wall_osek.oil, эта задача вызывается раз в 50 миллисекунд. Не следует забывать, что необходимо реализовать еще три процедуры ecrobot_device_initialize, ecrobot_device_terminate,user_1ms_isr_type2, которые формально нигде не используются, но система вызывает их автоматически. Конечно, текст самой задачи, реализующей логику работы регулятора, существенно меньше описания технической части программы. С одной стороны, это делает даже маленькую по содержанию программу объемной, но с другой, дает пространство для тонкой настройки параметров. Эта настройка, по сути, шаблонная и ее легко скопировать из другой задачи. 7.10. nxtOSEK C++ Более удобный программный интерфейс реализован для C++. Каждый датчик и мотор является экземпляром соответствующего класса, а это перекладывает работу по инициализации и завершения работы переферийных устройств на конструкторы и деструкторы соответствующих классов, инкапсуирует методы, деля синтаксии интуитивно понятным. Хоть необходимость использования процедур ecrobot_device_initialize, ecrobot_device_terminate пропадает, тем не менее, для того что бы согласовать обектно ориентированный подход с функционалом ОС РВ nxtOSEK и предоставлять классам взаимодействие с процедурами обработки прерываний, все же необходимо использовать процедуру user_1ms_isr_type2 и описать событие ОС РВ. Как правило, в процедуре user_1ms_isr_type2 достаточно вызывать одну функцию SleeperMonitor() которая необходима для корректной работы класса Clock и корректного взаимодействия с устройвами через I2C интерфейс. Так же необходимо указать в описании основной задачи в OIL файле события EventSleepI2C и EventSleep. Это может выглядеть, например, так: //событие EventSleepI2CEVENT EventSleepI2C{ MASK = AUTO;};//событие EventSleepIEVENT EventSleep{ MASK = AUTO;};//описание основной задачи с названием, например, TaskMainTASK TaskMain{ AUTOSTART = TRUE { APPMODE = appmode1; }; PRIORITY = 1; ACTIVATION = 1; SCHEDULE = FULL; STACKSIZE = 512; EVENT = EventSleepI2C; //добавили событие EventSleepI2C EVENT = EventSleep; //добавили событие EventSleepI2C};Надо помнить, что так как объектам 18ти классов (датчикам, соединениям, моторам) требуется инициализация и корректное завершение работы, их необходимо определять как глобальные объекты. В противном случае на дисплее появится сообщение об ошибке и для корректной работы устройство надо будет перезапустить. Глобальными должны быть экземпляры следующих классов:AccelSensor, Bluetooth, Camera, ColorSensor, CompassSensor, SonarSensor, IrSeeker, LegoLight, Motor, NxtColorSensor, PSPNx, Rs485, GyroSensor, LightSensor, RcxLightSensor, SoundSensor, TouchSensor. В этом параграфе приведен список классов в алавитном порядке с учетом наследования. Многие методы классов созвучны функциям С интерфейса, поэтому подробно их описывать здесь не будем. Все классы находятся в пространстве имен (namespace) "ecrobot", что бы использовать классы без приставки ecrobot::необходимо указасть в начале программы using namespace ecrobot. Так же, что бы генерировался корректный машинный код, необходимо сделать указание компановщику (linker) компановать программу в стиле С, т.е. код программы должен быть заключен между extern "C"{ …код программы… }(см. пример в начале главы). · ecrobot::AccelSensor Клаcс работы с датчиком ускорения HiTechnic. · ecrobot::Bluetooth Класс работы с Bluetooth. · ecrobot::BTConnection Устанавливает соединение через Bluetooth. · ecrobot::Camera Класс работы с камерой NXTCamv2. · ecrobot::Clock Класс работы с системными часами. · ecrobot::ColorSensor Класс работы с датчиком цвета NXT. · ecrobot::CompassSensor Класс работы с компасом HiTechnic · ecrobot::Daq Класс для отправки внутренних данных NXT программе NXT GamePad. · ecrobot::GamePad Класс для дистанционного управления с помощью джойстика GamePad. · ecrobot::I2c · ecrobot::SonarSensor Класс работы с ультразвуковым датчиком. · ecrobot::IrSeeker Класс работы с инфракрасным датчиком. · ecrobot::Lcd Класс работы с дисплеем устройства NXT. · ecrobot::LegoLight Класс работы с датчиком освещенности NXT. · ecrobot::Motor Класс работы с серводвигателями NXT. · ecrobot::Nxt Класс работы с внутренними функциями устройства NXT (работа с кнопками, получение уровня заряда батареи). · ecrobot::NxtColorSensor Класс работы с датчиком цвета NXT. · ecrobot::PSPNx Класс работы с портом расширения для Sony Play Station. · ecrobot::Camera::Rectangle_T Вспомогательный класс для работы с камерой NXTCamv2. · ecrobot::Rs485 Класс работы с интрфейсом RS485. · ecrobot::Sensor · ecrobot::GyroSensor Класс работы с гироскопом. · ecrobot::LightSensor Класс работы с датчиком освещенности. · ecrobot::RcxLightSensor Класс работы с датчиком освещенности RCX. · ecrobot::SoundSensor Класс работы со звуковым датчиком. · ecrobot::TouchSensor Класс работы с датчиком касания. · ecrobot::Speaker Класс работы с воспроизведением звука. · ecrobot::Usb Класс работы с USB. · ecrobot::VectorT < T > Класс, реализующий вектор из двух компонент.
Дата добавления: 2014-11-26; Просмотров: 448; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |