Upgrade to Pro — share decks privately, control downloads, hide ads and more …

.NETowiec w Kosmosie

.NETowiec w Kosmosie

W październiku 2015 roku dostałem maila "Komputer pokładowy" z propozycją uczestnictwa projekcie PW-Sat2. Od tego czasu łączę świat "nudnych bizesowych .NETowych aplikacji webowych " ze światem ...

Avatar for Maciej T. Nowak

Maciej T. Nowak

April 03, 2017

Other Decks in Programming

Transcript

  1. ▪ Drugi polski satelita studencki ▪ CubeSat 2U ▪ Studenci

    Politechniki Warszawskiej • Mechanika • Elektronika • Eksperymenty ▪ Future Processing • Oprogramowanie komputera pokładowego
  2. ▪ Podstawowa misja: • przetestowanie żagla deorbitacyjnego ▪ Cele drugorzędne

    • Test algorytmu kontroli orientacji • Test mechanizmu otwierania paneli słonecznych • Pomiar przyjętego promieniowania • Test czujnika Słońca • Zrobienie zdjęcia ▪ Start: grudzień 2017
  3. ▪ Nanosatelity wynoszone na orbitę przy okazji innych misji ▪

    1U = 10cm x 10cm x 10cm, ok. 1.3kg ▪ 2U = 10cm x 10cm x 20cm, ok. 2.5kg ▪ Powszechnie dostępne elementy elektroniczne ▪ Wykorzystywane do przeprowadzania eksperymentów ▪ Koncepcyjnie przypominają „duże” satelity ale są tańsze
  4. Żagiel deorbitacyjny Kamery Payload Bus Układ zasilania (EPS) Komunikacja (COMM)

    Kontrola orientacji (ADCS) Komputer pokładowy (OBC) Czujnik słońca Panele słoneczne
  5. Żagiel deorbitacyjny Kamery Payload Bus Panele słoneczne Układ zasilania (EPS)

    Komunikacja (COMM) Kontrola orientacji (ADCS) Komputer pokładowy (OBC) Czujnik słońca
  6. Laptop ▪ 4 rdzenie, 64-bit, 2.8GHz ▪ 16GB RAM ▪

    512GB SSD + 1TB HDD ▪ Komunikacja: USB, TCP OBC ▪ ARM Cortex-M3, 48MHz ▪ Brak FPU ▪ 1MB SRAM ▪ 1MB pamięci programu ▪ 16MB pamięci trwałej ▪ Komunikacja: I2C, SPI, UART
  7. ▪ Nie promieniowanie a cząstki ▪ LHC –> 6.6 x

    1012 eV ▪ Promieniowanie kosmiczne –> 1020 eV ▪ Single Event Transient (0 -> 1 -> 0) ▪ Single Event Upset (0 -> 1) ▪ Single Event Latch-up (zwarcie) ▪ Rozwiązania • Prostsza elektronika • Redundancja (failover, TMR)
  8. Pamięć 1 Pamięć 2 Pamięć 3 Redundancja 1 1 1

    1 Pamięć 1 Pamięć 2 Pamięć 3 1 1 1 0 Redundancja
  9. ▪ C++14 ▪ GCC arm-none-eabi 5.4 ▪ CMake + make

    ▪ GoogleTest ▪ RapidCheck ▪ Testy integracyjne – Python 2.7 ▪ EFM32GG-STK3700 ▪ DeviceMock – mockowanie urządzeń I2C
  10. ▪ Jenkins + pipeline ▪ Proces budowania: • Kompilacja •

    Testy jednostkowe • Testy integracyjne (hardware in the loop) • Raport zużycia pamięci • Dokumentacja • Pokrycie kodu testami jednostkowymi
  11. ▪ Nie da się uruchomić kodu ARM na x86 ▪

    Wykorzystanie dwóch kompilatorów jest ryzykowne ▪ Uruchamianie na sprzęcie byłoby powolne ▪ QEmu pozwala na emulowanie wielu architektur (w tym Cortex M3) ▪ Rozbudowaliśmy QEmu o wsparcie dla EFM32GG
  12. ▪ Nie ma „klasycznego” systemu operacyjnego ▪ Stosuje się RTOS

    (Real-Time Operating System), np. FreeRTOS • Łączony z docelowym programem jak biblioteka (5 plików) • Wielowątkowość z wywłaszczeniem • Podstawowe mechanizmy synchronizacyjne (kolejka, semafor) ▪ Konieczna jest ręczna kontrola ilości pamięci zużywanej przez wątki
  13. ▪ Statyczna alokacja pamięci (stos, struktura) • Zmienne globalne umieszczane

    są w pamięci w czasie linkowania • Zmienne lokalne na stosie wykonania • Zawsze się powiedzie… • … ale można „przejechać” obszar przewidziany na stos ▪ Dynamiczna alokacja pamięci (sterta, klasa) • malloc()/free() i new/delete • Wycieki pamięci • Może się nie udać
  14. OBC::OBC() : timeProvider(fs), Hardware(PowerControlInterface, timeProvider), Communication(Hardware.I2C.Buses.Bus, fs), Storage(Hardware.SPI, fs, Hardware.Pins),

    Experiments(fs), terminal(IO) { } public OBC() { timeProvider = new TimeProvider(fs); Hardware = new OBCHardware(PowerControlInterface, timeProvider); Communication = new OBCCommunication(Hardware.I2C.Buses.Bus, fs), Storage = new OBCStorage(Hardware.SPI, fs, Hardware.Pins); Experiments = new OBCExperiments(fs); terminal = new Terminal(IO); } C++ C#
  15. OBC::OBC() : timeProvider(fs), Hardware(PowerControlInterface, timeProvider), Communication(Hardware.I2C.Buses.Bus, fs), Storage(Hardware.SPI, fs, Hardware.Pins),

    Experiments(fs), terminal(IO) { } OBCHardware::OBCHardware(PowerControl& powerControl, TimeAction& burtcTickHandler) : I2C(powerControl), Burtc(burtcTickHandler) { } OBCCommunication::OBCCommunication(II2CBus& systemBus, services::fs::IFileSystem& fs) : UplinkProtocolDecoder(settings::CommSecurityCode), SupportedTelecommands(fs), TelecommandHandler(UplinkProtocolDecoder, SupportedTelecommands.AllTelecommands()), CommDriver(systemBus, TelecommandHandler) { }
  16. ▪ Ile czasu minęło od początku tej prezentacji? ▪ Potrzeba:

    ile czasu minęło od początku misji? ▪ Problemy: • Restart OBC • Brak zasilania przez jakiś czas • Przekłamanie bitu (SEU)
  17. ▪ Sumowanie okresów czasu • Wbudowany zegar mikrokontrolera • Zewnętrzny

    zegar RTC z podtrzymaniem czasu (3,5h) • Korekta w oparciu o oba pomiary ▪ Zapis do pamięci trwałej aby nie utracić wartości w przypadku restartu OBC ▪ W przypadku dłuższego braku zasilania – trudno
  18. Mój dom ▪ 30Mb/s ▪ Dostęp cały czas ▪ Wysokopoziomowe

    protokoły (TCP, HTTP, REST) PW-Sat2 ▪ Uplink 1200 bps ▪ Downlink 9600 bps ▪ 5 minut dziennie ▪ Telekomendy ▪ Nieskorelowane odpowiedzi
  19. ▪ W 1991 satelita ERS-1 nie utrzymywał orientacji na orbicie

    ▪ Powód: odwrotnie zamontowany magnetorquer (fancy magnes) ▪ Rozwiązanie: korekcja (mnożenie przez -1) w oprogramowaniu ▪ Wniosek: trzeba być przygotowanym na proste poprawki
  20. ▪ Moduł ADCS – gotowy produkt dostępny na rynku ▪

    Jedna z funkcjonalności: pomiar pola magnetycznego ▪ Sposób użycia: Polecenie (rozpocznij pomiar) + Polecenie (zwróć wartość) ▪ Problem: zbyt szybkie zapytanie o wartość, powoduje anulowanie pomiaru ▪ Rozwiązanie: Sleep
  21. ▪ Problem: dwie funkcje przypisane do jednego pinu procesora ▪

    Rozwiązanie: Weryfikacja konfiguracji pinów w czasie kompilacji: gpio::VerifyPinsUniqueness< io_map::SPI, io_map::LEUART, io_map::I2C_0, io_map::I2C_1>;
  22. ▪ Nanosatelita, 20cm x 15cm x 10cm, 3kg ▪ Wystrzelony

    w 2008 ▪ Zbudowany przez Tokyo Institute of Technology ▪ Oparty na PDA z Windows CE.NET ▪ Komunikacja z podzespołami przez USB
  23. ▪ Satelita Hipparcos (1989 – 1993) ▪ Wymagał okresowej aktualizacji

    danych ▪ Błąd w danych 10e-6 zamiast 10E-6 • Oprogramowanie zignorowało błędny fragment (e-6) ▪ Efekt: wygenerowany moment obrotowy milion razy za duży