Головний цикл простояв пів секунди
Що пише ArduPilot:
- Internal errors 0x8000 (main_loop_stuck)
Головний цикл читає датчики й керує моторами сотні разів на секунду. Окремий наглядач кожні 100 мс дивиться, чи він ще працює. Після 200 мс без нього наглядач починає писати в лог, що робив цикл (повідомлення MON); після 500 мс, якщо ArduPilot не очікував затримки (стирання флеш-пам'яті, калібрування), він фіксує main_loop_stuck. Число l: тоді — рядок коду, де головний цикл чекав на блокування. Якщо цикл так і стоїть, сторожовий таймер перезапускає плату.
Що робити: найімовірніше спершу
Lua-скрипти працюють із підвищеним пріоритетом і не пускають головний цикл до процесора.
Перевірте
SCR_THD_PRIORITYне 0. Зупиніть скрипти й подивіться, чи помилка з'являється далі.ВиправтеПоверніть
SCR_THD_PRIORITYна 0 (Normal) і перезавантажте.Дві частини прошивки чекають одна на одну (взаємне блокування): помилка, імовірніша в бета- чи власній збірці.
ПеревіртеРазом із нею може з'явитися «CRITICAL Deadlock …». Занотуйте число l: і що ви робили: завантаження параметрів, завантаження логів, калібрування.
ВиправтеВикористовуйте стабільний реліз і надішліть розробникам ArduPilot рядок, лог і послідовність дій.
Датчик або сховище відповідає так повільно, що цикл на нього чекає.
ПеревіртеУ тій самій масці є spi_fail чи i2c_isr, або помилка зникає, коли від'єднати пристрій.
ВиправтеЗамініть цей пристрій або його кабель.
Пів секунди без керування досить, щоб втратити коптер. Не літайте, доки на столі, знявши пропелери, не відпрацюєте цілу батарею без цієї помилки.
Параметри, на які варто глянути
| Параметр | Що це |
|---|---|
SCR_THD_PRIORITY | Scripting thread priority |
BRD_OPTIONS | Board options |
Де це зробити:Налаштування й тюнінгКаталог Lua-аплетів