[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