-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Na potrzeby dalszej części, przytoczę sygnatury take z brancha mutex. Jestem świadom że nie jest to skończone, służą tylko na potrzeby poniższych rozważań.
void mutex::take()
void mutex::take(uint32_t timeout)
Z punktu widzenia RTOSa sam mutex.take() jest bardzo słaby. Nie jest z góry ograniczone ile będzie się taki call wykonywał. Tak więc sądzę, że jest on nie potrzebny. Wystarczy dać programiście narzędzia do zrobienia takiego konstruktu np. w postaci nieskończonego timeoutu j. Zmniejszy to ilość błędów w programach.
Jest inna rzecz o której trzeba ładnie pomyśleć. Powiedzmy mamy taki call mutex.take(200). Jeżeli wszystko jest w porządku to świetnie, po prostu wychodzimy z take() i działamy dalej.
Jajo zaczyna się, gdy ten timeout nastąpił. Fajnie byłoby gdyby wołający miał informację, czy powrót sterowania jest spowodowany poprawnym daniem mutexu czy błąd spowodowany przekroczeniem.
Najprostszym rozwiązaniem tego problemu byłoby dodanie kodu wyjścia. Wtedy sygnatura wyglądałby uint8_t mutex::take(uint32_t timeout) oraz użycie mniej więcej tak:
if(mutex.take(200) == FINE){
// Gdy mutex wykonał się poprawnie
} else {
// Gdy nastąpił timeout
}
Takie podejście spowoduje dużą ilość ifowania w kodzie oraz ewentualnie jego zaciemnie. Jednak jest najprostrzym do implementacji i będzie działał. Na pewno użyjemy tego.
Drugim pomysłem jest użycie wskaźnika na funkcję która zostanie wywołana jeżeli wystąpi timeout. Problem jest jak sterowanie ma wrócić do taska i czy w ogóle powinno. Bardziej bym szedł w tę stronę, ale wymaga to większego przemyślenia w kontekście systemu.