Как мы верифицированный полетный контроллер для квадрокоптера написали. На Ada

    Однажды на новогодних каникулах, лениво листая интернет, бракоделы в нашем* R&D офисе заметили видео с испытаний прототипа роботакси. Комментатор отзывался восторженным тоном – революция, как-никак. Здорово, да, но время сейчас такое – кругом революции, и ИТ их возглавляет.

    Но тренированное ухо расслышало в шуме с испытательной площадки еще кое-что. Контроллер скорости (штука для управления тягой винтов) сыграл мелодию при старте, как это любят делать пилоты дронов, которые часто используют полётный контроллер Betaflight. Неужели там бета-флайт? Похоже, что да. Ну, или какая-то из ее разновидностей - открытых полетных контроллеров всего около полдюжины.

    Перед глазами побежали флешбеки, где-то из глубин подсознания всплыла забытая уже информация о прошивках для Тойоты на миллионы тысяч строк Си и 2 тысячи глобальных переменных (Toyota: 81564 ошибки в коде).

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

    Но ведь можно иначе? Можно, решили мы!

    И решили это доказать. На Avito был куплен акробатический FPV-“квадрик” на базе STM32F405, для отладки - Discovery-плата для этого же контроллера, а дальше все как в тумане..

    Так как же быть иначе?

    После быстрого совещания возникли вот такие мысли:

    • нам нужен другой подход

    • язык и подход должны друг друга дополнять

    • академический подход не подойдет, нужны практические применения.

    В качестве нового подхода решили, что лучше всего опираться на возможность верификации ПО - до необходимого уровня, без злоупотреблений. Но для языка типа С доступных промышленных зрелых решений не существует, только прототипы [FC] и рекомендации.

    При выборе языка мы поставили себе вот какие требования:

    • это должно быть что-то близкое к embedded

    • Нам нужен хороший богатый runtime с возможностями RTOS, но при этом брать и интегрировать RTOS не хочется

    • Он не должен заметно уступать в производительности тому, что используется сейчас.

    Оказалось, что из практических инструментов в эти требования хорошо подходит один очень старый, незаслуженно забытый инструмент. Да, это Ada. А точнее, его модерновое, регулярно обновляемое ядро SPARK. В [SRM] описаны основные отличия SPARK от Ada, их не так много.

    Что такое SPARK, будет ясно дальше, мы покажем, как именно оно было применено, почему Ада понравилась больше, чем С, как работает прувер, и почему мы при этом ничего не потеряли, а только приобрели. И почему мы не взяли Rust.

    Иной подход

    Иной подход это верификация ПО. Обычно при этих словах люди начинают думать об абстрактных монадах и академических манускриптах, сложно читаемых и плохо применимых на практике. Но оказалось, что не все так плохо.

    Прежде всего, верификация НЕ является гарантией того, что программа не содержит ошибок, а является только проверкой, что программа гарантирует некоторые свойства. А уже дело программиста таким образом обеспечить контроль свойств, чтобы получить нужные результаты.

    В случае с SPARK, верификация базово предоставляет нам гарантии:

    • отсутствия переполнения массивов и переменных

    • отсутствия выхода за границы в типах и диапазонах

    • отсутствия разыменования null-указателей

    • отсутствие выброса исключений.

    • гарантию неприменения инструментов, проверку которых выполнить нельзя.

    • гарантию выполнения всех инвариантов, которые мы опишем. А опишем мы много!

      Круто, да?

    Для описания инвариантов в языке SPARK предусмотрены специальные расширяющие конструкции языка, описывающие контракты процедур, структур данных, и даже циклов. Контрактом можно указать, например, что данная функция не может обращаться к глобальным переменным, или модифицировать глобальное состояние. 

    SPARK также учитывает ограничения на типы, которые описаны в Ada. В случае обычного исполнения ошибка несоответствия типов упадет в Runtime; SPARK же позволяет статически доказать, что ограничения на типы не могут быть нарушены никаким потоком исполнения.

    Например:

    Или другой пример:

    Компилятор и верификатор не дадут создать такой код, который приведет к присвоению значений, нарушающих ограничения и предикаты.

    Отдельный плюс SPARK в том, что система позволяет “натягивать” гарантии на программу поэтапно, то есть программа может быть частично верифицированной. То есть часть модулей можно объявить верифицируемыми, а часть - (пока) нет.

    Сам SPARK делит верификацию на уровни: от "каменного" (Stone level) через "Бронзовый" и "Серебряный" уровни до "Золотого" (Gold) и "Платинового". Каждый из уровней усиливает гарантии:

    Stone

    Мы в принципе знаем, что есть SPARK

    Bronze

    Stone + верификация потоков исполнения и детерминизм/отсутствие неинициализированных переменных

    Silver

    Bronze + доказательное отсутствие runtime-ошибок

    Gold

    Silver + гарантии целостности - не-нарушения инвариантов локальных и глобальных состояний

    Platinum

    Gold + гарантия функциональной целостности

    Мы остановились на уровне Gold, потому что наш квадрокоптер все-таки не Boeing 777 MAX. 

    Как работает верификация в SPARK: прувер собирает описание контрактов и типов, на их основе генерирует правила и ограничения, и далее передает их в солвер (SMT - Z3), который проверяет выполнимость ограничений. Результат решения прувер привязывает к конкретным строкам, в которых возникает невыполнимость.

    Более подробно можно почитать в [SUG]

    Иной язык

    Несмотря на то, что сейчас "рулят" си-подобные ECMA-языки, мы нормально отнеслись к тому, что от этого придется отказаться. Более того, кажется, что чем больше программа, тем больше вредит укорочение ключевых слов и конструкций. Что касается Rust, то он - субъективно - в отношении минимализма издалека сильно напоминает Perl, к сожалению.

    И наоборот, по ощущениям, пространные, многобуквенные конструкции раздражают, когда разум летит вперед, но не мешают, когда во главу угла ставится надежность, понятность, и легкость чтения. В этом смысле Ada (а SPARK это подмножество Ada) вполне хорош. Теперь давайте посмотрим, что же язык Ada может дать embedded-разработчику.

     Профили

    Сам язык и стандартная библиотека позволяет определять и использовать так называемые "профили". Профиль это набор ограничений, выполнение которых контролирует компилятор. Например, можно определить ограничение "нельзя использовать динамическую память". Или "нельзя бросать исключения". Или "не более двух активных потоков". Или "нельзя использовать объекты синхронизации". Все это помогает контролировать целостность состояния программы, и ее валидность.

    Мы используем профиль Ravenscar, специально для embedded-разработки. Он включает пару дюжин ограничений, которые делают вашу разработку для микроконтроллеров более удобной и верифицируемой: нельзя на ходу переназначать приоритеты задач-потоков, переключать обработчики прерываний, сложные объекты из stdlib-ы и такое.

    Вот ограничения профиля Ravescar, для примера

     Runtime

    Когда в embedded необходимо создать более-менее сложное приложение, там всегда заводится RTOS, и ее выбор и интеграция это отдельная песня. В случае с Ada с этим больше нет сложностей - сама Ada включает в себя минимальную исполняемую среду с вытесняющим планировщиком потоков (в Ada это tasks, задачи), с интегрированными в сам язык средствами синхронизации (семафоры, рандеву, называются entries) и даже средствами избегания дедлоков и инверсии приоритетов. Это оказалось очень удобно для квадрокоптера, как станет понятно ниже.

    Для embedded-разработчика доступны на выбор также разные рантаймы:

    • zero-footprint - с минимальными ограничениями и даже без многопоточности; зато минимальная программа не превышает пары килобайт, влезает даже в TO MSP430

    • small footprint - доступна большая часть функций Ada, но и требования побольше, несколько десятков килобайт RAM

    • full ravenscar - доступны все функции в рамках профиля Ravenscar/Extended Ravenscar

    Вот пример описания пустой задачи

    Хочется обратить внимание, что эти задачи - это по сути легковесные green threads, так как под ними нет никаких настоящих потоков не существует. Поэтому мы не страдаем от отсутствия корутин, ведь задачи не тяжелее них, зато встроены в язык.

    Кроме этого, в Ada есть достаточно мощная stdlib для ядра STM32, включая полную реализацию рантайма. Возможно, и для вашей архитектуры она тоже есть.

    Почему не “rustRustRUST”!

    Когда мы говорим, про гарантии в языках программирования, сразу вспоминается Rust и его гарантии относительно указателей. Почему тут не он? Нам кажется, что Spark мощнее.

    Ada не очень любит указатели - там они называются access types, и в большинстве случаев там они не нужны, но если нужны, то - в Spark также есть проверки владения, как в Rust. Если вы аллоцировали объект по указателю, то простое копирование указателя означает передачу владения (которую проконтролирует компилятор/верификатор), а передачу во временное владение (или доступ на чтение) верификатор также понимает и контролирует.

    В общем, концепция владения объектом по указателю, и уровень доступа через этот указатель - есть не только в Rust, и его преимуществами можно пользоваться и в других инструментах, в частности, в Ada/SPARK. Подробно можно почитать в [UPS]

    Вот пример кода с владением

    Почему мы пишем, что в Ada/SPARK не нужны указатели? В отличие от Си, где базовым инструментом является указатель (хочешь ссылку - вот указатель, хочешь адрес в памяти - вот указатель, хочешь массив - вот указатель - ну вы поняли?), в Ada для всего этого есть строгий тип. Если не хватает встроенных операций, их допустимо переопределять (например, реализовать инлайновый автоинкремент), аналогично можно создать placement constructor, используя т.н. limited-типы - типы, которые компилятор запрещает копировать.

    Если уже и этого мало, есть интероп с СИ – то есть код можно компилировать совместно, и слинковать на этапе сборки. Но в этом случае гарантии поведения модуля как черного ящика остаются на разработчике. Для интеропа используются атрибуты - вот так, например, мы оборачиваем функцию на Си в доступ для Ada.

    Для соблюдения нужного layout или битности в коде также не нужны указатели: Ада при необходимости позволяет детально описать, как именно структура будет располагаться в памяти. Минус ошибки на конвертации из логического в физическое представления и обратно - прощайте битовые сдвиги, сложения на кольце, арифметика указателей.

    IDE

    Для работы доступна вполне приятная и удобная IDE, но всегда можно использовать и VSCode с плагинами, и другие текстовые редакторы.

    О производительности и надежности

    Вполне валидным аргументом может быть вопрос с эффективностью ПО. Что касается эффективности, то в интернете доступно свежее исследование [EFF], из которого хочется привести табличку, показывающую, что “старичок» Ada еще огого:

    Если говорить о надежности, то SPARK/Ada известен как один из языков с наименьшим количеством ошибок. В планируемом на 21 запуске кубсатов [LIC] полетное ПО планируется реализовывать на Ada, предыдущий спутник BasiLEO тоже на Ada был единственным среди 12, кому удалось приступить к планируемой миссии.

    А теперь - о самом полетном контроллере

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

    Структурная схема управляющего ПО показана на рисунке

    Как видно из рисунка, ПО состоит из двух частей:

    • Veriflight - собственно, верифицированный полетный контроллер с алгоритмами.

    • Veriflight_board - библиотеки поддержи и адаптации для конкретной платы, которая оказалась у нас в наличии - не верифицированная. Но она и не содержит особой логики, кроме управления устройствами микроконтроллера.

    Так как тратить много времени не хотелось, то драйвер для USB в STM32 был взят прямо нативный и при помощи Interop был слинкован с оберткой на Ada.

    Плата оказалась оснащена минимальным количеством периферийных устройств: 

    • STM32F405 микроконтроллер на 168 МГц (192кб RAM, 1Mб flash)

    • трансивером S.BUS на USART1

    • 6-осевым гиро-акселерометром без магнитного компаса

    • токовыми усилителями PWM

    • USB-интерфейсом, PHY-часть которого реализована на самом микроконтроллере платы.

    Полетный контроллер реализован по простой схеме и «крутит» 2 цикла:

    1. внешний

    2. внутренний

    Внешний цикл это цикл опроса периферии (CMD task на рисунке) в ожидании команд с радиопередатчика. Если команды нет, он передает признаки «сохраняем высоту, держим горизонт». Если команда с пульта есть, передаем ее - целевой угол наклона, целевую мощность на пропеллеры. Частота внешнего цикла 20 Гц.

    Внутренний цикл - цикл опроса гиро-акселерометра и распределения мощности на двигатели. Цикл оборудован 3 PID-регуляторами, и математикой Махони для расчета текущего положения по сигналам с гироскопов. В расчетах внутри используем кватернионы, для генерации управляющего сигнала - углы Эйлера. Частота размыкания внутреннего цикла - 200 Гц. Да, Ада без проблем успевает диспетчеризировать с такой скоростью.

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

    Внутренний цикл реализует опрос PID и стабилизацию аппарата:

    • Считали затребованные пилотом углы

    • Запросили у математики расчетные углы положения

    • Нашли расхождение между желаемыми и настоящими

    • Пересчитали текущее положение на основании сигналов с гиро-акселерометров

    • Зарядили PID-регуляторы на новую коррекцию, если пришли новые затребованные углы

    • Запросили у PID-пакетов текущие импульсы коррекции

    • На основании них, а также запрошенной пилотом мощности на двигатели, сформировали необходимое распределение скоростей вращения на двигателях

    Забавно, что большинство опен-сорсных реализаций Махони (для Arduino и не только) - на Cи и Wiring оказались содержащими разнообразные баги. Это мешало системе заработать. После того, как было выпито пол-ящика лимонада и съедена корзина круассанов, алгоритм воссоздали с нуля по описанию из [MHN], и система тут же заработала.

    Данная схема, как и любая упрощенная модель, испытывает сложности при приближениях параметров к предельным. Здесь это 90 по крену и тангажу - при их превышении для безопасности реализовано отключение двигателей (disarm).

    Кроме этого, управление по углу рыскания выполнено сквозным, а PID там используется только для контроля сильных отклонений между выданным и расчетным углами. Это связано с тем, что пилот по скорости, крену и тангажу ожидает реакцию коптера в виде наклона, пропорционального отклонению стиков, а по рысканию -- в виде скорости вращения, пропорциональной отклонению.

    Но для первого приближения вышло отлично, хотя и совсем не подходит для акробатического квадрокоптера.

    Статья получилась неожиданно длинная, поэтому придется разбить ее на две части.  Мы в первой части постарались познакомить вас с инструментами предков, которые на удивление неплохи: по крайней мере, мы сделали выводы, что дальнейшие проекты для эмбеддед хочется делать на Ada, а не на Си.

    Итог на текущий момент

    Квадрокоптер с прошивкой на Ada/SPARK прошел тесты на подпружиненном стенде и полетах в закрытом помещении, собираются логи, схема стабилизации работает в соответствии с ожиданиями, но в рамках ограничений на углы маневров, как описано выше.

    Мы в R&D продолжаем познавать верификацию ПО и с нетерпением ждем схода снега в Москве, чтобы в следующей статье поделиться результатами испытаний, подгонки и видео тестовых полётов ПО в уличных условиях, которое, кажется, статически проверено на то, что не содержит ошибок. 

    И конечно, на время испытательных полетов все runtime-проверки все равно останутся включены, хотя конечный итоговый результат - проверки не нужны, так как заведомо известно, что они выполняются.

    Для себя мы сделали вывод, что для embedded будем стараться писать только на Ada.

    Если вы также считаете, что современная robotics и automotive это слишком важные вещи, чтобы позволить себе переполнения буфера и разыменование нуля и «ой программисты не написали тесты», пишите, комментируйте, присоединяйтесь: пора сделать ПО надёжнее, потому что оно вокруг нас везде.

    Литература для дальнейшего изучения

    [SUG] SPARK user guide https://docs.adacore.com/spark2014-docs/html/ug/index.html

    [SRM] SPARK reference manual (https://docs.adacore.com/live/wave/spark2014/html/spark2014_rm/index.html)

    [FC] Frama-C - платформа для модульного анализа кода С https://frama-c.com/ 

    [UPS] https://blog.adacore.com/using-pointers-in-spark

    [MHN] https://nitinjsanket.github.io/tutorials/attitudeest/mahony 

    [EFF] https://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf

    [LIC] https://en.wikipedia.org/wiki/Lunar_IceCube

    Комментарии 56

      +4

      Процесс разработки ПО для авиационной техники определен квалификационными требованиями DO-178C или переведенный на русский КТ-178С. Тестирование ПО это лишь вершина айсберга процесса разработки ПО для авиации.

        0
        Да, спасибо, планировал во второй части уточнить. КТ-178С не читал, а вот DO-178C, а точнее, DO-178B, не определяет, а, скорее, рекомендует. Конечно, для квадрокоптера-игрушки рассматривать квалификацию по этим гайдлайнам можно разве что из любви к искусству
          0

          Конечно, это только для такси, для эксплуатации придется получить одобрение авиационных властей.

        0
        Интересно, почему Frama-C отнесли к прототипам, а не зрелым промышленным решениям?
        И рассматривали ли Escher C Verifier?
          +1
          Escher C не рассматривали, наверняка, в нем можно много интересного найти. Но что касается Си, то не хотелось идти путем MISRA и определять для себя «хороший С» и «не очень хороший С» — по ощущениям, такие игры уведут нас в другом направлении. FramaC среди себя обозвали прототипом, потому что это, скорее, конструктор для построения собственного верификатора, а к такому трудовому подвигу готовы не были
            +1
            В статье всё звучит более категорично.
            И MISRA C — это не про «хороший С», его назначение перекликается со SPARK для Аda.
          0
          Да, с ограничением по углам как-то нехорошо получилось.
          Сильный порыв ветра и кирдык.
          Резеревирование 2 из 3 будете добавлять?
            +1
            Есть какие-то сравнительные тесты качества вашего кода и бетафлай? Вы проводили, скажем, статическую проверку их кода, прежде чем начинать работу?
              +1
              Перед нет, а в процессе разработки сравнивали, хотя целесообразность вызывает вопросы. Более детально архитектуру и результаты тестирования планируем во второй части опубликовать
              +8

              «пыльных трудах института системного программирования РАН, которые как будто бы от жизни отстают лет на 30, а то и 50» — это для красного словца, или можете привести хотя бы отдельные примеры (не говоря уж о «при этих словах люди начинают думать»)? Да-да, по теме «верификация ПО». Я наверно знаю про пару пожилых сотрудников (Е.Л.), которые наверное могут что-то совсем олдскульное написать, но вдруг реально проблема и с молодежью, и действительно все плохо, серьезно, просветите.

                –9
                Не очень понятно, с чего вы решили, что приемлема такая снисходительная панибратская риторика в комментариях. Или может быть, вы себя вообразили экзаменатором, а авторов студентами?
                  +11

                  Уверяю, не хотел никого обидеть. Хотя ваше утверждение «пыльных трудах института системного программирования РАН, которые как будто бы от жизни отстают лет на 30, а то и 50» как раз является панибратским и менторским, и, по-моему мнению, действительно может кого-то обидеть.

                    0
                    Спасибо за пояснения. Я постарался ответить ниже картину взглядом инженера обычной прикладной лаборатории
                  +2
                  О, вижу, вы добавили в комментарии. Большая часть материалов и учебных курсов ИСП РАН по верфикации ПО, доступные в паблике, ссылаются на опыт, методы и инструменты от условно 1978-1989 до 2000-2005 года. Затем наступают «темные века», которых найти не удается, и потом в 2017 году снова появляются материалы, наработки, семинары и презентации, но уже коммерческих инициатив либо отсылок к зарубежному опыту
                    +3

                    Видимо, под трудами ИСПРАН вы имели в виду любое творчество, как-то сводимое к сотрудникам ИСПРАН (ну да, есть пожилые сотрудники, у них были относительно олдскульные курсы для младшекурсников, возможно вы наткнулись на курсы Л×××ва, или Л×××вой) — именно это предпредложение я добавил в комментарий (не хотел дробить). Но Труды ИСПРАН это вполне определенный рецензируемый журнал, и если там проходит дичь и древности по верификации, мне это было бы интересно — я смог бы найти рецензентов, ну и повлиять, чтобы никогда. А так, по моим данным, уровень проектов, тем, технологий по верификации там вполне на уровне.

                      0
                      Нет, именно никакой журнал не имеется в виду, тем более такой авторитетный. Как именно применить презентованное там, это другой вопрос
                        +5

                        Презентованное там почти всегда применяется в каких-то проектах и продуктах, институт ведет множество таковых, «чистой науки для души» там практически нет. Есть и проекты для верификации ОСРВ и сертифицированной авионики в частности… но тут я только знаю, что они есть (тут я не очень в теме, а для меня верификация это пока хобби и в основном в части автоматических доказательств).


                        К чему это я — может стоит убрать риторический абзац о «пыльных трудах института системного программирования РАН»? По моему мнению, условных 95% открывших эту статью, прочтут пару первых вводных абзацев с игривым тоном, и не полезут в скучные подробности, не говоря уже о комментариях. Но где-то этот абзац отложится, с меткой «на хабре считают что…». Это же нехорошо.

                          +3
                          Согласен, убрал
                      +6
                      «Затем наступают «темные века», которых найти не удается, и потом в 2017 году снова появляются материалы»

                      — возможно вы зашли на страницу «последних выпусков» (там номера с 2017), но не прошли по ссылке «полный архив» ← там номера с 2000 → и вот так, появилась «хронология Скалигера с темными веками». На всякий случай, для прохожих — это не так, проекты и темы (особенно по верификации), в ИСПРАНе развивались методично и равномерно. Кроме статей, часто получалось, когда я снимал разные доклады, что именно по темам верификации, включая весьма прикладные аспекты, именно ИСПРАНовские ребята попадались чаще всего.

                      0

                      А какие научные группы в РАН занимаются формальной верификацией в смысле всяких коков и прочих агд?

                        0

                        Привет (если меня помните)!


                        Ну вместо названий наверно интересней конкретные фамилии, давайте зацепимся в поиске за http://www.mathnet.ru/php/person.phtml?option_lang=rus&personid=125232 например.
                        (наверно это группа Петренко… но не уверен).


                        Ну и в целом там наверно больше Isabelle, что-то там совместно с микрософтом по Z3.
                        Могу поспрашивать, наверно, если что, как я уже сказал, я в этом не специалист, только сам пытаюсь разобраться…

                          +1
                          Привет (если меня помните)!

                          Увы, не помню :( Подкиньте ключевое слово или воспоминание!


                          В любом случае, спасибо за пример — что-то действительно происходит, и это хорошо.


                          У меня нет цели принизить как-то РАН, просто я сужу по своим впечатлениям от того, какие аффилиации авторов статей, которые мне попадаются на глаза. В США довольно много народу, в Британии есть народ, во Франции, естественно, много по этой теме (такая-то философско-математическая школа!), в Швеции пара человек наберётся, а в РФ — ну только JetBrains Research в голову приходит, на самом деле, и то относительно мало.

                            0

                            Курс по алгоритмам, 6 курс, ФУПМ. Или я ошибся?

                              0

                              Вы не ошиблись! Я просто сначала только по нику пытался вспомнить, а теперь посмотрел, что у вас тут ещё и имя написано, и вспомнил :)


                              С моей стороны давать задачку для будущих поколений на квайны было, конечно, перебором.

                              0
                              ну только JetBrains Research в голову приходит, на самом деле, и то относительно мало.

                              Что-то в тиньков банке даже, судя по курсам, в хуавее русском… не только жетбрейнс.

                        +3

                        Почему не раст — это понятно. Но почему не какой-нибудь кок с экстракцией в C? Если spark опирается на SMT-решатель, то понятно, что его выразительная сила сильно ограничена AMT-разрешимыми теориями.

                          0
                          Даже не думалось над вариантом Coq. А у вас есть варианты почитать что-то про создание ПО для automotive или aerospace на Coq?
                            0

                            Это надо BAE спрашивать (я даже видел пару лет назад какие-то их публикации на тему, но сейчас сходу найти не могу), и вроде у Boeing ещё что-то было.

                            +2

                            а можно слоупокам отдельно разжевать — почему же всё таки не Раст?

                              +5

                              Как я понял из статьи, SPARK позволяет больше инвариантов обеспечить. Например, в Rust нет возможности ограничения и compile-time проверки допустимых значений, compile-time проверки выхода за границы массива итп.

                              +2

                              Да, рядом правильно написали — потому что раст позволяет доказывать меньше вещей про код. Да, доказать что-то про отсутствие гонок (средствами компилятора! без обмазывания сепарационной логикой и вот этим всем!) — это круто и полезно, серьёзно, но это — лишь малая часть того, что можно доказывать на машине про код.

                                0
                                Кажется, я начинаю понимать, почему путаюсь в ваших комментариях :) Для меня, по складу ума императивщика, правильнее говорить не «доказать», а «описать порядок владения данными такой, что гонки отсутствуют». Т.е. доказательство как бы есть, но первичны все-таки действия программиста, а «академики» это немного замыливают.
                            0
                            что в итоге, упало, или нет?
                              +4
                              Еще нет, но разобьем обязательно!
                              +1
                              хочется привести табличку, показывающую, что “старичок» Ada еще огого:
                              Табличка хороша, но в ней слишком много языков, далеких от embedded. Поэтому сравнивать Ada с ними в данном случае некорректно.

                              Впервые встретил список литературы в формате [XXX].
                              Это Ваше изобретение, или новый тренд?
                              В любом случае, хотелось бы услышать про обоснование и преимущества перед классическим [1].
                              Источники в списке литературы, на мой взгляд, лучше расположить по алфавиту, а не по мере их упоминания в тексте. Так их можно быстрее найти.
                                0
                                Хм… тоже впервые вижу, но вроде удобно — семантические короткие названия. Чем-то напоминают семантические имена ссылок в *TeX. Если бы список был на 50-60 ссылок, то сортировка по алфавиту действительно была бы удобнее для поиска.
                                0
                                Я правильно понял из начала статьи, что betaflight это «страх и ужас», а из конца статьи, что после схода снега вы выкатите свою прошивку для полетных контроллеров?)
                                  0
                                  Таких планов не было — стоимость переключения на другую прошивку неподъемная, плюс разные cleanflight, betaflight предлагают значительно больший объем сервиса, которого в прототипе нет и не планируется. Но можно обсудить разработку безопасной прошивки конкретно под вашу плату
                                    0
                                    Нее, спасибо!
                                    Я пока только собираю и изучаю. Просто подумалось, что может что то от россиян в этом деле появится. Свое, так сказать, сермяжное, скрепное. А то детали все китайские, прошивки забугорные, воздух только родимый))
                                      +2
                                      В рамках текущей задачи вроде бы Вы говорите о некой комманде, употребляя «Мы». Расскажите, каким составом и численностью работали над этим? И в какой срок все вышло?
                                        0
                                        Делало 2 человека в свободное время, вышло чуть больше полутора месяцев, в общем часов 150-200, наверное
                                    0
                                    Внешний цикл это цикл опроса периферии (CMD task на рисунке) в ожидании команд с радиопередатчика. Если команды нет, он передает признаки «сохраняем высоту, держим горизонт». Если команда с пульта есть, передаем ее — целевой угол наклона, целевую мощность на пропеллеры. Частота внешнего цикла 20 Гц.
                                    Внутренний цикл — цикл опроса гиро-акселерометра и распределения мощности на двигатели. Цикл оборудован 3 PID-регуляторами, и математикой Махони для расчета текущего положения по сигналам с гироскопов.

                                    Я уверен, что, раз вы смотрели исходники xxxflight'ов, то вы это и без меня знаете, ну да ладно. Насколько мне известно, в xxxflight'ах стабилизация осуществляется по угловой скорости (acro/air режим), а режим удержания горизонта прикручен уже поверх. Возможно, ваше решение лучше для стабилизации в горизонт.


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

                                    Интересно. Я когда-то (лет 6 назад, когда еще был MultiWii) хотел что-то такое сделать, но так и не сделал. На бумаге гладко, но я предполагаю очень большие накопленные ошибки из-за шумов акселерометра и погрешностей определения ориентации. Можете сказать пару слов об этой фиче?

                                      0
                                      Было: 5 обычных прошивок для полетных контроллеров
                                      Мы: Нужно сделать одну нормальную, а не как эти 5 багоделов
                                      Стало: 6 обычных прошивок для полетных контроллеров
                                        +2
                                        А код открыт? Интересно было бы посмотреть.
                                          0
                                          Работа лицензирована по GPL v3, так что код пока посмотреть не получится
                                          +1
                                          Статья бомба! Спасибо!

                                            0
                                            Да, спасибо, но там совсем другая платформа (два процессора), плюс код заброшен — я так понял, это была короткая работа силами студентов, а летает все равно сишная прошивка, плюс в сенсорфьюжне Махони также есть ошибки
                                            –1
                                            В статье приведена ссылка на статью «Toyota: 81564 ошибки в коде». Переходим по ней и читаем её название «Toyota: 81 514 нарушений в коде».

                                            Кто ошибся?
                                              0
                                              Применительно к таблице из [EFF], раз уж мы доказали отсутствие исключений, то можно исключать проверки из кода, и тогда скорость повыше. По такому пути шли в проекте CubeSat, попутно решая другую проблему. Родного транслятора Ады для National Instruments нет, взяли AdaMagic.

                                              Но AdaMagic из коробки для Linux и Windows, а на других надо что-то думать с механизмом исключений, портировать рантайм. Нет исключений — нет рантайма — нет проблем.
                                                0
                                                Теперь вы в списке людей, которых я ненавижу. Вы лично, и все упомянутые в статье коллеги. Мало того, что вы там все пипец умные и пишете полетные контроллеры (а я занимаюсь непонятно чем и пятый год только мечтаю этим заняться), так еще и делаете это на Аде! Я недавно с крайним удивлением на Адакоре увидел чудесные разделы (клянусь, что джва года назад их не было) и запоем прочитал записки «как с С/С++ перейти на Аду». Отметил впрочем, что на плюсах все то же самое (и даже больше) можно сделать даже проще (но не очень), а еще чот кода готового маловато на Аде, и вербозно как-то (хотя я любитель длинных имен), и задрачивать новый язык все же придется сильно, и вообще слезы_боль_я_никто, в общем прочитал — и ничего на Аде писать не стал, даже никакой крохотной фитюлечки.

                                                Тут еще xrEon понимаете ли накинул, оказывается проектов на Аде больше, чем три с половиной! ЧСХ писать на Аде под писюк наверное станет только псих (когда есть элитный шарп), а вот в эмбеде оно и правда хорошо.

                                                К слову, раз тут знатоки собрались, переспрошу кое-что, что я не понял — есть аспект, с помощью которого можно задать минимальный размер типа в битах, но как задать точный размер?
                                                  0
                                                  ЧСХ писать на Аде под писюк наверное станет только псих (когда есть элитный шарп)


                                                  Помню, Delphi сначала начали делать под .NET. Настоящее унижение, что моё любимое число 8, в долгожданной версии Delphi 8 стало проклятьем, эта Delphi ничего другого не умела. Потом какая-то муха покусала многих разработчиков, они к мёду нативных программ начали подмешивать дёготь дотнета. И МатКАД, и АвтоКАД, и не обошла беда стороной RAD Studio. Подсказки кода почему-то надо было сделать в дотнетовской части. К счастью, нашлись народные умельцы. В Delphi 10 Lite вырезано всё, что связано с дотнетом.

                                                  Вот так нативной частью программы, без трассирующей сборки мусора, народ с удовольствием пользуется, а дотнетовскую дрянь отпилит первый же риппер. А какую часть хотите писать вы?
                                                    0
                                                    Признаться, я не понял, к чему вы клоните, я просто исхожу из того, что на шарпе писать хорошо, очень хорошо. Если вам нравится на Дельфи — не проблема. Но уж точно вряд ли есть достаточный объем платформы для Ады под ПиСи.
                                                      0
                                                      на шарпе писать хорошо, очень хорошо

                                                      Я говорю про Служение Пользователю, а не самоудовлетворение разработчика.

                                                      И Ада ещё больше, чем Delphi, про Служение Пользователю.

                                                      достаточный объем платформы для Ады под ПиСи


                                                      Не понял. Чего не хватает. Вот есть задачи, которые надо решать. На шарпе будет дико тормозить, особенно, на офисных компах старинных, закупленных сотнями, в которые ещё принудительно антивирус воткнут. На плюсах будет дико глючить. На Аде и Делфи будет работать хорошо.
                                                        0
                                                        Ну если речь про Служение, то тут наверное можно только согласиться.
                                                          0
                                                          Вот бы ещё Пользователям объяснить, что адаисты им Служить хотят, чтоб со стороны Пользователей осознанное финансовое давление шло.

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                Самое читаемое