Saat kami menulis pengontrol penerbangan terverifikasi untuk quadcopter. Di Ada

Suatu kali, pada liburan Tahun Baru, dengan malas menjelajahi Internet, para pekerja keras di kantor R&D * kami melihat video dari pengujian prototipe robotaxi. Komentator menanggapi dengan nada antusias - bagaimanapun juga sebuah revolusi. Ini bagus, ya, tapi waktunya sekarang - revolusi sudah ada, dan TI memimpin mereka.





Tetapi telinga yang terlatih mendengar sesuatu yang lain dalam suara dari lokasi pengujian. Pengontrol kecepatan (hal untuk mengontrol dorongan baling-baling) memainkan melodi di awal, seperti yang biasa dilakukan pilot drone, yang sering menggunakan pengontrol penerbangan Betaflight. Apakah ada penerbangan beta? Sepertinya ya. Ya, atau beberapa variasinya - hanya ada sekitar setengah lusin pengontrol penerbangan terbuka.





Kilas balik berlari di depan mata saya, di suatu tempat dari kedalaman alam bawah sadar, informasi yang terlupakan tentang firmware untuk Toyota selama jutaan ribu baris C dan 2.000 variabel global muncul ( kesalahan Toyota: 81564 dalam kode ).





Setelah meninjau kode sumber Betaflight di github, itu menjadi lebih buruk, dan lebih jauh, semakin buruk . Kami menduga bahwa kode yang ditulis sendiri akan memiliki tingkat yang sama. Ini berarti bahwa tidak ada jaminan dan kemampuan tidak hanya untuk memastikan pengoperasian kode yang bebas masalah, tetapi untuk sepenuhnya memahami pekerjaannya sepenuhnya. Dan ini adalah program kontrol untuk alat berat dengan sekrup tajam yang terbang tinggi, cepat. Semakin menakutkan: mainan adalah satu hal, tetapi saya tidak ingin terbang dengan taksi seperti itu.





Tetapi apakah mungkin sebaliknya? Anda bisa, kami memutuskan!





Dan mereka memutuskan untuk membuktikannya. Sebuah kuadrik FPV akrobatik berdasarkan STM32F405 dibeli di Avito, papan Discovery untuk pengontrol yang sama dibeli untuk debugging, dan kemudian semuanya seperti kabut.





Jadi bagaimana bisa sebaliknya?

Setelah pertemuan singkat, muncul pemikiran berikut:





  • kita membutuhkan pendekatan yang berbeda









  • , .





, - , . , [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 - platform untuk analisis modular kode 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