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