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 ...
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
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
(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
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ć
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#
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
▪ Powód: odwrotnie zamontowany magnetorquer (fancy magnes) ▪ Rozwiązanie: korekcja (mnożenie przez -1) w oprogramowaniu ▪ Wniosek: trzeba być przygotowanym na proste poprawki
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
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