-
Path: news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: Nijak <b...@b...pl>
Newsgroups: pl.misc.elektronika
Subject: Re: AVR gcc .bss .heap i stos
Followup-To: pl.misc.elektronika
Date: Thu, 21 Jun 2012 15:42:02 +0200
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 70
Message-ID: <jrv8c3$d7r$1@inews.gazeta.pl>
References: <jrugou$75s$1@node2.news.atman.pl>
NNTP-Posting-Host: 217.153.153.214
Mime-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8Bit
X-Trace: inews.gazeta.pl 1340286147 13563 217.153.153.214 (21 Jun 2012 13:42:27 GMT)
X-Complaints-To: u...@a...pl
NNTP-Posting-Date: Thu, 21 Jun 2012 13:42:27 +0000 (UTC)
X-User: cepu69
User-Agent: KNode/4.4.10
Xref: news-archive.icm.edu.pl pl.misc.elektronika:633212
[ ukryj nagłówki ]Profesor wrote:
> Czy jakieś nieświadome użycie, zadeklarowanie zmiennej lokalnej np. float
> w funkcji może prowadzić do używania obszaru poniżej stosu i powyżej .bss
> czyli heap?
1. Przydzielenie jakiegos obszaru pamięci na stos nie oznacza iż
przekroczenia jego rozmiaru nie nastapi (chyba, że w prologu wywoływanej
funkcji jest kontrolowana granica stosu).
2. Typowa sytuacja dla embedded : wywoływanie funkcji rekurencyjnie
szybko spowoduje przekroczenie stosu. Alokowanie agregatów na stosie, np.
tablic lub głebokie drzewo wywołań funkcji (odkładanie kontekstu na stosie)
spowoduje przekroczenie stosu.
3. Kompilator sie nie myli. Wszystkie zmienne statyczne znajdą sie w
odpowienich sekcjach tj. .bbs lub .data a automatyczne na stosie. Przyczyna
opisywanego powyżej stanu rzeczy jest zwykle przekroczenie stosu (patrz
punkt 2), "urwany" wskażnik itp.
(...)
> No ale stos mi nachodzi czasem na zmienne. Jak zmniejszę bufor[512] o
> kilkadziesiąt to się uspokaja.
Nie wiem jak w Twoim przypadku ale widziałem taka implementacje :
adres stosu był przypisany w skrypcie lnikera do końca pamięci i obszar
między końsem bss-ów a końcem RAM był stosem. I tu nastepował wielkie
ździwienie iz program sie wywraca a po zmniejszeniu jakis tablic działa.
Przecież mniejszy rozmiar na dane to wiekszy stos.
> Co można zrobić ?
Oszacować niezbedny rozmiar stosu, np. tak (przykład dla
architektury ARM) :
// A minimal, optimized stack frame, rounded up - no autos
#define CYGNUM_HAL_STACK_FRAME_SIZE (4 * 20)
// Stack needed for a context switch: this is implicit in the estimate for
// interrupts so not explicitly used below:
#define CYGNUM_HAL_STACK_CONTEXT_SIZE (4 * 20)
// Interrupt + call to ISR, interrupt_end() and the DSR
#define CYGNUM_HAL_STACK_INTERRUPT_SIZE \
((4 * 20) + 2 * CYGNUM_HAL_STACK_FRAME_SIZE)
// Space for the maximum number of nested interrupts, plus room to call
functions
#define CYGNUM_HAL_MAX_INTERRUPT_NESTING 4
#define CYGNUM_HAL_STACK_SIZE_MINIMUM \
(CYGNUM_HAL_MAX_INTERRUPT_NESTING * CYGNUM_HAL_STACK_INTERRUPT_SIZE
+ \
2 * CYGNUM_HAL_STACK_FRAME_SIZE)
#define CYGNUM_HAL_STACK_SIZE_TYPICAL \
(CYGNUM_HAL_STACK_SIZE_MINIMUM + \
16 * CYGNUM_HAL_STACK_FRAME_SIZE)
> Skąd wiadomo czy heap jest używany?
Należy expicite wywołać funkcje typu *alloc() lub impicite
przez uzycie bibliteki wymagającej dynamicznej alokacji pamięci.
> I co się dzieje w tym obszarze?
Alokator rezerwuje porcje pamięci i zwraca wskaźnik do niej.
> Wstawiam pułapki w różne miejsca kodu i czytam ile wynosi aktualnie SP i
nie ma siły, nie spotykają się. A jednak się kwasi.
Nie tak. Stos oraz obszar ponizej (jesli nic tam nie ma) nalezy zainicjować
wzorcem typu 0xaa55aa55 a nastepnie sprawdzić czy rzeczony wzorzec nie
został całkowicie zamazany zmiennymi - podczas normalnej pracy odkładane
zmienne NIGDY nie powinny przekroczyc dolnej granicy stosu.
Następne wpisy z tego wątku
- 21.06.12 16:05 Profesor
- 21.06.12 18:24 Nijak
- 22.06.12 02:06 Michoo
- 22.06.12 17:33 J.F
- 22.06.12 17:42 Profesor
Najnowsze wątki z tej grupy
- Ściąganie hasła frezem
- Koszyk okrągły, walec 3x AA, na duże paluszki R6
- Brak bolca ochronnego ładowarki oznacza pożar
- AMS spalony szybkim zasilaczem USB
- stalowe bezpieczniki
- Wyświtlacz ramki cyfrowej
- bateria na żądanie
- pradnica krokowa
- Nieustający podziw...
- Coś dusi.
- akumulator napięcie 12.0v
- Podłączenie DMA 8257 do 8085
- pozew za naprawę sprzętu na youtube
- gasik
- Zbieranie danych przez www
Najnowsze wątki
- 2025-01-31 Lublin => Programista Delphi <=
- 2025-01-31 Łódź => Programista NodeJS <=
- 2025-01-31 Wrocław => Senior SAP Support Consultant (SD) <=
- 2025-01-31 Warszawa => Full Stack web developer (obszar .Net Core, Angular6+) <=
- 2025-01-31 Gdańsk => iOS Developer (Swift experience) <=
- 2025-01-31 Kraków => UX Designer <=
- 2025-01-31 Warszawa => Data Engineer (Tech Leader) <=
- 2025-01-31 Gliwice => Business Development Manager - Dział Sieci i Bezpieczeńst
- 2025-01-31 Gliwice => Business Development Manager - Network and Network Security
- 2025-01-31 Warszawa => Architekt rozwiązań (doświadczenie w obszarze Java, AWS
- 2025-01-31 Warszawa => Full Stack .Net Engineer <=
- 2025-01-31 Warszawa => Programista Full Stack (.Net Core) <=
- 2025-01-31 Gdańsk => Programista Full Stack .Net <=
- 2025-01-31 Bieruń => Team Lead / Tribe Lead FrontEnd <=
- 2025-01-31 Błonie => Administrator systemów <=