Sari la conținut
ELFORUM - Forumul electronistilor

"goto" dintr-o procedura in alta


Vizitator marian_i

Postări Recomandate

Vizitator marian_i

Buna ziiua!Incerc sa definitivez un proiect legat de un Attini861v.Codul este scris in C (CodeVisionAVR_.Imi poate spune si mie cineva cum pot face un "goto" din rutina de tratare INT catre bloculmain?Daca etichetez locatia destinatie,la compilare primesc mesajul de eticheta nedefinita(in cadrul rut. de INT)Daca adresa etichetata e apelata in cadrul aceleiasi proceduri desigur totul e ok.Multumesc anticipat!

Link spre comentariu
  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Laci

    2

  • cirip

    1

Top autori în acest subiect

Buna ziiua!Imi poate spune si mie cineva cum pot face un "goto" din rutina de tratare INT catre bloculmain?

Buna ziua. Nu se iese cu goto din rutina de intrerupere. Intrarea in intrerupere incepe cu salvarea automata a PC in stiva. Daca iesi din INT cu goto, nu mai descarci stiva si mai devreme sau mai tarziu se va revarsa (stack overflow). Din intrerupere se iese cu "return", dar nu ca instructiune de C. Compilatorul trebuie sa puna un return in asm cand converteste ultima acolada care inchide rutina de intrerupere.Iesirea din intrerupere nu trebuie "fortata" catre main sau in alta parte. La iesire, procesorul trebuie sa revina in program exact acolo unde a fost intrerupt si sa continue ce facea inainte sa primeasca intrerupere, altfel o ia razna. Revenirea se face cu return-ul pe care il pune compilatorul in asm.

Daca etichetez locatia destinatie,la compilare primesc mesajul de eticheta nedefinita(in cadrul rut. de INT)

Normal, pentru ca nu are vizibilitate. Cauta putin pe net despre "variable scope in C". De fapt, folosirea lui goto si a etichetelor in C este destul de neuzuala. K&R o descurajeaza.Cirip
Link spre comentariu
  • 2 săptămâni mai târziu...

Daps, cirip are dreptate, oricum dupa terminarea rutinei de intrerupere revine la locul unde a ramas,de ce vrei sa-l fortezi sa sara inapoi? Daca trebuie sa faci niste "manevre" in timpul intreruperii si sa sari dus-intors in main atunci nu-i bine ;) daca-i asa, atunci exista un remediu rapid:ctrl+a , del :))

Link spre comentariu

Umila mea parere: presupun ca saltul GOTO este generat in anumite circumstante. Cred ca poti folosi bucle sau instructiuni conditionalein asa fel incat intreruperea sa se termine normal, fara a se forta iesirea din ea. Apoi, desi nu e tocmai "state of the art", s-ar puteafolosi o variabila globala "flag" a carei valoare este stabilita un cadrul rutinei de intrerupere. La revenirea in functia main se verifica valoareavariabilei si se executa codul dorit corespunzator. Nu modeleaza 100% ceea ce doreai dar in cazuri particulare s-ar putea aplica.Edit: pun si eu o intrebare, daca generarea intreruperii se face la momentul executiei unei functii apelate din main(), executia functiei este intrerupta(un fel de Abort()) sau se executa pana la capat?

Link spre comentariu

Edit: pun si eu o intrebare, daca generarea intreruperii se face la momentul executiei unei functii apelate din main(), executia functiei este intrerupta(un fel de Abort()) sau se executa pana la capat?rasp: intreruperile in general sunt concepute 100% asincron, adica in momentul in care apar este intrerupt secventa programului, si sare la intrerupere, indiferent daca este intr-o functie sau nu, toate registrii utilizati de rutina de intrerupere sunt salvati pe stiva(stack) inclusiv SREG, si PC(program counterul este salvat), la sfarsitul intreruperii, valorile initiale sunt reluate din stiva, si sare inapoi de unde a fost intrerupt.Se pot face blocuri de cod care sunt executate atomic(nu se pot intrerupe), si se pot face intreruperi care se pot intrerupe la randul lor (nested interrupts), dar asta presupune deja un nivel de complexitate mai ridicat, si proiectare mai atenta.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări