No dobrze - o matko (sorki) moja kurza ślepota ale zwrócę uwagę na coś innego mocno niepokojącego w twoim kodzie. On się cały czas resetuje po przerwaniu. Po pierwsz po co ci cli() i sei() w przerwaniu (przecież wyłączenie innych przerwań po wejściu w każde przerwanie dzieje się z automatu) ale już wplecenie rozkazu: reti(); to wyciągnięcie dywanika...
chodzi mi ogolnie o to dlaczego sie robi w ten sposob: dim x as byte do x = 0 call cos (X) loop end sub cos (byref y as byte) y=100 end sub a nie w ten? dim x as byte do x = 0 call cos loop end sub cos x=100 end sub Generalnie nie powinno się zmieniać wartości parametrów w procedurach. Chyba, że tego wyraźnie chcesz i teraz w zależności...
Dzieje się tak, ponieważ po wyjściu z ostatniej pętli czyścisz ekran, zmieniasz wartość zmiennej "a" i kończysz program - wracasz z funkcji main(). Zapomniałeś dodać pętlę nieskończoną, while(1). Rozpoczyna się ją za wstępną inicjalizacją. W twoim przypadku, będzie to za ekranem powitalnym. Skoro zaczynasz przygodę z programowaniem, to napiszę jeszcze...
każda jest dla mnie cenna Może nie do końca na temat, ale: jeśli zmienna LicznikKonfiguracyjny jest globalna, to nie musisz jej przekazywać (jako parametru) każdej funkcji osobno. Każda z tych funkcji może się do niej (zmiennej globalnej) odwołać bezpośrednio. Zmiennych globalnych generalnie należy unikać. Np. w Twoim kodzie SredniaADC i WartoscADC...
Słyszałeś o czymś takim jak zmienne lokalne? Zastanawiałeś się jak to ma działać, skoro jednokrotne wykonanie tej funkcji modyfikuje wartość zmiennej globalnej, a pewnie przypisanie do niej miałeś tylko przed pętlą. W ogóle ten program jest napisany w jakimś nieznanym mi języku, bo jaki ma sens pisanie programu w C bez ŻADNYCH zmiennych lokalnych i...
To co niżej zasugeruje nie musi Ci pomóc ale spróbuj wykonać. Zmienną globalną zadeklaruj jako: static volatile DATACNT W ten sposób powiesz kompilatorowi aby ochronił jej stan przed przypadkową modyfikacją. Z problemem nie panowania nad wartością zmiennej globalnej sam biłem sie tracąc czas i nerwy. Jak się okazało przerwania powodowały nadpisywanie...
Jeżeli nie modyfikujesz globalnej zmiennej w onStep(), to nie musi być ona volatile. Inną sprawą jest natomiast to, czy zechcesz blokować przerwania w loop() na czas modyfikacji zmiennej globalnej 'liczba' - jeżeli jest 8-bitowa, w tym konkretnym przypadku nie ma potrzeby (to jest proste przypisanie nowej wartości). Mogą natomiast wystąpić takie przypadki,...
A te twoje liczniki i zmienne globalne modyfikowane w przerwaniach sa zadeklarowane jako volatile?
... no przeciez pisze co jest nie tak. funkcja ma zwracac inta, a nie zwraca nic. mylisz chyba to co funkcja modyfikuje wsrod zmiennych globalnych, z tym co ona zwraca. to sa dwie ODMIENNE rzeczy. jesli funkcja ma zwracac int, to na koncu ma byc return _zmienna_int_; zamiast spacji zwyklo sie uzywac tabulatorow. jak chcesz miec fajny edytor to zainstaluj...
Trzeba było od razu napisać, że dostałeś taki kod na kolokwium, bo to zmienia postać rzeczy... oraz moje zdanie na jego temat. Teraz twierdzę, że kod jest prawie genialny w swoim zagmatwaniu i pewnie też taki miał być w zamyśle tego, kto to układał. Ale do rzeczy. Wbrew temu, co Ci się wydaje ostatnia i zresztą jedyna operacja zapisu do zmiennej tablicowej...
Tablice tak zdefiniowane są lokalne, czyli widoczne tylko w obrębie funkcji. Najprostszym wyjściem będzie zdefiniowanie ich na początku programu, przed wszystkimi funkcjami (m.in. przed main), jako globalne. Wtedy każda funkcja będzie je widziała i mogła swobodnie modyfikować ich zawartość. Drugim rozwiązaniem jest pisanie funkcji tak, by przyjmowały...
1. idealnie to analizujesz, dokładnie tak zapis 16bit może być podzielony przez przerwanie 2. leczy się to przez rzeczywiście wyłączenie przerwań ORAZ jako baza zadeklarowanie zmiennej jako volatile (wielu wierzy tylko magiczna moc volatile - błąd). Przywrócenie przerwań jest IMHO ładniejsze, jak ma charakter "push stan przerwań / disable / algorytm...
Nie ma się nad czym głowić:) Czas ustawia Ci linijka: [syntax=java]time.set((now - startTime)/1000.0);[/syntax] Przy czym startTime to moment uruchomienia timera - czyli kliknięcia start - no tak masz napisane:) [syntax=java]public void start() { startTime = System.currentTimeMillis(); running.set(true); super.start(); }[/syntax] Więc po każdym kliknięciu...
Wyjaśnił już to albertb . Zmienne static w funkcji to są takie zmienne globalne, które mają ograniczony zasięg to funkcji, w której występują. Oznacza to, że zmienna tmp przyjmuje wartość 22 podczas uruchamiania procesora, jeszcze przed funkcją main() . Funkcja zamiana1() modyfikuje zmienną tmp w taki sposób, że jej wartość po pierwszym wywołaniu jest...
pewnie dlatego ze: 1. przerwania nie zwracaja zadnych wartosci - int obsluga_przerwania1() jest bledne 2. poczytaj co to jest volatile sprawa zmiennych volatile byla poruszana jakies tryliard razy. calkowicie podstawowa sprawa, o ktorej pisze w kazdej ksiazce i kazdym kursie, jest deklaracja globalnych zmiennych modyfikowanych w przerwaniu i uzywanych...
No najlepiej jakbym użył zmiennych globalnych, bo będę miał kilkanaście formularzy i na każdym musiałbym stosować ten "trik".
Z tego co się doczytałem zmienne tworzone w funkcji "giną" w raz z wyjściem z funkcji ale jak to jest naprawdę?? Radzę znaleźć jakąś dobrą książkę do C. W skrócie: takie zmienne (automatyczne) giną ponieważ przechowywane są w trakcie wykonywania danej funkcji na stosie. Jeśli program wchodzi w nową funkcję na stosie zapisywany jest kontekst powrotu...
Chyba już załapałem o co chodzi :D Wnioskuję że mój drugi post był błędny: ulegnie zaktualizowaniu w pamięci po każdym kroku , a ustawienie zmiennej jako volatile ma sens tylko wtedy, jeżeli przerwanie może "przerwać" proces pomiędzy zauktualizowaniem wartości w rejestrze [z poziomu assemblera] (r+=3) a przeniesieniem jej do pamięci (t=r). Czyli jeżeli...
No właśnie - w końcu dla nieznanego mechanizmu modyfikującego zmienne nieznany rejestr procesora nie jest ani trochę bardziej nieznany niż nieznana lokacja na stosie. :)
Inna sprawa z globalnymi zmiennymi o external linkage. Jak taka zmienna jest modyfikowana przez przerwanie czy inny wątek o to trzeba volatile bo faktycznie tą zmienną może zmienić coś innego niż aktualnie wykonywany scope programu. Jak pokazałem wyżej (podaję link jeszcze raz - https://godbolt.org/z/Q3gWiQ ), wcale nie jest ono zawsze potrzebne [;...
(at)krzysiek_kutno Odszukaj w kodzie, który masz odwołań do pionu IO. Zwykle są to pojedyncze instrukcje. One na sztywno mają jakąś maskę, odzwierciedlającą położenie pinu. Tę maskę zamień na zmienną globalną, którą będziesz modyfikował w swoim kodzie. Gdyby załącznik był w zip to bym sobie go podglądnął, ale jestem zbyt leniwy na rozpakowanie rara...
Wywołanie przez referencję odbywa się np w taki sposób: void zmien_zmienna(int *a) { *a=1; } void main() { int n=5; zmien_zmienna(&n) //wywołanie przez adres //w tym miejscu zmienna n ma wartość 1 a nie 5 } Niemniej jak napisał wyżej kolega Freddie Chopin zadeklarowanie zmiennej globalnej (na zewnątrz main()...
Witam, mam taki problem: Na uC mam program z zadeklarowaną zmienną globalną np. " int i; ". Podczas działania uC, komunikuję sie z nim przy pomocy komputera i RS232 i modyfikuje wartość zmiennej " i ". Jak zrobić, aby po wyłączeniu zasilania uC (w zasadzie zasilania całego urządzenia) i powtórnym włączeniu, wartość naszej zmiennej " i " pozostała bez...
być może znalazłem bląd polega on na tym, że w w przerwaniu deklarujesz zmienną count i od razu przypisujesz jej wartość pytania są 2: czy przypadkiem przy kazdym zgłoszeniu przerwania zmienna nie jest zerowana? czy ta zmienna ( a dokładnie komórka pamięci która przechowuje tą zmienną ) nie jest modyfikowana w innym fragmencie programu? najprawdopodobniej...
Jakiego typu jest absolutnie absurdalny i perwersyjnie wypaczony pomysł, aby mając OSa robić takie delay'e w wątkach ??? Również o podobną perwersję zakrawa wykonywanie przerwania timera co mikrosekundę tylko po to, zeby zmniejszać tam jakąś zmienną. Wez timer, skonfiguruj go jako one-shot, skonfiguruj mu takt na 1us, do ARR wpisz chciany czas w us,...
szybka transformana fouriera sygnału dżwiękowego w czasie rzeczywistym Nie rób fft przypadkiem na floatach a fixed point. pamiętaj że 990.0 to nie jest float tylko double, float to 990.0f Wirtualne metody to jedna z tych rzeczy w cpp, które powodują że kod jest wolniejszy niż ten napisany w C :P Jeśli ich naprawdę nie potrzebujesz to nie ma co ich...
No ale co to zmienia? zrobisz ją static w przerwaniu, czyli będzie miała zasięg lokalny. Teraz, żeby z reszty programu coś widzieć zrobisz globalną flagę, która - uwaga - musi być extern volatile. Gdzie tu sens?
W książce do której jest link w mojej stopce są darmowe przykłądy do ściągnięcia. Masz tam m.in. implementację takiego sprawdzania przycisków. Ale ok, można to zrobić też na timerze. Więc po kolei - zainicjowałeś timer, teraz w procedurze obsługi jego przerwania sprawdzasz stan przycisków. Dzięki temu ich stan będzie okresowo sprawdzany. Potrzebujesz...
Chodzi o zmianę ustawień kompilacji w projekcie. Jeśli masz włączoną optymalizację typu -O1, -O2, -O3, -Os albo -Og, to istnieje szansa, że zmienne lokalne zostaną przez kompilator zoptymalizowane w tylko jemu znany sposób, przez co podgląd ich przez debugger będzie problematyczny. Dotyczy to jednak tylko zmiennych lokalnych automatycznych (wewnętrznych...
Witam, Mam dosyć dziwny problem ze zmiennymi globalnymi w programie napisanym w C na procesor encore! 6421. Architektura programu wygląda mniej więcej tak: main.c includuje pliki ".h" np uart.f itd... W jednym z plików .h(system.h) chcę zadeklarować zmienną globalną która będzie modyfikowana w przerwaniach w pliku uart.h. W oparciu o tą zmienną wykonywane...
W Zmienne globalne — wiedz, kiedy są modyfikowane Zmienne globalne muszą być ostrożnie obsługiwane, gdy są używane z przerwaniami, ponieważ te są generalnie asynchroniczne. I jeżeli zmienna globalna jest modyfikowana przez ISR, może zostać zmieniona w dowolnym momencie. Musimy mieć na uwadze następujące aspekty: Odczyt/zapis zmiennych globalnych...
instrukcja SEI na początku ISR, avr-libc to załatwia Dla ścisłości, powinieneś użyć: ISR(XXX_vect, ISR_NOBLOCK) { ... } bo wpisanie na początku obsługi przerwania sei(); to nie to samo. Wtedy przerwania zostają włączone dopiero po prologu, czyli np. po odłożeniu na stos używanych rejestrów - to wprowadza pewne opóźnienie. Wiem - to...
(at)marek-czarny Programowanie nie jest dla osób szybko się irytujących. Rozwiązując problem, rozwiązuje się go po kolei. Obsługa LCD wprowadza znaczące opóźnienia, zapewne w kodzie tych funkcji masz delay lub oczekiwanie na jakiś stan. Efektywnie odpowiada to sytuacji w której delay, w dodatku losowy, wpakowałbyś do pętli głównej. Może tego nie dostrzegasz,...
zapewne tak: if (!flaga) yield() else { ... } 4\/3!! Nie, używałem zmiennej globalnej do której task 1 coś pisał, drugi ją czytał. Ale w momencie jak doszedł trzeci, także mogący te dane modyfikować, to odpuściłem sobie takie zabawy i zrobiłem to na zasadzie dwóch kolejek: task1 (pisze) -> task2 (czyta) albo jeśli jest potrzeba przetworzenia tych danych...
Nie przekazujesz danych do maszyny stanów tylko do stanu! Można to zrobić albo przez zmienną globalną albo przez parametr funkcji obsługującej stan (pod warunkiem, że wszystkie stany to obsługują, w przeciwnym przypadku będziemy mieli we wszystkich handlerach niepotrzebne parametry). Co do klawiatury to trochę się zakręciłem. Chodziło mi o to, że nie...
Zacznij od tego żeby zrobić prawidłowo projekt. Najpierw trzeba rozbić projekt prawidłowo na pliki (widziałeś jak to u mnie wygląda). Plik main.c z pętlą główną. Plik definicje.h gdzie wrzucasz te definicje które są na początku. Plik silniki.c gdzie jest kod do obsługi silników i silniki.h który sobie załączasz, z prototypami funkcji z silniki.c Oczywiście...
Czesc Nie wiem czy dobrze zrozumialem o co chodzi ale aby sie to wyswietliło potrzebna jest jeszcze linijka: UpdateData(false); A jesli dane masz w dwoch formach to nie zapominaj o zmiennych globalnych i o deklaracji drugiej formy. Hmmm.... Niestety nie dziala w ten sposob tak jak bym tego chcial :| Jednak nie modyfikuje tego zapisu. Napisze jeszcze...
Dawno się nie łączyłem z codesysa ale z tego co pamiętam. Może ktoś poprawi jeżeli się mylę. 1) Jeżeli ten kto poprzednio modyfikował wrzucił źródło programu to możesz je pobrać i porównać Project->Compare. 2) A po co Tobie coś takiego? Jak to bywa w "normalnych" sterownikach deklarujesz poprostu zmienną w lokalnym lub globalnym obszarze pamięci. 3)...
Można to zrobić na kilka sposobów, albo skorzytać z innych funkcji dostępu do plików które urzywają uchwytów, np CreateFile, ReadFile, albo skorzystać z typu Text (nie jestem pewien czy się da), albo zrobić zmienne typu TextFile jako globalne, nadać im numery i wybierać przy pomocy CASE po numerze podanym przy wywoływaniu procedury. PS (z ostatniej...
Electix: a możesz podać przykład jak by tą zmienną nie zadeklarować jako globalną, a kod by się kompilował? Bo jakoś tego nie widzę. O ile w tym przypadku może być celowe użycie modyfikatora volatile, to bynajmniej nie jest ono podyktowane użyciem zmiennej sstatus w przerwaniu, ponieważ nie jest ona w tym przerwaniu modyfikowana, a jedynie odczytywana,...
Po co ci dwa globalne wskaźniki? Masz jakieś wyróżnione miejsce na liście? Przy zabawie z takimi strukturami powiązanymi dobrze jest sobie rysować kwadraciki i strzałeczki by zobrazować jak wygląda struktura danych w każdym momencie. Jeden element to trochę mało by nazwać to listą. Jakie ma być działanie funkcji fdodawanie? Po co jej dwa parametry?...
Od kilku dni testuję nowe środowisko Crossworks v.2.0 for ARM z układami STM32. Równolegle pracuję w środowisku Ride7 i wszystko w nim działa bez problemu (wierzchołek stosu jest zawsze daleko w pamięci od zmiennych globalnych) W Ride7, stos układów STM32 jest ustawiany bezpośrednio po resecie na wartość 0x20000000 + rozmiar RAM co w moim przypadku...
Napotkałem dziwny problem. Spróbuję to dość jasno opisać. W procedurze uruchamiam timer0. Następnie po uruchomieniu program wpada w pętle : flaga=1; timer0_on; while(flaga) { } zmienna flaga zadeklarowana jako globalna (na samym szczycie kodu po define'ach) zerowana jest w procedurze obsługi przerwania timer0. Oczywiscie po tym program...
Witam, muszę rozwiązać pewne zagadnienie, które chyba jest łatwe, tylko zbyt mocno się zakręciłem. Otóż mam zdefiniowaną zmienną globalną tab global.c : uint8_t tab[256]; uint8_t get_buffer(uint8_t **destination_frame) { *destination_frame=(uint8_t *)&tab[0]; } api.c: static uint8_t *frame_start; (void)...
session_destroy() niszczy wszystkie dane skojarzone z bieżącą sesją. Nie usuwa żadnych globalnych zmiennych związanych z sesją. Nie usuwa też ciasteczka sesyjnego. Aby "zabić" całość sesji, na przykład aby wylogować użytwkonika, należy także usunąć identyfikator sesji. Jeśli do propagowania identyfikatora sesji jużyte było ciasteczko, to usunięte musi...
Ja tylko przypomnę o czym autor pisał na początku: Ale wydaje mi się że gdy będe w kazdym pliku robił Stałe stale = new Stale() to nowa instancja będzie w sobie zawierała zmienną ModułyAktywne która zawsze będzie == 1, a nie tak jak została zmianiona w np innym pliku. Jeśli dobrze rozumiem, to chcesz modyfikować te zmienne w jednym pliku (formie), i...
krzychoo_soft -> W aplikacji mam kilka formularzy. Na formularzu głównym jest trzon aplikacji, natomiast na formularzach tworzonych jako okienka dialogowe modalne umieszczam funkcje zapisu wartości do zmiennych globalnych , które mam zdefiniowane na formularzu głównym . dokładniej o to mi chodziło. Jeśli kod Form2 modyfikuje Edit1 znajdujący sie na...
Cel tego wątku jest żeby się czegoś dowiedzieć i czegoś nauczyć :) . Tyle się słyszy (czyta) o tym czego "nie wolno" - a czasami wolno tylko po prostu trzeba wiedzieć kiedy. Wszystko rozbija się o wiedzę. To nie jest temat "jak zepsuć", wbrew nazwie ;) , tylko temat jakie nietypowe działania zastosować i nie zepsuć. Właśnie siedzę nad jednym projektem...
Jest zasadnicza różnica pomiędzy tymi deklaracjami. Obie z pozoru maja robić to samo. Pierwsza inicjuje zawartość tablicy wprost, wartościami dla wygody podawanymi jako znaki. Kompilator a dokładnie linker zbiera wszystkie inicjowane zmienne "do kupy". Umieszcza je w obrazie a następnie, tuż po starcie specjalny kod (czasami kompilator go generuje,...
Po trzech nieudanych próbach odczytu czujnika ma być wykonany reset. Niezależnie od tego w jakim długim okresie czasu nastąpiły? Rozwiązałem problem rezygnując ze zwracania wartości "String" przez funkcję - "String" jest teraz przekazywany do funkcji przez referencję i wszystko zaczęło działać. Faktycznie zwracanie całego obiektu String przez funkcję...
deklaracja zmiennych globalnych modyfikowanie ścieżek modyfikowanie zwrotnic
kodeki filmów kodeki filmow czujnik pralka pokojowy termostat temperatura
Oprogramowanie wędzarni Kinco PLC: Sterowanie i Integracja Historia nasady kominowej strażak – patenty, Colt Cowl, rozwój konstrukcji