-
Data: 2012-06-21 15:42:02
Temat: Re: AVR gcc .bss .heap i stos
Od: Nijak <b...@b...pl> szukaj wiadomości tego autora
[ pokaż wszystkie 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
- Cewka elektrozaworu
- zapytanie o chip r5f21275nfp
- nie naprawiam więcej telewizorów
- Zrobił TV OLED z TV LCD
- Zasilacz USB na ścianę.
- Gniazdo + wtyk
- Aliexpress zaczął oszukiwać na bezczelnego.
- OpenPnP
- taka skrzynka do kablowki
- e-paper
- 60 mA dużo czy spoko?
- Dziwne zachowanie magistrali adresowej w 8085
- Współczesne mierniki zniekształceń nieliniowych THD audio, produkują jakieś?
- Jaki silikon lub może klej?
- Smar do video
Najnowsze wątki
- 2025-03-08 Środa Wielkopolska => SAP FI/CO Konsultant wewnętrzny <=
- 2025-03-08 Prawo "gminne"
- 2025-03-08 Warszawa => Senior Recruiter <=
- 2025-03-08 Warszawa => Key Account Manager IT <=
- 2025-03-08 Najszybciej ładujące się samochody elektryczne
- 2025-03-07 AION przejety
- 2025-03-07 Warszawa => Data Engineer (Tech Leader) <=
- 2025-03-07 Gliwice => Business Development Manager - Dział Sieci i Bezpieczeńst
- 2025-03-07 Warszawa => System Architect (background deweloperski w Java) <=
- 2025-03-07 Gliwice => Business Development Manager - Network and Network Security
- 2025-03-07 Chiny-Kraków => Senior PHP Symfony Developer <=
- 2025-03-07 Gliwice => IT Expert (Network Systems area) <=
- 2025-03-07 Chiny-Kraków => Backend Developer (Node + Java) <=
- 2025-03-07 Warszawa => Architekt rozwiązań (doświadczenie w obszarze Java, AWS
- 2025-03-07 Warszawa => International Freight Forwarder <=