Dynamický vznik globálních proměnných v SRAM

Ahoj

Řeším takový problém. Dělám aplikaci, která bude náročná na RAM paměť (AT MEGA32) a proto s ní chci co nejvíce šetřit. V určité části programu potřebuji, aby ke stejným proměnným uloženým v RAM přistupovalo více funkcí (těch proměnných je docela dost).

Nejjednoduší by bylo definovat ty proměnné globálně, tím se na ně dostanu pohodlně z kterékoliv funkce, ale zase mi tam budou “smrdět” i když už je nebudu potřebovat (budou potřeba pouze v určitých specifických případech), takže to se mi zrovna moc nehodí…

Jak z toho tedy ven ?

  • Předávat si mez funkcemi ukazatele na proměnné ? (nevím, jestli mi to problém vyřeší? - tj. z main zavolám funkci func_1, ta vytvoří proměnné + jejich ukazatele, bude volat další funkce, ty si mezi sebou budou přehazovat jen ukazatele a měnit obsah jednou definovaných proměných (ve func_1) až se udělá to co má a funkce func_1 se opustí zpět do main, tím i všechny proměnné, které func_1 vytvořila zmizí, tj. RAM se opět uvolní ?)

nebo

  • Existuje nějaká metoda, kdy si lze jen v určitých případech definovat globální proměnné a jakmile tyto pominou, tak paměť zase uvolnit ?

Děkuji za rady
P.S. možná to s tou RAM nebude tak horké, ale určitě se taková znalost může hodit :slight_smile:

A proč ti vadí, že tam budou “smrdět”? Jestli se ti vejdou do paměti, ať tam klidně jsou. Když je vytvoříš ve funkci, tak ta proměnná má místo v zásobníku přiděleném té funkci. Po ukončení funkce proměnná přestává existovat. Tedy data v paměti na té konkrétní adrese stále zústávají, ale můžou být kdykoli přepsané. Pokud ovšem není definovaná jako static, ta je dostupná stále, ale jen z té funkce nebo pomocí ukazatele.

Děkuji za odpověď, tak to mi to stačí

Jinak jde o řízení radiové stanice na přenos dat. Data se budou přenášet v paketech (jejich velikost ještě nemám vymyšlenou, ale pravděpodobně do 300 Bajtů). Nad celým paktem ještě budu provádět nějaký typ kódování případně šifrování + chcek sum. Navíc budu možná držet jeden starší paket v paměti, zatímco se bude zpracovávat nový pro případ, že se radiový přenos nezdaří a přijímač si požádá o opakované poslání paketu. Je možné, že během těchto mezikroků před samotným odesláním budu mít velkou spotřebu RAM. To co se chystám měnit výše popsaným způsobem jsou pouze registry k nastavení celého zařízení a to se bude řešit pouze tehdy, když uživatel vejde v menu do položky “nastavení”. Poté se proměnné přelijou do EEPROM a už dále nebudou potřeba :slight_smile:

Myslím, že jsi to řešil zcela zbytečně.
Do 2K paměti se ti to všechno bez problémů vleze
(tedy pokud nebudeš zbytečně plýtvat).

V C sú samozrejme na dynamickú alokáciu pamäte nástroje

tutorialspoint.com/c_standar … malloc.htm

en.wikipedia.org/wiki/C_dynamic_ … allocation

inak odporúčam vždy ísť na spoločné premenné cez funkciu, teda zapúzdriť ich. napríklad takto:

uint8_t fn_ram(uint8_t prikaz, uint16_t pocet, uint16_t index, uint8_t *p_data)
{
//…
}