Witam.
Wykonuje właśnie aplikacje do symulacji wyświetlacza LCD. Aplikacja za pomocą karty pomiarowej będzie podłączona do płytki obwodu drukowanego w miejscu gdzie powinien być podłączony wyświetlacz, czyli będzie odczytywała to co mamy na wejściu wyświetlacza. Ponieważ mój poprzedni kod ( co ciekawe działający prawidłowo) wyglądał mniej więcej tak:
Więc postanowiłem go przepisać wykorzystując architekturę producent/konsumer. Podzieliłem program na 3 części: producenta który będzie zapisywał każda chwilową wartość na złączu wyświetlacza, producenta-konsumenta który będzie odczytywał wartości chwilowe i zapisywał do 3 różnych kolejek wartości zatrzaśnięte zboczem narastającym na jednym z złącz i konsumenta który będzie przetwarzał zatrzaśnięte dane i wykonywał odpowiednie instrukcje lub drukował odpowiednie znaki na wyświetlaczu.
Opiszę teraz część 2 dla większej jasności: kolejka otrzymuje tablicę 8 elementową 1-D boolowską, zapisuje wartość jednej z komórek do jednej kolejki i w zależności od wartości tej komórki zapisuje dane w postaci 4 elementowej 1-D tablicy boolen do 2 kolejek dla T i do jednej dla F. Sprawdziłem i zapis jest realizowany 458 razy, tyle ile potrzebuje.
Ale pętla nr 3 wykonuje się już tylko 192 razy, czyli grubo ponad połowę danych jest gubione. Czemu tak się dzieje?
Widok 2 pętli:
Widok 3 pętli:
Z góry dziękuje za pomoc.
Symulator wyswietlacza LCD, problem z kolejkami
- Pitol
- Moderator
- Posty: 987
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: Symulator wyswietlacza LCD, problem z kolejkami
Zapamiętaj życiową prawdę:
LEPSZE JEST WROGIEM DOBREGO !!!
No ale wracając do Twojego problemu. Program jest dość rozbudowany i wątpię czy znajdzie się ktoś kto by chciał to całe ogarnąć.
W każdym bądź razie mam jedno podejrzenie.
Piszesz:
Jeśli nie to nie czytaj dalej
Jeśli tak to.... popatrz sobie na pętlę nr 3.
Masz tam trzy bloczki Dequeue Element. Zastanawiałeś się kiedyś jak one działają?
Bloczek ten CZEKA na pojawienie się elementu w kolejce. Jeśli nic nie dostał to czeka... i czeka... i będzie czekał (chyba, że mu timeout zdefiniujesz).
Z tego co widzę to każdą z tych trzech kolejek zapełniasz w inny sposób. Więc jeśli kolejka nr 1 napędzana jest 100 razy a kolejki nr 2 i nr 3 napędzane są 50 razy, to pętla nr 3 wykona się tylko 50 razy.
Dla testu zrób sobie dodatkową pętlę While, dociągnij tam referencje Twoich kolejek i dopnij do nich bloczki Get Queue Status. Zobaczysz, jak w kolejkach gromadzą się dane i czy przypadkiem któraś z nich się nie opróżniła szybciej niż pozostałe.
EDIT: Inny test możesz przeprowadzić w taki sposób, że wygeneruj tablicę samych wartości TRUE i taką spróbuj przesłać. Jeśli wszystkie kolejki będą napędzane w ten sam sposób powinieneś mieć poprawną ilość iteracji pętli nr 3.
LEPSZE JEST WROGIEM DOBREGO !!!
No ale wracając do Twojego problemu. Program jest dość rozbudowany i wątpię czy znajdzie się ktoś kto by chciał to całe ogarnąć.
W każdym bądź razie mam jedno podejrzenie.
Piszesz:
Czyli w jednym z tych Case'ów w pętli nr 2 raz piszesz do trzech kolejek, a raz tylko do jednej. Mam rację?(...) i w zależności od wartości tej komórki zapisuje dane w postaci 4 elementowej 1-D tablicy boolen do 2 kolejek dla T i do jednej dla F.
Jeśli nie to nie czytaj dalej
Jeśli tak to.... popatrz sobie na pętlę nr 3.
Masz tam trzy bloczki Dequeue Element. Zastanawiałeś się kiedyś jak one działają?
Bloczek ten CZEKA na pojawienie się elementu w kolejce. Jeśli nic nie dostał to czeka... i czeka... i będzie czekał (chyba, że mu timeout zdefiniujesz).
Z tego co widzę to każdą z tych trzech kolejek zapełniasz w inny sposób. Więc jeśli kolejka nr 1 napędzana jest 100 razy a kolejki nr 2 i nr 3 napędzane są 50 razy, to pętla nr 3 wykona się tylko 50 razy.
Dla testu zrób sobie dodatkową pętlę While, dociągnij tam referencje Twoich kolejek i dopnij do nich bloczki Get Queue Status. Zobaczysz, jak w kolejkach gromadzą się dane i czy przypadkiem któraś z nich się nie opróżniła szybciej niż pozostałe.
EDIT: Inny test możesz przeprowadzić w taki sposób, że wygeneruj tablicę samych wartości TRUE i taką spróbuj przesłać. Jeśli wszystkie kolejki będą napędzane w ten sam sposób powinieneś mieć poprawną ilość iteracji pętli nr 3.
Symulator wyswietlacza LCD, problem z kolejkami
Już wszystko, rozumiem, poprawiłem i działa. Po prostu przekombinowałem, żeby w drugiej pętli zamiast do 3 kolejek wrzucało do jednej. Jeszcze to wszystko opisać, pozwijać do SubVI'ajów i będzie git. Dziękuje za uwagę co do sposobu wykonywania się kolejki i co kiedy mamy kilka kolejek w jednej pętli.