Da haben wir einen verifizierten Flugregler für einen Quadcopter geschrieben. Auf Ada

Einmal, in den Neujahrsferien, als die Faulpelze in unserem Forschungs- und Entwicklungsbüro träge im Internet surften, bemerkten sie ein Video von den Tests eines Robotaxi-Prototyps. Der Kommentator antwortete mit einem enthusiastischen Ton - schließlich eine Revolution. Es ist großartig, ja, aber die Zeit ist jetzt - die Revolution ist da und die IT führt sie an.





Aber das trainierte Ohr hörte etwas anderes im Geräusch von der Teststelle. Der Geschwindigkeitsregler (das Ding, um den Schub der Propeller zu steuern) spielte zu Beginn eine Melodie, wie es Drohnenpiloten gerne tun, die häufig den Betaflight-Flugregler verwenden. Gibt es einen Beta-Flug? Es scheint, dass ja. Nun, oder einige seiner Sorten - es gibt nur etwa ein halbes Dutzend offene Fluglotsen.





Rückblenden liefen vor meinen Augen, irgendwo aus den Tiefen des Unterbewusstseins, vergessene Informationen über die Firmware für Toyota für Millionen von Zeilen C und 2.000 globale Variablen ( Toyota: 81564 Fehler im Code ).





Nachdem der Betaflight-Quellcode auf Github überprüft wurde, wurde er noch schlimmer und je weiter, desto schlimmer . Wir vermuten, dass der selbstgeschriebene Code ungefähr auf dem gleichen Niveau sein wird. Dies bedeutet, dass es keine Garantie und die Fähigkeit gibt, nicht nur den störungsfreien Betrieb des Codes sicherzustellen, sondern seine Arbeit vollständig zu verstehen. Und dies ist das Steuerungsprogramm für ein schweres Gerät mit scharfen Schrauben, das hoch und schnell fliegt. Es wird unheimlich: Spielzeug ist eine Sache, aber ich würde nicht in einem solchen Taxi fliegen wollen.





Aber ist es anders möglich? Sie können, wir haben uns entschieden!





Und sie beschlossen, es zu beweisen. Ein akrobatisches FPV-Quadric auf Basis von STM32F405 wurde bei Avito gekauft, ein Discovery-Board für denselben Controller wurde zum Debuggen gekauft, und dann ist alles wie ein Nebel.





Wie könnte es also anders sein?

Nach einem kurzen Treffen kamen folgende Gedanken auf:





  • Wir brauchen einen anderen Ansatz









  • , .





, - , . , [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 - Plattform zur modularen Analyse von C-Code 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