Ардупилот на платах OpenPilot Revolution / RevoMini (записей: 1756)

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад

    там такое дело было: планировщик выбирает готовые к выполнению задачи просто по кольцу, без каких-либо приоритетов. А некоторые задачи всегда готовы - запускаются, проверяют что им нечего делать и завершаются, и так на каждом проходе цикла. В результате бесполезно жрут время. Сейчас сделал что задача не получит время если выполнялась меньше определенного времени назад, в зависимости от приоритета. Вроде бы помогло, но остались некие странности. Например, ошибка вызова драйвера МПУ колеблется в пределах единиц микросекунд, то есть все ОК. А вот ошибка вызова драйвера барометра достигает аж ~10 милли(!)секунд, и откуда это берется я пока не могу поймать

  • Аватар профиля m--s s s6 пунктов в 6 г., 7 мес. назад

    Может быть какой-то процесс слишком долго выполняется?

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад

    Цикл - 400гц, то есть раз в 2.5мс основной процесс вызывает delay_us(100) во время которого собственно и выполняются драйверы. И, повторюсь, вызываемый 1000 раз в секунду драйвер МПУ ошибки планирования практически не имеет. Чем отличается от него драйвер компаса, вызываемый всего лишь 100 раз в секунду и имеющий тот же приоритет, и как при времени цикла 2.5мс он умудряется получить ошибку планирования аж 4 времени цикла - я пока не понимаю.

    Доделал пепяку - назначаемый драйверу шины обработчик завершеиния обмена DMA. Теперь можно начать обмен как и раньше, в  прерываниии, но не ждать все время обмена, а запланировать обработчик завершения и выйти, а уже прерыванием завершения обсчитать полученные данные. Вот только это чтобы использовать это требуется переписАть все драйверы устройств...

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад

    Переписал для пробы драйвер MPU под обработчик прерывания завершения обмена и отладил.  Работает - аж самому понравилось!  Немного тестов и будут результаты и бинарники.

  • Аватар профиля m--s s s6 пунктов в 6 г., 7 мес. назад
    [2017-09-19 12:51:19] night_ghost писал(а): Переписал для пробы драйвер MPU под обработчик прерывания завершения обмена и отладил.  Работает - аж самому понравилось!  Немного тестов и будут результаты и бинарники.

     

    Главное, чтобы самому нравилось)

    Наверное, для mpu это наиболее важно, остальные сенсоры так часто не читаются.

    А проблему с планированием потока компаса не удалось победить? Она на что-то вообще влияет?

    Ждем летабельную версию)

    Увидел недавно, что кто-то портирует ardupilot под chibios. https://github.com/bugobliterator/ardupilot-chibios . Пока там все в зачаточном состоянии, но есть шанс что допилят.

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад
    [2017-09-20 07:24:08] m-s писал(а): для mpu это наиболее важно

    совершенно верно, более того это устраняет проблему глючного FIFO, которое теряет байты когда хочет и приходится его периодически сбрасывать, теряя ценную инфу с гироскопа. Сейчас же данные читаются по прерыванию готовности через DMA, и по прерыванию завершения обмена DMA обновляется указатель. А обсчитываются уже в рамках многозадачности, не портя временем расчета время цикла. 

    [2017-09-20 07:24:08] m-s писал(а): А проблему с планированием потока компаса не удалось победить?

    Удалось, сейчас ошибка планирования не превышает половины миллисекунды - то есть в пределах обычного таймслайса многопоточной ОС

    [2017-09-20 07:24:08] m-s писал(а): кто-то портирует ardupilot под chibios

    На мой вкус любая ОС в полетном контроллере это зло

  • Аватар профиля m--s s s6 пунктов в 6 г., 7 мес. назад
    [2017-09-20 07:40:16] night_ghost писал(а): На мой вкус любая ОС в полетном контроллере это зло

     

    Согласен. Это не OC в обычном понимании, скорее hal и планировщик.

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад
    [2017-09-20 08:48:37] m-s писал(а): Это не OC в обычном понимании, скорее hal и планировщик.

    Я знаком с ней :) Это вроде неплохой HAL и не очень хороший планировщик. Однако: во-первых, ОЧЕНЬ много системных вызовов делается с запрещенными прерываниями - я же запрещаю прерывания не дольше чем на пару команд. Во-вторых, нет POSIX-совместимости а работа с ФС делается через ту же самую FatFS от ChaN. И в третих, простая вытесняющая многозадачность без приоритетов по round-robin, что никак не годится в данном случае. Конечно, я последний раз ее юзал в 13 году и многое могло поменяться, но впечатление убогости осталось.

    Для полетного контроллера, где все выделение памяти делается при инициализации (не нужен сложный распределитель памяти), устройства раз и навсегда закреплены за драйверами (не нужны сложные механизмы синхронизации) и сливают данные в общий "котел" AHRS (не нужны сложные мутексы и прочее), лучше вообще обойтись без ненужных сущностей в виде ОС, шелла и прочего, и сохранить возможность понимать что, как и когда происходит.

    Именно поэтому я и считаю что 3 слоя оптимальны - прерывания для получения данных, основной цикл для их обработки и все остальное, работающее когда другим нечего делать. Все что требуется - это не ожидать ничего в прерывании, что сейчас и удалось добиться.

    UPD. Глянул я в тот порт... лучше промолчу.

  • Аватар профиля m--s s s6 пунктов в 6 г., 7 мес. назад

    Ясно, исчерпывающее объяснение. 

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад

    Кстати, ни одна ОС не обеспечивает возможности  назначить в качестве обработчика прерывания метод класса без дополнительных телодвижений. А эта возможность позволяет очень удобно работать с прерываниями из C++ классов без обычных мучений. Я коммит сделал, можно посмотреть код AP_InertialSensor_Revo.cpp как это все получилось.

    UPD. Хоть все ОС это и позволяют, ни один ХАЛ при ожидании семафора не поднимает приоритет процессу, владеющему семафором, а просто тупо ждет. Мню тут отчитали на неких форумах что мол я слишком много ругаю код из апстрима - это вот очень наглядный пример почему его нельзя не ругать :)

  • Аватар профиля m--s s s6 пунктов в 6 г., 7 мес. назад
    [2017-09-20 09:50:07] night_ghost писал(а):Я коммит сделал, можно посмотреть код AP_InertialSensor_Revo.cpp как это все получилось.

     

    Ага, посмотрел. Все как и описано: начинаем читать по прерывание drdy, читаем через dma, потом неспеша обрабатываем.

    Ну а майнстрим ... Там у людей меньше embedded опыта и другие интересы.

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад

    Запилил то же самое для компаса, попутно решив проблему потери семафора шины при возврате из таймерного обработчика. Заработало сразу же, без отладки.

    Завтра верну запуск обмена в таймерное прерывание, запилю барометр - и можно будет собирать бинарники. 

  • Аватар профиля m--s s s6 пунктов в 6 г., 7 мес. назад

    Компасс и барометр от ревомини или все поддерживаемые?

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад

    пока только от ревомини, чтобы получить летабельную версию.

  • Аватар профиля m--s s s6 пунктов в 6 г., 7 мес. назад

    Т.е. на других платах можно даже не пробовать? Или старые драйвера работать будут?

← Форум группы   Все форумы К последней записи
Постов на странице:

Вы автоматически вступите в эту группу, когда ответите в теме.

Добавить ответ:

-
Рейтинг@Mail.ru