-
Data: 2022-08-26 16:40:45
Temat: Re: C - łańcuchy tekstowe definiowane w parametrach funkcji
Od: Dawid Rutkowski <d...@w...pl> szukaj wiadomości tego autora
[ pokaż wszystkie 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.
Następne wpisy z tego wątku
- 26.08.22 20:25 Atlantis
- 26.08.22 21:50 Janusz
- 26.08.22 22:19 Dawid Rutkowski
- 26.08.22 22:34 Grzegorz Niemirowski
- 27.08.22 06:27 JDX
- 27.08.22 06:41 J.F
- 27.08.22 08:10 Atlantis
- 27.08.22 10:28 Dawid Rutkowski
- 27.08.22 11:34 Marek
- 27.08.22 11:53 JDX
- 27.08.22 12:59 Atlantis
- 27.08.22 15:59 Dawid Rutkowski
- 27.08.22 16:06 Dawid Rutkowski
- 27.08.22 16:53 J.F
- 27.08.22 20:30 a...@m...uni.wroc.pl
Najnowsze wątki z tej grupy
- Taśma LED
- Jak odróżnić myjki wibrujące od ultradźwiękowych.
- Ledy na wyłączniku czasowym błyskają
- Re: Kompensacja mocy biernej przy 230VAC
- Re: Kompensacja mocy biernej przy 230VAC
- RCD wybija
- Re: Kompensacja mocy biernej przy 230VAC
- Łożysko ślizgowe - jaki olej
- Re: Kompensacja mocy biernej przy 230VAC
- Re: Kompensacja mocy biernej przy 230VAC
- Współczesny falomierz
- Zasilacz 7V na szynę DIN
- Waga z legalizacją
- Wietnam wykłada 500M$ i chce zbudować fabrykę za 50G$
- Pendrive zdycha, czy coś jeszcze innego? Problem z plikami.
Najnowsze wątki
- 2025-04-05 Dziwny wymiar wyroku
- 2025-04-05 Prunt z dachu
- 2025-04-05 Taśma LED
- 2025-04-05 Kraków => MS Dynamics 365BC/NAV Developer <=
- 2025-04-05 Warszawa => Strategic Account Manager <=
- 2025-04-05 co w Anglii dziś w Polsce za 30 lat
- 2025-04-05 Wrocław => SOC Tech Lead <=
- 2025-04-05 Gdynia => Przedstawiciel handlowy / KAM (branża TSL) <=
- 2025-04-05 Wyrok dożywocia dla Polki
- 2025-04-04 Prezydium Sejmu Tuskiego orzekło: Poseł KO mecenas Roman Giertych NIE jest mordercą (w żadnym sensie tego słowa?)
- 2025-04-04 Reset komóry
- 2025-04-04 Lublin => JavaScript / Node / Fullstack Developer <=
- 2025-04-04 Zielonka => Key Account Manager IT <=
- 2025-04-04 Warszawa => Ekspert IT (obszar systemów sieciowych) <=
- 2025-04-04 Warszawa => Mid/Senior IT Recruiter <=