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