Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 30 mar 2026, o 19:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 16 lip 2013, o 08:43 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Witam.
Czy jest możliwa podmiana "w locie" procedury obsługi przerwania? Konkretnie chodzi mi o to czy da się napisać dwie lub więcej wersji funkcji np. ISR(INT0_vect){} i w trakcie działania programu np. na podstawie maszyny stanów w pętli głównej lub w pewnej sekwencji aktywować odpowiednią obsługę przerwania. Mogę oczywiście taką maszynę stanów zaimplementować wewnątrz funkcji obsługi przerwania ale wolałbym uniknąć niepotrzebnego sprawdzania warunków w przerwaniu. To coś na wzór Callback'a ale na przerwanie. Tu druga część pytania. Jeżeli powyższe nie jest możliwe to czy z funkcji przerwania można wywołać takiego wcześniej zarejestrowanego Callback'a i czy są jakieś szczególne warunki jakie musi ten Callback spełniać. Czy można go "obiedzić" z prologu i epilogu atrybutem __attribute__ ((naked)); ?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 08:46 

Pomógł: 0

Z tego co ja wiem, to nie możesz wywołać dwu różnych przerywań, ponieważ, przy wywoływaniu przerywania, wykorzystujesz tablicę vectorów przerywań i tam jest umieszczany skok do przerywania...hmmmm może jakaś wstawka asemblerowa. Albo jednak proste sprawdzenie za pomocą if w przerywaniu flagi, potem rozdzielenie na dwie "funkcje" w przerywaniu.
Samo przecież sprawdzenie flagi 0/1 nie trwa znowu tak długo, a po tym już przecież normalnie obsługujesz przerywanie jak ci tam pasuje.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 08:59 

Pomógł: 0

No robisz coś na zasadzie semafora, zależnie od parametru w przerywaniu wykonujesz dany podprogram.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 09:05 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Aktualnie robię projekt szkoleniowy ze sterowania fazowego. Chciałem zaimplementować autoadaptację układu do warunków rzeczywistych panujących w sieci tj. najpierw wykorzystać INT0 jako detektora zera i timera1 do sprawdzenia parametrów sieci czyli de fakto zliczenia ile trwa stan niski i wysoki w detektorze. Na pracę detektora wpływa wiele czynników : dobór elementów, kalibracja układu RC w kontrolerze, pewnie jeszcze innych kilka rzeczy. Na podstawie kilku- kilkunastu serii uśrednionych pomiarów chcę ustalić ile ticków to 0% a ile to 100% i w dalszej części programu zapamiętane dane wykorzystywać w trybie CTC timer1 do sterowania fazowego. Ot taka zabawa licznikami. Ale po wykonaniu serii pomiarów funkcjonalność związana z pomiarem zaszyta w procedurze przerwania już nie będzie mi potrzebna więc chciałem sobie zrobić dwie procedury jedną na okoliczność pomiarów drugą na okoliczność normalnej pracy. Jeszcze przyszła mi do głowy trzecia funkcjonalność czyli tryb zliczanie ilości przejść przez zero do sterowania grupowego.

------------------------ [ Dodano po: 2 minutach ]

Skoro jest wektor w tablicy który tak na prawdę po definicji funkcji zawiera jedynie rozkaz skoku to czy nie może skakać w różne miejsca?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 09:13 

Pomógł: 0

No może, ale to byś musiał zmieniać już w assemblerze, bo chyba w C nie ma takiej możliwości, ale głowy sobie nie dam uciąć.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 09:18 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

No dobra. A co z pomysłem wywoływania Callback'a z procedury przerwania? Przerwanie miałoby tylko jedno zadanie : wywołać callback'a. A tego to bym sobie mógł już podmieniać jak chcę. Taki skok do skoku. Pytanie o atrybut naked dalej otwarte.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 09:28 

Pomógł: 0

Nie wiem, czy callback nie był by sztuką dla sztuki, sam callback jest w zasadzie czymś na kształt przerywania, czyli to callback zgłasza potrzebę obsługi jakiegoś zdarzenia a nie na odwrót ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 09:32 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Takie coś mi się naskrobało. Nie mam jak tego sprawdzić na zestawie ale się kompiluje.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kody umieszczamy przy pomocy syntax=c - Zielony J.

