eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming[Laik] C przerwanie działania funkcji.Re: [Laik] C przerwanie dzia?ania funkcji.
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!news.chmurka.net!.POSTED!not-for-mail
    From: g...@s...invalid (Adam Wysocki)
    Newsgroups: pl.comp.programming
    Subject: Re: [Laik] C przerwanie dzia?ania funkcji.
    Date: Fri, 30 May 2014 08:11:52 +0000 (UTC)
    Organization: news.chmurka.net
    Lines: 60
    Message-ID: <g...@n...chmurka.net>
    References: <5387149d$0$2153$65785112@news.neostrada.pl>
    <g...@n...chmurka.net> <lm8gcf$f1d$1@node1.news.atman.pl>
    <o...@4...com>
    <53882f4e$0$2147$65785112@news.neostrada.pl>
    NNTP-Posting-Host: 127.0.0.1
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2
    Content-Transfer-Encoding: 8bit
    X-Complaints-To: abuse-news.(at).chmurka.net
    NNTP-Posting-Date: Fri, 30 May 2014 08:11:52 +0000 (UTC)
    User-Agent: tin/2.2.0-20131224 ("Lochindaal") (UNIX) (Linux/3.2.0-4-686-pae (i686))
    X-Authenticated-User: gof
    Xref: news-archive.icm.edu.pl pl.comp.programming:205875
    [ ukryj nagłówki ]

    Andrzej W. <a...@w...pl> wrote:

    > Ja chciałbym mieć coś co pozbędzie się funkcji F bez jej wiedzy i zgody.
    > Czyli z funkcji obsługi przerwania wrócimy nie w miejsce w którym główny
    > program został zatrzymany ale do punktu B.
    > Problemem jest posprzątanie po F.

    Jeśli naprawdę bardzo chcesz, to możesz użyć setjmp i longjmp, ale ja
    osobiście nie podjąłbym się używania longjmp w ISR (to może spowodować
    problemy, które ciężko będzie przewidzieć). W assemblerze to mooooże
    jeszcze (analogicznym mechanizmem - skokami), ale w C nie...

    Coś takiego:

    jmp_buf b;

    ...

    if (setjmp(b) == 0)
    {
    // tu jesteśmy pierwszy raz
    A();
    F();
    B();
    }
    else
    {
    // tu jesteśmy po longjmp

    // należałoby przywrócić to, co zostało zmienione w prologu
    // funkcji obsługi przerwania (przywrócić przerwania,
    // rejestry, zdjąć ze stosu adres powrotu i zignorować go)

    B();
    }

    ...

    ISR()
    {
    longjmp(b, 1);
    }

    A potem jak dodasz coś do ISR przed longjmp i kompilator odłoży na stos
    jakiś rejestr, to będziesz musiał pamiętać o zdjęciu go tam, gdzie jest
    komentarz "tu jesteśmy po longjmp"...

    Poczytaj:

    http://pl.wikipedia.org/wiki/Longjmp
    http://en.wikipedia.org/wiki/Setjmp.h

    > Wygląda na to, że ten pomysł może przynieść więcej problemów niż ich
    > rozwiązać.

    A to na pewno.

    --
    SELECT finger FROM hand WHERE id = 3;
    http://www.chmurka.net/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: