Otázka:
Co mohu udělat, když mi dojde paměť Flash nebo SRAM?
Peter Bloomfield
2014-02-15 07:09:33 UTC
view on stackexchange narkive permalink

Podle dokumentace Arduino má ATmega328 32 kB paměti Flash pro bootloader + nahraný náčrt a pouze 2 kB SRAM pro data za běhu. ATmega2560 má o něco více, celkem 256 kB, respektive 8 kB.

V obou případech se tyto limity zdají poměrně malé, zvláště ve srovnání se spotřebitelskými zařízeními podobné velikosti, jako jsou smartphony.

Co můžete udělat, když vám dojde? Např. pokud je váš náčrt příliš velký, nebo potřebujete za běhu zpracovat hodně dat (například řetězců)? Existuje nějaký způsob, jak rozšířit Flash nebo SRAM?

Zkuste použít nějakou optimalizaci proměnných. Některé různé proměnné jsou diskutovány [zde] (http://arduino.stackexchange.com/questions/196/when-to-use-different-variable-types)
Pokud to ještě neuděláte, použijte správné obory pro proměnné, kompilátor pro vás optimalizuje využití paměti RAM, když proměnné nepoužíváte.
Ve skutečnosti můžete použít Teensy 3.2 (se softwarem Teensyduino), který by byl srovnatelný s Arduino. Vzhledem k tomu, že vám dochází RAM / PROGMEM, znamenalo by to, že je také pravděpodobné, že to, co se snažíte udělat, je posunout vaše Arduino. Teensy 3.2 není o tolik dražší. ale má: 32bit, 72MHz (wtf !?) 256KB FLASH a 64KB RAM a 3x UART. Ne více programové paměti jako ATmega2560, ale měla by stačit RAM a zvýšení rychlosti.
čtyři odpovědi:
Peter Bloomfield
2014-02-15 07:09:33 UTC
view on stackexchange narkive permalink

Optimalizace
Nízkoúrovňové programování pro vestavěné systémy se zcela liší od programování pro univerzální zařízení, jako jsou počítače a mobilní telefony. Efektivita (z hlediska rychlosti a prostoru) je mnohem důležitější, protože zdroje jsou vysoce kvalitní. To znamená, že první věcí, kterou musíte udělat, pokud vám dojde místo, je podívat se na to, které části kódu můžete optimalizovat.

Pokud jde o snížení využití programového prostoru (Flash), velikost kódu může být docela obtížné optimalizovat, pokud nemáte zkušenosti, nebo pokud jste více zvyklí na programování pro stolní počítače, které tuto dovednost nepotřebují. Bohužel neexistuje žádný přístup „kouzelná kulka“, který bude fungovat ve všech situacích, i když to pomůže, když vážně zvážíte, co váš náčrt skutečně potřebuje . Pokud funkce není nutná, vyjměte ji.

Někdy je také užitečné zjistit, kde jsou více částí vašeho kódu stejné (nebo velmi podobné). Možná je budete moci zkondenzovat na opakovaně použitelné funkce, které lze volat z více míst. Uvědomte si však, že někdy pokus o opětovné použití příliš kódu ve skutečnosti nakonec způsobí, že bude podrobnější. Je to složitá rovnováha k úderu, která má tendenci přicházet s praxí. Může vám pomoci strávit nějaký čas zkoumáním toho, jak změny kódu ovlivňují výstup kompilátoru.

Optimalizace dat za běhu (SRAM) má tendenci být o něco jednodušší, když jste zvyklí. Velmi častým úskalím pro začínající programátory je používání příliš velkého množství globálních dat. Cokoli deklarované v globálním rozsahu bude existovat po celou dobu životnosti náčrtu, a to není vždy nutné. Pokud se proměnná používá pouze uvnitř jedné funkce a nemusí mezi hovory přetrvávat, udělejte z ní místní proměnnou. Pokud je třeba hodnotu sdílet mezi funkcemi, zvažte, zda ji můžete předat jako parametr, místo aby byla globální. Tímto způsobem použijete SRAM pro tyto proměnné pouze tehdy, když to skutečně potřebujete.

Dalším zabijákem pro použití SRAM je zpracování textu (např. pomocí třídy String ). Obecně řečeno, pokud je to možné, měli byste se vyhnout provádění řetězcových operací. Jsou to obrovská paměťová prasata. Pokud například vydáváte hodně textu do seriálu, použijte místo volání zřetězení řetězců více volání funkce Serial.print () . Pokuste se také pokud možno snížit počet řetězcových literálů v kódu.

Pokud je to možné, vyhněte se také rekurzi. Pokaždé, když se provede rekurzivní volání, posune zásobník o úroveň hlouběji. Refaktorujte své rekurzivní funkce, aby byly místo toho iterativní.

Použít EEPROM
EEPROM se používá k dlouhodobému ukládání věcí, které se mění jen příležitostně. Pokud potřebujete použít velké seznamy nebo vyhledávací tabulky fixních dat, zvažte jejich uložení v EEPROM předem a vytáhněte pouze to, co potřebujete, když je to nutné.

Je zřejmé, že velikost EEPROM je poměrně omezená a rychlost a má omezený počet cyklů zápisu. Není to skvělé řešení omezení dat, ale mohlo by to stačit ke zmírnění zátěže pro Flash nebo SRAM. Je také docela možné použít rozhraní s podobným externím úložištěm, jako je například SD karta.

Rozšíření
Pokud jste vyčerpali všechny ostatní možnosti, může být možné rozšíření. . Rozšíření paměti Flash pro zvětšení programového prostoru bohužel není možné. Je však možné SRAM rozšířit. To znamená, že můžete být schopni refaktorovat svůj náčrt, abyste zmenšili velikost kódu na úkor zvětšení velikosti dat.

Získání více SRAM je ve skutečnosti celkem jednoduché. Jednou z možností je použít jeden nebo více čipů 23K256 . Jsou přístupné prostřednictvím SPI. K jejich použití vám pomůže knihovna SpiRAM . Jen si dejte pozor, aby fungovaly na 3,3 V ne 5V!

Pokud používáte Mega, můžete alternativně získat rozšiřující štíty SRAM z Lagrangian Point nebo Rugged Circuits .

Můžete také ukládat konstantní data do paměti programu, spíše než SRAM, pokud máte problémy s prostorem SRAM a volnou programovou pamětí. Viz [zde] (http://jeelabs.org/2011/05/23/saving-ram-space/) nebo [zde] (http://www.nongnu.org/avr-libc/user-manual/pgmspace .html)
Další skvělou alternativou k EEPROM je karta SD. Zabírá několik IO portů, ale pokud potřebujete velký prostor pro, řekněme mapová data apod., Může být snadné jej vyměnit a upravit pomocí vlastního programu na PC.
Lidé by neměli být vybízeni k použití SPI SRAM nebo rozšíření RAM, pokud jim dochází paměť. To je jen plýtvání penězi. Volba většího MCU by byla levnější. Kromě toho může být výkon velmi špatný. Nejprve byste měli udělat odhad ballpark: pokud je odhadované využití RAM příliš blízko limitu, pak volíte špatnou desku / mikrokontrolér / vývojovou platformu. Jistě, dobré využití (ukládání řetězců v paměti Flash) a optimalizace (nepoužívání některých knihoven) mohou být opravdovými měniči her. V tomto okamžiku však nevidím žádné výhody používání softwarové platformy Arduino.
sachleen
2014-02-15 09:24:15 UTC
view on stackexchange narkive permalink

Když nahrajete svůj kód do svého Arduina, řekněme například Uno, řekne vám, kolik bajtů spotřebuje z dostupných 32 kB. To je, kolik máte flash paměti (myslíte na pevný disk počítače). Když je váš program spuštěný, používá takzvaný SRAM a je jich k dispozici mnohem méně.

Někdy si všimnete, že se váš program chová podivně v bodě, kterého jste se za chvíli ani nedotkli . Může se stát, že vaše poslední změny způsobí, že dojde paměť (SRAM). Zde je několik tipů, jak uvolnit některé SRAM.

Ukládání řetězců do Flash namísto SRAM.

Jednou z nejběžnějších věcí, které jsem viděl, je vyčerpání čipu paměti, protože existuje příliš mnoho dlouhých řetězců.

Při použití řetězců použijte funkci F () , aby byly uloženy ve Flash namísto SRAM, protože toho máte mnohem více k dispozici.

  Serial.println (F ("Tento řetězec bude uložen v paměti flash"));  

Použijte správné datové typy

Bajt můžete uložit přepnutím z int (2 bajty) na bajt (1 bajt). Nepodepsaný bajt vám dá 0-255, takže pokud máte čísla, která nepřesahují 255, uložte bajt!

Jak poznám, že mi dochází paměť?

Obvykle budete pozorovat, jak se váš program chová podivně, a přemýšlíte, co se stalo ... Nezměnili jste nic v kódu poblíž bodu, kde se to pokazilo, tak co dává? Dochází vám paměť.

Existuje několik funkcí, které vám řeknou, kolik máte volné paměti.

Dostupná paměť

Víte, zda je věc `F ()` specifická pro Arduino nebo je v knihovnách AVR? Mohli byste také zmínit `PROGMEM const ...`.
Můžete také použít bitové struktury k dalšímu zmenšení prostoru používaného vašimi proměnnými 5eg, pokud máte co do činění se spoustou logických hodnot).
jfpoilpret
2014-02-15 23:28:24 UTC
view on stackexchange narkive permalink

Kromě toho, co řekli ostatní (s čím plně souhlasím), doporučuji přečíst tento článek o adafruitech o paměti; je dobře napsaný, vysvětluje spoustu věcí o paměti a poskytuje rady, jak jej optimalizovat.

Na konci čtení si myslím, že byste na svou otázku dostali celkem úplnou odpověď.

Abych to shrnul, máte 2 možné cíle optimalizace (podle toho, kde se nacházejí problémy s pamětí):

  • Flash (tj. programová paměť); k tomu můžete:
    • odstranit mrtvý kód (např. jakýkoli kód, který je součástí, ale nepoužívá se) a nepoužívané proměnné (ten také pomáhá se SRAM)
    • vyřadit duplicitní kód
    • úplně odstranit bootloader (pro UNO můžete získat mezi 0,5K a 2 nebo 4K pro ostatní modely Arduino); to má ale některé nevýhody
  • SRAM (tj. zásobník, halda a statická data); k tomu můžete:
    • odstranit nepoužívané proměnné
    • optimalizovat velikost každé proměnné (např. nepoužívat dlouhé -4 bajty - pokud potřebujete pouze int -2 bajty)
    • použijte pro své proměnné správný rozsah (a pokud je to možné, dávejte přednost zásobníku před statickými daty)
    • zmenšete velikost vyrovnávacích pamětí na přísné minimum
    • přesuňte konstantní data do PROGMEM (tj. statická data zůstanou v paměti Flash a nebudou se při spuštění programu kopírovat do SRAM); to platí také pro konstantní řetězce, pro které můžete použít makro F () )
    • vyhnout se dynamické alokaci, pokud to není nezbytně nutné; vyhnete se fragmentované haldě , která se nemusí zmenšit ani po uvolnění paměti