_________________
sig off ;(



Ostatnio edytowano 16 lip 2013, o 09:37 przez perlon, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 09:49 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Wprawdzie w pętli głównej pałęta mi się delay ale tylko dla tego, że nie chciałem jeszcze pisać timera programowego do wyświetlania obliczonych średnich. Normalnie delaye u mnie nie występują. Ale czy taka struktura programu nie jest czytelniejsza niż długi makaron w obsłudze przerwania? Program docelowy ma dość rozbudowaną maszynę stanów opartą o analizę wartości w zmiennych typu strukturalnego i dość spore menu. Żeby to zrobić w jednej procedurz ISR musiałbym powielić kontrolę stanów w przerwaniu i dbać o spójność tych kontroli, a tak to przy okazji przebiegu pętli głównej mógłbym sterować jakie usługi świadczy przerwanie. No nic. Jak usiądą przy sprzęcie to to sprawdzę.

------------------------ [ Dodano po: 5 minutach ]

Zwróć uwagę, że wystawienie flagi w przerwaniu nie gwarantuje wykonania o jaki mi chodzi czyli o prawidłowe odczytanie rejestru TCNT1. osobną sprawą jest to że takie odczytanie też jest obarczone błędem wykonania wszystkiego przed sekcja1 += TCNT1; kilka us na pewno ucieknie ale to już nie problem. Pewnie przydałoby się takie ICP ale wywołane przez INT0. Tego nie wiem jak zrobić.

_________________
sig off ;(



Ostatnio edytowano 16 lip 2013, o 09:56 przez perlon, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 09:56 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

można to zrobić - wystarczy podmieniać w locie adres procedury przerwania (wektora) ... no ale to zabawa w asm troszkę ... a na prawdę i tak myślę, że to będzie skórka za wyprawkę takie kombinacje i stracisz na tym więcej niż zyskasz ...

samo przełączanie się w przerwaniu można zorganizować bardzo prosto i nie switchem tylko pojedynczymi IF'ami z ELSE'ami .... - SUPER krótka obsługa

if( warunek1 ) {

} else if( warunek2 ) {

} else if( warunek3 ) {

} ..... i tak dalej

nie ma tu żadnej zbędnej zwłoki która mogłaby ci przeszkodzić a o wiele bardziej logicznie można program napisać bo bez niepotrzebnych tu moim zdaniem kombinacji z podmianą wektorów w locie

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 09:59 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

No tak ale struktura ISR'a mi się jednak komplikuje i jest powieleniem analizy prowadzonej w pętli głównej gdzie warunek1, warunek2... muszą być ustawione. To może lepiej zamiast ustawiać warunki podmieniać CallBacka.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 10:37 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Tak właśnie. Coś powyżej już skrobnąłem ale potestować mogę po południu. Nie wiem jak zachowa się taki callback jak go potraktuję naked. Nie mam takiej wiedzy ale w AVR przy braku wywłaszczenia z przerwania nic stosu nie popsuje. Chyba ?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 11:03 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Moim zdaniem, wywoływanie jakichkolwiek funkcji z wewnątrz przerwań - hmm no to może nie nieporozumienie ale ... coś tym jest

chociaż wiadomo wszystko zależy od projektu - jednak ja jeśli TYLKO mogę to UNIKAM jak ognia niepotrzebnych wywołań funkcji i kolejnego koszmarnego wtedy obciążenia stosu - można się przejechać.

Poza tym skoro mówisz że AŻ TAK ci się skomplikuje procedura obsługi przerwania przez tych kilka IF'ów to już mi coś pachnie że ta procedura jest PRZEŁADOWANA i przesadzona na maxa :(

ale tak na prawdę - przecież nie wiemy co chcesz w niej robić więc ciężko mówić o szczegółach

ja tylko zwracam uwagę na zagrożenia

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 11:24 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Ja też tylko pytam o zagadnienie możliwości. Na początku zaznaczyłem że projekt jest szkoleniowy. Może trochę przekombinowany ale wiedza, że nie można też jest pewnym rodzajem wiedzy, a jakby można to czemu nie? Co do stosu to właśnie liczyłem na podpowiedź czy jakieś czary z mleka pozwolą uniknąć odkładania niepotrzebnie na stosie prologiem i zdejmowanie epilogiem danych skoro żadne inne przerwanie nie może się w tym czasie uruchomić bo mamy niejawnie cli() przy wejściu do ISR.
Dobra. Widzę, że ogólna rekomendacja jest "nie idź tą drogą", choć brak mi "bo volatile...", "bo naruszenie stosu...", "bo coś tam coś tam...". Bardziej liczyłem na "możesz tak zrobić ale musisz to.. to.. i jeszcze to..".
Niemniej dzięki za głos w dyskusji. Jak to stwierdził kol. Antystatyczny. Napisz i sprawdź. :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 11:30 

Pomógł: 0

No w zielonej masz opisane jak sprawdzać czy nie przepełnia ci się stos, j.w sam testy musisz przeprowadzić.
Zresztą też się dziwę, co sie tak boisz tych ifów w przerywaniu.....



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 11:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Tzn ale nie traktuj mojej wypowiedzi, że chcę cię zbyć - że nic nie można ....

ot po prostu podpowiadam ci dobrą praktykę i zagrożenia jaki się wiążą niestety z takim podejściem ....

Bo nie ma czary mary jak piszesz że są jakieś sztuczki aby uniknąć odkładania na stosie ... pomyśl każde wywołanie funkcji nawet bez argumentów to już dodatkowe zwiększenie stosu , a z argumentami ??? to chyba nie muszę mówić

a do tego pytałeś o __attribute__ ((naked)); ????

o nie nie ;) żeby się tym bawić to już trzeba ZNAĆ ASEMBLERA :( ... nie ma że boli ... wiesz kiedy możesz sobie dać NAKED jeśli nie znasz ASM ??

gdy potrzebujesz sobie np ustawić lub zgasić diodę LED czy tam zmienić stan pinu - bo to skompiluje się do JEDNEJ tylko instrukcji ASM, która w ogóle nie ma wpływu na rejestry znaczników i nie użyte zostaną żadne rejestry - odkładane i pobierane w epilogu i prologu

no ale jakbyś do takiego czegoś co tu wymyślasz i to jeszcze z callbackami dał atrybut NAKED, to uwierz mi - nie potestujesz tego za bardzo :( w ogóle nie potestujesz - bo to nie będzie miało prawa działać :(

inną sytuacją gdzie chciałbyś dać NAKED to wtedy gdy sam CAŁĄ procedurę obsługi przerwania napiszesz sobie w asemblerze i sam zrobisz chcąc nie chcąc prolog i epilog ale po swojemu.

Więc teraz mam nadzieję, że lepiej doprecyzowałem to o co mi chodziło w podpowiedziach moich?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lip 2013, o 13:48 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

rezasurmar napisał(a):
No w zielonej masz opisane jak sprawdzać czy nie przepełnia ci się stos, j.w sam testy musisz przeprowadzić.
Zresztą też się dziwę, co sie tak boisz tych ifów w przerywaniu.....

Nie boję się tylko szukam drogi na skróty... A kto drogę skraca... znaczy że szuka. I ja właśnie szukam, bo to jest projekt szkoleniowy a nie produkcyjny. Zresztą te klocki to dla mnie hobby a nie praca.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2013, o 19:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 mar 2013
Posty: 236
Lokalizacja: Warszawa
Pomógł: 5

Pomysł wydaje się zakręcony, ale może być fajny i pouczający. Ale w sumie skoro zaczyna działać to leć z tą fantazją. Kiedyś pisałem program w którym wywoływałem callbacka w który jako argument przekazywałem callback zwracającą int , który w zależności od tego co zwracał, rejestrował i wywoływał inny callback. Mogę napisać, teraz, to było zbędne i nie potrzebne, ale zrozumiałem system. Grunt, żeby w swojej fantazji umieć sam sobie ją zrealizowac, bo nikt normalny nie będzie ci pisał co masz żle w proggramie jeśli robisz cos po prostu bezsensu z punktu widzenia osoby, która sie na tym zna.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO