To nie jest chyba najlepszy pomysł. Modem ten może sygnalizować zakończenie transmisji poprzez przerwanie zewnętrzne, jednak wiele funkcji z których wywoływana jest ta funkcja transmisji oczekuje statusu wykonania właśnie tej operacji transmisji. Żeby było jeszcze bardziej skomplikowanie to modem sygnalizuje przerwaniem zewnętrznym nadejscie wiadomości co wykorzystuje właśnie aplikacja. W tym przerwaniu, przy użyciu I2C odczytuje dane, które nadeszły. Zgłaszanie statusów transmisji zostało wyłączone z tego przerwania by nie komplikować sprawy. Zastanawiam się jak to wszystko sprytnie rozwiązać. robiw
Dodano po 23 [minuty]: Sprawa wydaje mi się o tyle niełatwa, że funkcja transmisji wykorzystywana jest w kilku funkcjach aplikacji i od rezultatu jej wykonania zależą na przykład decyzję podejmowane w innych funkcjach. Na domiar złego, wysyłane są różne rozkazy z różna liczba towarzyszących danych. Mogę włączyć zgłaszanie przez modem statusów operacji transmisji za pomocą przerwania tylko wtedy musiałbym zmodyfikować sama funkcję przerwania bo ona wywoływana jest również wtedy, gdy modem otrzyma dane (niezależnie od statusów). Należałoby jednak powiązać jakoś otrzymywane statusy z wysyłanymi rozkazami i towarzyszącymi im danymi. Nie mam w tej chwili, co prawda, pewności czy modem może odebrać jakaś wiadomość zanim nie zgłosi statusu operacji transmisji (a może to trwać nawet 1s) bo jest typu half-duplex, choć to raczej nie powinno mieć znaczenia. Inną, jeszcze bardziej komplikująca właściwością jest to (widać to w zarysie funkcji transmisji), że po pierwszym statusie mówiącym o zajętości magistrali, funkcja transmisji zmienia ustawienia modemu w zakresie wykrywania kolizji i próbuje jeszcze raz i jeszcze raz (w tej chwili 5-krotnie), aż do odczytu statusu niepowodzenia transmisji. Taki schemat jej działania to jeszcze większe wyzwanie dla procedury wysyłającej dane w tle...robiw
Dodano po 4 [minuty]: BlueDraco napisał: Jeśli nie RTOS, to automat, czyli po "polsku" - "state machine" (maszyna stanów - brrr...).
RTOS odpada. Jak widziałbys rozwiązanie tego typu przy pomocy maszyny stanów? Jaki mechanizm wykorzystać w tym przypadku by nie zatrzymywać main? Cykliczne przerwanie timera? Jak je powiązać z przerwaniem odbierania statusów. Hmm...robiw
Dodano po 2 [godziny] 6 [minuty]: Zastanawiam się nad rozwiązanie z buforem kołowym. Skonfiguruję modem tak, by wyzwalał przerwanie nie tylko w przypadku otrzymania danych, lecz również w przypadku gotowości statusu transmisji. Elementami bufora kołowego będzie struktura o następujących polach: komenda do wysłania, towarzyszące dane, liczba prób, status wysyłania). Funkcja wysyłająca będzie wyłącznie napełniała bufor kołowy nowymi danymi. Przerwanie do Timera wywoływane cyklicznie będzie sprawdzało, czy są jakieś dane do wysłania. Jeśli są to rozpoczyna transmisję i kończy swoje działanie. Przerwanie odpowiedzialne za odbiór statusów (jak i „zwykłych” danych) po otrzymaniu statusu będzie sprawdzało jego stan. Jeśli transmisja się powiodła to zdejmuje z bufora bieżącą strukturę, jeśli nie to w bieżącej strukturze zmienia status by przerwanie do Timera podjęło następną próbę wysyłania przy zmienionych parametrach nadajnika. Jeśli wykorzystano maksymalną liczbę prób i nadal nie wysłano bieżącej paczki danych to struktura ta zostanie z bufora usunięta a aplikacja powiadomiona o błędzie transmisji – np. pokaże stosowne okno informacyjne. Tutaj pojawia się i tak kolejny problem a może i nie jeden, do rozwiązania: w takim wypadku nie będzie można przesłać kolejnych danych zanim bieżące pole bufora nie zostanie obsłużone, gdyż w innym przypadku nie byłoby wiadomo do której transmisji dedykowany jest odebrany status co i tak zablokuje możliwość wysyłania kolejnych danych przez ten czas 1s (tyle może trwać „podjęcie” wszystkich prób). Druga sprawa, to fakt, iż niektóre transmisje zapoczątkowywane są po wywołaniu pewnych funkcji za pomocą okien (GUI) i funkcje te czekają na status transmisji. Trudno mi wyobrazić sobie sytuację, że okno zamykamy by nie blokowało aplikacji a później przychodzi oczekiwany status transmisji… jakieś pomysły na usprawnienie tego mechanizmu? Z góry serdeczne dzięki… robiw