Ovo nije planiran sledeći korak u ovom projektu, ali primetio sam da performanse nisu kako bi bilo lepo da jesu. Izgleda da se svodi na to da će na kraju sve morati da se prepiše u C. MicroPython je ipak samo igračka i za neke hobi projekte najbrže rešenje.

Prvo što mi je zasmetalo je pauza od 1ms od trenutka kada MPU generise interrupt do kada ESP počne da se bavi podacima. I ma šta radio nisam uspeo da smanjim na manje od 1ms.

Na kraju ESP32 platforma za MicroPython koristi FreeRTOS task sistem. MicroPython interpreter radi kao jedan FreeRTOS task. Softverski task scheduler se koristi za dodeljivanje CPU vremena različitim procesima u MicroPython okruženju. Prekidi (ISR) rade na niskom nivou. FreeRTOS obezbeđuje preemptivno multitasking okruženje, ali MicroPython ne koristi više taskova. Sve se izvršava unutar jednog task-a koji koristi cooperative scheduling kroz event loop.

Razne ideje sam probao od koriscenja micropython.schedule() kako navodno ima prioritet, pa do uvođenja sleep od 1us u main loop-u. Prebacio nadam se sve dinamicki dodeljene promenljive u statički definisane nizove, onemogućio Garbage collection, ali ipak ne može bez pa ga ručno pozivam u po mom mišljenju optimalnom trenutku.

I na kraju ovo je rezultat i ne čini me posebno ponosnim. AKo neko ima ideju slobodno nek mi piše bio bih mu zahvalan.

pygame_raw_data

  1. interrupt in sa MPU, interapt je na 4 ms, stabilnos je postignuta promenom CONFIG registra na 0x01, što podrazumeva da sample rate za gyro i accel budu jednake i to 1KHz, uključivanjem DLPF na 184 Hz.
  2. vreme od 1 ms koje je tu ma šta radio
  3. obrada prekida sve zajedno sa micropython.schedule (~150 us)
  4. gubitak vremena u main loop-u (~100 us)
  5. proces pakovanja registra sa senzora u packet_buffer koji se šalje na REPL (~270 us)
  6. slanje (~200 us)
  7. Garbage collection (~350 us)