avr-gcc - velikost stacku v nejhorším případě?
Miroslav Mraz
mraz na seznam.cz
Úterý Květen 27 19:28:52 CEST 2014
Nevím jestli pěkné, ale snad funkční.
1. Pokud upravíte linker skript tím, že za .bss* si přidáte vlastní
sekci .xxx, pak použijete gcc atribut.
2. V linker skriptu je definován symbol __bss_end, čehož lze využít.
typedef int command; // např.
#define BUFLEN 10
command cmd1Buf[BUFLEN]__attribute__((section(".xxx")));
// V linker skriptu
extern command __bss_end;
command* const cmd2Buf = &__bss_end;
int main(void) {
cmd1Buf[0] = 1;
cmd2Buf[0] = 2;
// ...
}
V druhém případě sice nemusíte hrabat do linker skriptu, ale pak to
vypadá poněkud neprůhledně - není nikde vidět, jak je bufer veliký. Je
to prostě jedna zóna, kolidující se zásobníkem. Ale to jste chtěl.
Mrazík
Ondrej Stanek píše v Po 26. 05. 2014 v 21:11 +0200:
> 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