avr-gcc - velikost stacku v nejhorším případě?
Ondrej Stanek
ostan89 na gmail.com
Pondělí Květen 26 21:11:21 CEST 2014
Zdravím konferenci,
programuji pro mikrokontroléry AVR v C (avr-gcc). V programu potřebuji
buffer značné velikosti, čím větší tím lepší. Hledám způsob jakým
zjistit, zda je velikost bufferu ještě bezpečná, tedy zda nehrozí kolize
stacku a sekce .bss.
Tedy abych byl více konkrétní, mám deklarovaný buffer:
static command_t commandBuffer[MAX_COMMAND_COUNT];
který se při kompilaci umístí do .bss sekce.
Při zkompilování mi gcc hlásí, kolik paměti SRAM je využito:
Data: 1067 bytes (52.1% Full)
(.data + .bss + .noinit)
Tedy ještě je alespoň 1kB volný pro stack (Poznámka: heap - dynamicky
alokovanou paměť nevyužívám). No a mě by hrozně moc zajímalo, o kolik
můžu můj buffer ještě zvětšit. Nebo obráceně, jak velikou paměť zabere
stack v nejhorším případě.
Poradíte nějaké metody, jak zjistit (offline nebo za běhu), kam až může
stack narůst v nejhorším případě? Připomínám, že mi jde konkrétně o
embedded aplikaci, MCU ATmega328.
Ještě mi vrtá hlavou jedna související otázka. Hodilo by se mi, aby se
můj commandBuffer umístil úplně na konec sekce .bss. To z toho důvodu,
že kdyby nedejbože náhodou došlo ke kolizi, tak stack začne prvně
přepisovat právě tenhle buffer, a né nějaké jiné důležité proměnné. Jak
na to? Napadlo mě alokovat commandBuffer jako jediný na heapu při
inicializaci, ale tím se mi do binárky přibalí celá malloc mašinerie, a
kód už se pak nevejde do flash paměti mikrokontroléru. Poradíte nějaké
pěkné řešení?
Ondra Staněk
Další informace o konferenci Hw-list