eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaC - łańcuchy tekstowe definiowane w parametrach funkcjiRe: C - łańcuchy tekstowe definiowane w parametrach funkcji
  • X-Received: by 2002:a05:620a:68f:b0:6be:5a7c:d61a with SMTP id
    f15-20020a05620a068f00b006be5a7cd61amr1448325qkh.519.1661524846177; Fri,
    26 Aug 2022 07:40:46 -0700 (PDT)
    X-Received: by 2002:a05:620a:68f:b0:6be:5a7c:d61a with SMTP id
    f15-20020a05620a068f00b006be5a7cd61amr1448325qkh.519.1661524846177; Fri,
    26 Aug 2022 07:40:46 -0700 (PDT)
    Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.man.lodz.pl!newsfeed.pionier.net.p
    l!2.eu.feeder.erje.net!feeder.erje.net!news.quux.org!weretis.net!feeder6.news.w
    eretis.net!usenet.blueworldhosting.com!feed1.usenet.blueworldhosting.com!peer01
    .iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!n
    ntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
    Newsgroups: pl.misc.elektronika
    Date: Fri, 26 Aug 2022 07:40:45 -0700 (PDT)
    In-Reply-To: <6308cdf1$0$6193$65785112@news.neostrada.pl>
    Injection-Info: google-groups.googlegroups.com; posting-host=84.10.46.130;
    posting-account=fcN60AoAAACGnErMsW3A8rTO2UKkGJEn
    NNTP-Posting-Host: 84.10.46.130
    References: <6308cdf1$0$6193$65785112@news.neostrada.pl>
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <4...@g...com>
    Subject: Re: C - łańcuchy tekstowe definiowane w parametrach funkcji
    From: Dawid Rutkowski <d...@w...pl>
    Injection-Date: Fri, 26 Aug 2022 14:40:46 +0000
    Content-Type: text/plain; charset="UTF-8"
    Content-Transfer-Encoding: quoted-printable
    X-Received-Bytes: 4604
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:773942
    [ ukryj nagłówki ]

    piątek, 26 sierpnia 2022 o 15:43:15 UTC+2 Atlantis napisał(a):
    > Mam pytanie do osób w większym stopniu niż ja ogarniających zachowanie
    > kompilatorów języka C. Właściwie chcę się upewnić, że moje rozumowanie
    > jest słuszne.
    >
    > Pisze obecnie pewną bibliotekę, której głównym elementem będzie maszyna
    > stanów. Jednym z jej głównych zadań będzie przetwarzanie i przesyłanie
    > dalej wiadomości wrzucanych do bufora pierścieniowego.
    >
    > Od strony użytkownika będzie to wyglądało w ten sposób, że w dowolnym
    > momencie w programie będzie musiał wywołać funkcję, która będzie
    > wyglądała mniej więcej tak:
    >
    > send(const char* str);
    >
    > Wskaźnik str zostanie zapisany w buforze cykliczny, gdzie będzie czekał
    > do momentu, aż maszyna stanów będzie gotowa go odczytać i przesłać
    > dalej. W przypadku danych zapisywanych w RAM-ie siłą rzeczy trzeba
    > będzie więc zadbać, żeby żyły odpowiednio długo i np. nie znikły ze
    > stosu. Konieczne będzie więc używanie tablic globalnych albo lokalnych
    > statycznych.
    >
    > A co w sytuacji, kiedy będę chciał wysłać po prostu wartość podaną
    > wprost w argumencie funkcji, np.?
    >
    > send("przykladowy tekst");
    >
    > Co w takiej sytuacji zrobi kompilator?
    >
    > 1. Zapisze tekst bezpośrednio we flashu i przekaże funkcji wskaźnik na
    > początek łańcucha zapisanego w pamięci nieulotnej.
    > 2. Przed wywołaniem skopiuje wartość z flasha na stos i przekaże
    > wskaźnik do miejsca w pamięci RAM - po zwinięciu się stosu zawartość
    > może zostać nadpisana.
    > 3. Zachowanie nie jest jasno zdefiniowane i zależy od innych czynników.
    >
    > Oczywiście mówimy o w miarę współczesnym, 32bitowym mikrokontrolerze, z
    > jedną przestrzenią adresową dla flasha/RAM-u.
    >
    > Najbardziej logiczna wydaje mi się opcja pierwsza, ale jak mówię - wolę
    > się upewnić.

    Zawartość będzie zapisana we flashu, a sama zmienna (tablica znaków) w RAMie.
    Podczas initu nastąpi kopiowanie z flashu do RAMu.

    send("przykładowy tekst"); zaś dostanie za argument stałą - adres w RAMie.
    Najprawdopodobniej każde wywołanie send("ten sam tekst"); zajmie taką
    samą porcję flasha i RAMu - ale tu pewności już nie ma...

    W AVR - i pewnie w innych harvardach - jest możliwość zrobienia tak,
    że nie będzie używany RAM - send(PSTR("tekscik z ROMu"));
    a jako argument leci wskaźnik - ale do flasha.
    Ale wtedy w buforze musi być zapisana również informacja, że ten
    akurat wskaźnik jest do flasha.

    Myślę, że ogólnie bardzo utrudniasz sobie życie.

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: