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

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

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

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

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

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

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

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

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

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

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

     

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

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

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

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

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

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 8 г., 2 мес. назад
    [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 пунктов в 8 г., 2 мес. назад
    [2017-09-20 07:40:16] night_ghost писал(а): На мой вкус любая ОС в полетном контроллере это зло

     

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

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

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

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

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

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

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

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

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

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

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

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

     

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

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

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

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

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

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

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

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

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

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

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

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

    Старые будут работать как раньше, в рамках мультитаска. А новые перед вызовом register_periodic_callback() говорят волшебное слово REVOMINIScheduler::i_know_new_api() и шедулятся на таймерное прерывание. А драйвер МПУ у всех плат один и тот же

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

    Прочитал прекрасное

    Динамическое изменение приоритетов для задач ChibiOS имеет небольшую особенность так там нет дескриптора на задачу, а приоритет можно изменять только той задачи в которой вы в данный момент находитесь

    То есть невозможно из высокоприоритетной задачи, ждущей семафора, захваченного низкоприоритетной задачей, поднять ее приоритет. ПрЭлестно :)

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

    Странно, дескриптор задачи много не занимает. Что мешало его добавить...

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

    Вот и я удивился. В нормальных системах порождение задачи возвращает адрес структуры-описателя задачи, коий и служит дескриптором. Нужен - используй, не нужен игнорируй. Во FreRTOS малость иначе, там для дескриптора надо подставить адрес переменной, но все равно есть - как же  без него задачей рулить и выяснять, "а кто это тут у нас семафор захавал?". 

    Сделал отправку на I2C тоже по DMA, и барометр переписАл. Вроде работает, так что к вечеру будут бинарники.

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

    Что-то непонятное случилось - начали сыпаться HardFault в случайных местах. Раскопки привели что выделение памяти под EKF (AP_NavEKF2.cpp 655) возвращает 0, при том что соответствующий вызов SBRK память выделил. Похоже где-то выход за границы случился...

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

    Печаль, расстрелы памяти сложно отладить

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

    буду откатывать по очереди драйвера на старую версию дабы локализовать, а потом пошагово. Но это требует кучу времени :(

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

    Убрал отправку I2C через DMA - железо камня настолько кривое, что флаг STOP надо устанавливать после окончания передачи последнего байта, то есть после окончания обмена DMA надо в прерывании ждать  флага TXE :-/ А так как мы отправляем всего 1 или 2 байта то смысла в DMA нет никакого.

    Откатил драйвер MPU - ошибки вроде прошли, значит он...

    UPD. Эклипс оказывается  таки умеет ставить брекпоинт по обращению к памяти! Просто интерфейс как все в нем через жо...дницу. Как только научился так сразу поймал злодея, компиляется.

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

    О, отлично.

    Тут скорее stm32 (или даже cortex) умеет аппратный watchpoint ставить. А eclipse и gdb просто его использует.

    А что в итоге получилось? Mpu драйвер новый, а баро и компас как раньше?

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 8 г., 2 мес. назад
    [2017-09-25 12:56:59] m-s писал(а): Тут скорее stm32 (или даже cortex) умеет аппратный watchpoint ставить. А eclipse и gdb просто его использует.

    понятное дело что без аппаратной поддержки такое не делается, например АТмеги даже через JTAG такое не умеют, там и программные брейки ставятся через перепрограммирование страницы. Вот только не удавалось продраться через интерфейс Эклипса чтобы такую точку поставить, и гуглинг не помогал.

    [2017-09-25 12:56:59] m-s писал(а): А что в итоге получилось? Mpu драйвер новый, а баро и компас как раньше?

    Для Рево все новое, для остальных пока компас и барометр как раньше. Но они низкоскоростные и ни на что это не влияет. Драйвер МПУ подойдет для любых плат где МПУ сидит на собственной шине SPI. Если же шина разделяемая то ой, семафор не используется.

    PS. Теперь все работает, собираются бинарники для выгрузки.

    UPD. Вкратце, для чего все это затеяно. Добровольное переключение контекста занимает в ~50 раз меньше времени чем принудительное по таймеру, и происходит тогда когда задача готова к тому, поэтому от потоков было решено отказаться.

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

    Потом была попытка перенести обслуживание МПУ в мультитаск. Однако некоторые вещи в коде Ардупилота происходят слишком долго (ну не растыкивать же yield() там и сям!), отчего внутреннее FIFO МПУшки опять же переполнялось и/или портилось. И в логе периодически проскакивали эти FIFO Reset - что означает что мы теряем кучу важных данных, кои помимо всего еще двойным интегрированием обрабатываться должны.

    Вот чтобы этого избежать данные теперь читаются по прерыванию высокого приоритета и складываются в нормальное FIFO в оперативке, откуда как и раньше вычитываются и обсчитываются в свободное время. Весь код проверки остался, но теперь сброса данных не происходит. В коде обсчета есть вызов захвата семафора, коий принудительно переключает контекст при обсчете каждой порции, так что максимальная ошибка времени delay() сейчас не превышает 0.8мс - то есть меньше обычного кванта времени преемптивного мультитаска.

    Конечно же, в принципе таймерный шедулер работает на частоте 8кГц, и может при некой потере общей производительности работать и на 16кГц, так что МПУ можно читать в таймерном прерывании и без всякого FIFO, или же вычитывать внутреннее FIFO ASAP  и перекладывать в FIFO второго уровня - но хотелось именно красивого решения, как это делается в нормальных системах.

    PPS. И да, раз SPI работает по DMA значит удалось победить косяк, требовавший оптимизации -O0 в некоторых местах, и во всех драйверах включена оптимизация -O2, коя исключает косяки GCC в виде функций из одной команды при -Os

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

    Попробовал последнюю версию на airbot v2 запустить. Горизонт почему-то пляшет и ошибки ahrs. При калибровке компаса внешнего ошибка возникает(это может быть глюк qgroundcontrol)

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 8 г., 2 мес. назад
    [2017-09-26 15:30:38] m-s писал(а): Горизонт почему-то пляшет и ошибки ahrs.

    Надо скринкаст с открытой вкладкой Flight Data / Status, дабы понять - это с гироакселя мусор идет или ЕКФ дурит от единственного датчика. Потому что у меня все шоколадно

     

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

    А логи телеметрии не помогут? Просто компа с МП пока нет, есть телефон с qgc 

     

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

    Не знаю, смотреть надо. Скорее всего да, МП же может воспроизводить логи. У меня бывало что сенсоры стоят, а горизонт крутится как бешеный. Я выкладывал видео на оф. форуме но внятного ответа не было. Иногда помогает переключение на EKF3

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

    Вот логи

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

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

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

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