Je také popsán další přístup ke snížení využití SRAM (ale zřídka se používá, protože je při kódování trochu těžký a není příliš efektivní), spočívá v použití EEPROM k ukládání dat vytvořených vaším programem, ale nepoužívá se později, když nastanou nějaké podmínky, kdy lze data načíst zpět z EEPROM .

Odebrání mrtvého kódu - kompilátor je _ opravdu dobrý, když to za vás zvládne - nebude mít žádný rozdíl, pokud máte spoustu kódu, který se nikdy nevolá. Pokud omylem zavoláte kód, který nepotřebujete, pak je to samozřejmě jiné.
David Cary
2014-02-16 03:21:35 UTC
view on stackexchange narkive permalink

Pokud vám dojde místo, je třeba udělat dvě věci:

  • Nějak „optimalizujte“ váš kód, aby potřeboval méně úložiště; nebo alespoň využívá méně konkrétního typu úložiště, které vám došlo (a využívá více druhu úložiště, kterého máte stále dost). Nebo
  • přidat další úložiště.

Existuje spousta online tipů, jak udělat první (a pro většinu věcí, které lidé dělají s Arduinem, vestavěné úložiště je po „optimalizaci“ více než dost.) Zaměřím se tedy na druhou:

Existují 3 věci, které využívají flash nebo SRAM; každý potřebuje trochu jiný přístup k přidávání úložiště:

  • variabilní úložiště: je možné rozšířit SRAM, jak již poukázal sachleen. SRAM, FRAM a NVSRAM jsou vhodné pro rychle se měnící proměnné. (I když v zásadě můžete použít flash k ukládání proměnných, musíte si dělat starosti s opotřebením blesku). SPI (sériový protokol) je nejjednodušší připojit k Arduino. Knihovna SpiRAM pracuje se sériovým čipem SRAM Microchip 23K256. Čip Ramtron FM25W256 sériový FRAM (nyní vlastněný společností Cypress) také používá SPI . Cypress CY14B101 NVSRAM také používá SPI.Etc.

  • konstantní data, která tam musí být i při příštím zapnutí: toto je téměř tak jednoduché jako rozšiřování SRAM. K dispozici je mnoho externích úložných zařízení EEPROM, FRAM, NVSRAM a FLASH . V současné době jsou nejnižší náklady na MB SD flash karty (ke kterým lze přistupovat prostřednictvím SPI). FM25W256 (viz výše), Cypress CY14B101 (viz výše) atd. Mohou také ukládat konstantní data. Mnoho rozšiřujících štítů zahrnuje slot pro SD kartu a několik knihoven a výukových programů podpora čtení a zápisu na (flash) SD karty. (K tomu nemůžeme použít SRAM, protože SRAM na všechno zapomene, když se vypne napájení).

  • spustitelný kód: Rozšíření Flash paměti Arduina pro zvětšení programového prostoru bohužel není možné. Programátor však může vždy refaktorovat skicu, aby zmenšil velikost kódu na úkor zvětšení velikosti dat a jeho pomalého běhu. (Teoreticky byste mohli jít tak daleko, že přeložíte celý svůj náčrt do nějakého interpretovaného jazyka, uložit tuto verzi náčrtu na SD kartu a pak napsat tlumočníka pro tento jazyk, který běží na Arduinu, aby načetl a provedl pokyny z SD karta - Forth on Arduino, BASIC interpreter, a Tom Napier Picaro interpreter, some application-specific language, etc.).



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...