Miski do mleka

Masajowie uważają, iż mycie wodą naczyń do mleka daje mleku przykry zapach; dlatego myją te naczynia w krowim moczu. Za Kopalińskim

Prześpij się z problemem

Napisało się programik sterujący pewnym urządzeniem. Tak naprawdę programy są dwa, jeden chodzi wprost w urządzeniu, drugi w kontrolującym je komputerze, ale mowa tu o tym pierwszym. 

Urządzenie przyjmuje i wysyła rozmaite sygnały elektryczne, TTL i analogowe, zapisuje je w kontrolującym komputerze, reaguje na stany wejść, trochę wchodzące sygnały analizuje, i w ogóle ma pełen procesor roboty. Między innymi przełącza periodycznie przekaźniki w innym urządzeniu, co słychać jako pstryk. A także wymaga – i czeka – by stan pewnego wejścia był wysoki. I reaguje, jeśli w odpowiednim momencie stanie się przez chwilę niski. 

To, co wejście owo kontroluje, czasami  upiera się na stan niski, i nie ma przebacz, żeby zrobiło wysoki. Co zatrzymuje programik, a więc i inne, ważniejsze rzeczy. Więc programik się zmieniło dodając zmienną passive. Jak się zmienną ustawi na 1, programik będzie stan wejścia jednak ignorował. Wszak z dwojga złego lepiej zignorować wejście niż stracić wszystko.

Nowa wersja programiku został przetestowana, parę bugów poprawione, i rzecz weszła do eksploatacji. Ale student obsługujący zgłosił po dwóch dniach: – Wiesz, jak włączam passive to chyba wszystko zaczyna szybciej chodzić, częściej słyszę pstryki.

Sprawdziłem – student miał rację. O dziwo. Po czym spędziłem kupę czasu wpatrując się w:

0078 PRETR:     TICKS  time            ;get time of pretrial start >pretrial
0079            TABLD  stend,[zero]    ;load pretrial duration >pretrial
0080            ADD    stend,time      ;calculate trial end >pretrial
0081 PTLOOP:    TICKS  time            ;get current time   >pretrial
0082            CALL   PROCREW         ;process reward     >pretrial
0083            CALL   CHKBAR          ;check bar          >pretrial
0084            BEQ    one,[zero+24],PRETRTIM ;proceed to time check if bar on >pretrial
0085            BEQ    passive,zero,PRETR ;if no bar and no passive task, restart pretrial >pretrial
0086 PRETRTIM:  BLT    time,stend,PTLOOP ;loop if pretrial not elapsed>pretrial

i kombinując, dlaczego drań chodzi szybciej gdy passive=1. Czytałem powyższy fascynujący tekst w kółko, wstawiałem testowe wskaźniki w różne miejsca (zwykły debug z wykonywaniem krok po kroku nie wchodzi tu w grę). Wszystko było dobrze. Tylko chodziło szybciej.

Wreszcie wzruszyłem ramionami, poszedłem do domu. Następnego dnia, coś koło śniadania, coś mi nieśmiele zapukało do łba. W pracy siadłem do kodu – i od razu heureka! Powyższa część kodu służąca czekaniu, aż stan wejścia będzie wysoki, była w porządku. Ale nie dodałem ignorowania wejścia w innej części – normalnie reagującej, gdy jego stan stał się na chwilę niski. I to w sumie doprowadziło do częstszych pstryków.

Wniosek: nie rób dziś tego, co możesz odłożyć na jutro!

Advertisements

Comments are closed.

%d blogerów lubi to: