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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    О, отлично.

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

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

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 6 г., 7 мес. назад
    [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 пунктов в 6 г., 7 мес. назад

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

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

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

     

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

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

     

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

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

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

    Вот логи

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

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

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

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