Como escrevemos um controlador de vôo verificado para um quadricóptero. Em Ada

Certa vez, no feriado de Ano Novo, navegando preguiçosamente na Internet, os bagunceiros em nosso * escritório de P&D notaram um vídeo dos testes de um protótipo de robotaxi. O comentarista respondeu com um tom entusiasmado - uma revolução, afinal. É ótimo, sim, mas a hora é agora - a revolução está aí e a TI está liderando.





Mas o ouvido treinado ouviu algo mais no barulho do local do teste. O controlador de velocidade (a única coisa que controla o impulso das hélices) tocou uma melodia no início, como os pilotos de drones gostam de fazer, que costumam usar o controlador de vôo Betaflight. Existe um voo beta? Parece que sim. Bem, ou algumas de suas variedades - há apenas cerca de meia dúzia de controladores de vôo abertos.





Flashbacks correram diante dos meus olhos, em algum lugar das profundezas do subconsciente, informações esquecidas sobre o firmware da Toyota para milhões de milhares de linhas de C e 2.000 variáveis ​​globais surgiram ( Toyota: 81564 erros no código ).





Depois de revisar o código-fonte do Betaflight no github, ficou ainda pior e, quanto mais longe, pior . Suspeitamos que o código escrito por ele mesmo terá aproximadamente o mesmo nível. Isso significa que não há garantia e a capacidade não apenas de assegurar o funcionamento do código sem problemas, mas de compreender completamente seu trabalho. E este é o programa de controle para um dispositivo pesado com parafusos afiados que voa alto, rápido. Está ficando assustador: brinquedos são uma coisa, mas eu não gostaria de voar em um táxi assim.





Mas é possível de outra forma? Você pode, decidimos!





E eles decidiram provar isso. Uma quadrícula FPV acrobática baseada no STM32F405 foi comprada na Avito, uma placa Discovery para o mesmo controlador foi comprada para depuração e então tudo é como uma névoa.





Então, como poderia ser diferente?

Após uma rápida reunião, surgiram os seguintes pensamentos:





  • precisamos de uma abordagem diferente









  • , .





, - , . , [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, - Boing 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 :













(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 - plataforma para análise modular de código 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








All Articles