Küsimus:
Mida teha, kui välkmälu või SRAM on otsas?
Peter Bloomfield
2014-02-15 07:09:33 UTC
view on stackexchange narkive permalink

Arduino dokumentatsiooni kohaselt on ATmega328-l 32 kB Flash-mälu alglaadija + üles laaditud visandi jaoks ja ainult 2KB SRAM-i käitusaja andmete jaoks. ATmega2560-l on üsna palju rohkem, kokku vastavalt 256KB ja 8KB.

Mõlemal juhul tunduvad need piirangud üsna väikesed, eriti kui võrrelda neid sarnase suurusega tarbeseadmetega, näiteks nutitelefonidega.

Mida teha, kui otsa saab? Nt kui teie visand on liiga suur või peate töötamise ajal töötlema palju andmeid (näiteks stringe)? Kas on võimalik kuidagi Flashi või SRAM-i laiendada?

Proovige kasutada muutuja optimeerimist. Mõningat erinevat muutujat käsitletakse [siin] (http://arduino.stackexchange.com/questions/196/when-to-use-different-variable-types)
Kui te seda veel ei tee, kasutage muutujate jaoks sobivaid ulatusi, optimeerib kompilaator teie jaoks RAM-i kasutamist, kui muutujaid ei kasutata.
Võite tegelikult kasutada Teensy 3.2 (koos Teensyduino tarkvaraga), mis oleks võrreldav Arduinoga. Arvestades, et RAM / PROGMEM on otsas, tähendaks see ka seda, et olete tõenäoline, et see, mida proovite teha, on teie Arduino surumine. Teensy 3.2 pole nii palju kallim. kuid sellel on: 32bit, 72MHz (wtf !?) 256KB FLASH ja 64KB RAM ja 3x UART. Mitte rohkem programmimälu kui ATmega2560, kuid RAM-i ja kiiruse suurenemisest peaks piisama.
Neli vastused:
#1
+30
Peter Bloomfield
2014-02-15 07:09:33 UTC
view on stackexchange narkive permalink

Optimeerimine
Manustatud süsteemide madala taseme programmeerimine erineb üldotstarbeliste seadmete, näiteks arvutite ja mobiiltelefonide programmeerimisest. Tõhusus (kiiruse ja ruumi osas) on palju olulisem, kuna ressursid on ülimalt tasemel. See tähendab, et kui ruumi otsa saab, on kõige esimene asi, mida teha, kui vaadata, milliseid koodi osi saate optimeerida.

Programmiruumi (Flash) kasutamise vähendamise osas saab koodi suurust muuta üsna keeruline optimeerida, kui olete kogenematu või kui olete rohkem harjunud programmeerima lauaarvuteid, mis ei vaja seda oskust. Kahjuks puudub võluväel põhinev lähenemisviis, mis toimiks kõikides olukordades, ehkki see aitab, kui kaalute tõsiselt, mida teie visand tegelikult vajab peab olema. Kui funktsiooni pole vaja, võtke see välja.

Mõnikord on kasulik ka tuvastada, kus teie koodi mitu osa on ühesugused (või väga sarnased). Võimalik, et suudate need koondada korduvkasutatavateks funktsioonideks, mida saab helistada mitmest kohast. Kuid pidage meeles, et mõnikord üritab kood liiga korduvkasutatavaks muuta tegelikult selle ka rohkem verbusseks. See on keeruline tasakaal saavutada, mis kipub harjutama. Abi võib olla sellest, kui veedate mõnda aega, uurides, kuidas koodimuudatused kompilaatori väljundit mõjutavad.

Käitusaja andmete (SRAM) optimeerimine kipub olema natuke lihtsam, kui olete sellega harjunud. Algajate programmeerijate jaoks on väga levinud lõks liiga palju globaalseid andmeid. Kõik, mis on deklareeritud ülemaailmses ulatuses, eksisteerib visandi kogu eluea jooksul ja see pole alati vajalik. Kui muutujat kasutatakse ainult ühe funktsiooni sees ja see ei pea kõnede vahel püsima, siis muutke see lokaalseks muutujaks. Kui väärtust tuleb funktsioonide vahel jagada, kaaluge, kas saate selle globaalseks muutmise asemel parameetrina edastada. Nii kasutate SRAM-i nende muutujate jaoks ainult siis, kui seda tegelikult vajate.

Teine tapja SRAM-i kasutamiseks on tekstitöötlus (nt klassi String kasutamine). Üldiselt peaksite võimaluse korral vältima stringide toiminguid. Nad on massilised mälupulgad. Näiteks kui väljastate palju teksti jadamisse, kasutage stringide liitmise asemel mitu koodi Serial.print () . Samuti proovige võimaluse korral vähendada stringi literaalide arvu oma koodis.

Samuti vältige võimalusel rekursiooni. Iga kord, kui tehakse rekursiivne kõne, viib see virna taseme võrra sügavamale. Refaktoreerige oma rekursiivsed funktsioonid iteratiivseks.

Kasuta EEPROM
EEPROM-i kasutatakse ainult aeg-ajalt muutuvate asjade pikaajaliseks salvestamiseks. Kui peate kasutama fikseeritud andmete suuri loendeid või otsingu tabeleid, kaaluge nende salvestamist eelnevalt EEPROM-i ja vajaduse korral ainult vajaliku välja tõmbamist.

Ilmselt on EEPROM-i suurus üsna piiratud ja kiirus ja sellel on piiratud arv kirjutamistsükleid. See ei ole suurepärane lahendus andmete piirangutele, kuid see võib olla piisav Flashi või SRAM-i koormuse leevendamiseks. Samuti on täiesti võimalik liidestada sarnase välise salvestusruumiga, näiteks SD-kaardiga.

Laiendamine
Kui olete kõik muud võimalused ammendanud, võib laiendamine olla võimalus . Kahjuks pole Flash-mälu laiendamine programmiruumi suurendamiseks võimalik. SRAM-i on siiski võimalik laiendada. See tähendab, et saate võib-olla oma visandi ümber kujundada, et vähendada koodimahtu andmete suuruse arvelt.

SRAM-i hankimine on tegelikult üsna lihtne. Üks võimalus on kasutada ühte või mitut kiipi 23K256 . Neile pääseb juurde SPI kaudu ja nende kasutamiseks on olemas SpiRAM-i teek . Lihtsalt olge ettevaatlik, et need töötavad 3,3 V mitte 5 V pingega!

Kui kasutate Megat, võite alternatiivina hankida SRAM-i laienduskilbid Lagrangian Point või Rugged Circuits .

Kui teil on SRAM-i ruumiprobleeme ja vaba programmimälu, saate ka püsimälu andmeid salvestada programmi mällu, mitte SRAM-i. Vaadake [siin] (http://jeelabs.org/2011/05/23/saving-ram-space/) või [siin] (http://www.nongnu.org/avr-libc/user-manual/pgmspace .html)
Teine suurepärane alternatiiv EEPROM-ile on SD-kaart. See võtab küll mõned IO-pordid, kuid kui vajate näiteks suurt tükki ruumi, näiteks kaardiandmete või muu sarnase jaoks, on seda lihtne arvutis kohandatud programmiga välja vahetada ja redigeerida.
Inimesi ei tohiks julgustada kasutama SPI SRAM-e või RAM-i laiendusi, kui nende mälu on otsakorral. See on lihtsalt raha raiskamine. Suurema MCU valimine oleks odavam. Kõrval võib esinemine olla väga kehv. Kõigepealt tuleks teha hinnang pallile: kui hinnanguline RAM-i kasutus on piirile liiga lähedal, siis valite vale plaadi / mikrokontrolleri / arendusplatvormi. Muidugi, hea kasutamine (stringide salvestamine välkmälus) ja optimeerimine (vältides mõnede teekide kasutamist) võivad olla tõelised mängude vahetajad. Siinkohal ei näe ma Arduino tarkvaraplatvormi kasutamisest mingeid eeliseid.
#2
+25
sachleen
2014-02-15 09:24:15 UTC
view on stackexchange narkive permalink

Kui laadite koodi oma Arduinosse, öelge näiteks Uno, see ütleb teile, mitu baiti see 32K-st ära kasutab. Nii palju teil on välkmälu (mõelge arvuti kõvakettale). Kui teie programm töötab, kasutab see seda, mida nimetatakse SRAMiks, ja seda on palju vähem saadaval.

Mõnikord märkate, et teie programm käitub veidralt punktis, mida te pole mõnda aega isegi puudutanud. . Võib juhtuda, et teie viimaste muudatuste tõttu saab mälu otsa (SRAM). Siin on mõned näpunäited SRAM-i vabastamiseks.

Stringide hoidmine SRAM-i asemel Flashis.

Üks levinumaid asju, mida olen näinud, on kiibi otsa saamine. mälu, kuna pikki stringe on liiga palju.

Stringide kasutamisel kasutage funktsiooni F () , et need salvestataks SRAM-i asemel Flashis, kuna teil on seda palju rohkem saadaval.

  Serial.println (F ("See string salvestatakse välkmällu"));  

Kasutage õigeid andmetüüpe

Baidi saate salvestada, vahetades int (2 baiti) byte (1 baiti). Allkirjastamata bait annab teile 0–255, nii et kui teil on numbreid, mis ei ületa 255, salvestage bait!

Kuidas ma tean, et mul on mälu otsas?

Tavaliselt jälgite oma programmi imelikku käitumist ja mõtlete, mis valesti läks ... Te ei muutnud koodis midagi selle punkti lähedal, kus see sassi läheb, mis siis annab? Mälu on otsas.

Teil on paar funktsiooni, mis annavad teada, kui palju vaba mälu teil on.

Saadaolev mälu

Kas teate, kas asi "F ()" on Arduino spetsiifiline funktsioon või on see AVR-i teekides? Võite kaaluda ka programmi "PROGMEM const ..." mainimist.
Samuti võite kasutada bitistruktuure, et veelgi vähendada muutujate 5eg kasutatavat ruumi, kui tegelete paljude booleanidega).
#3
+17
jfpoilpret
2014-02-15 23:28:24 UTC
view on stackexchange narkive permalink

Lisaks teiste öeldutele (milles olen täielikult nõus) soovitan lugeda seda adafruit-artiklit mälu kohta; see on hästi kirjutatud, selgitab palju asju mälu kohta ja annab näpunäiteid selle optimeerimiseks.

Lugemise lõpus arvan, et saaksite oma küsimusele üsna täieliku vastuse.

Kokkuvõtteks on teil 2 võimalikku optimeerimise sihtmärki (olenevalt mäluprobleemide asukohast):

  • Flash (st programmimälu); selleks saate:
    • eemaldada surnud koodi (nt mis tahes koodi, mis on lisatud, kuid mida ei kasutata) ja kasutamata muutujaid (see aitab ka SRAM-i puhul)
    • dubleeritud koodi välja arvutada
    • eemaldage alglaadur täielikult (võite saada vahemikku 0,5K UNO puhul ja 2 või 4K teiste Arduino mudelite puhul); sellel on siiski mõned varjuküljed
  • SRAM (st virna-, kuhja- ja staatilised andmed); selleks saate:
    • eemaldada kasutamata muutujad
    • optimeerida iga muutuja suurust (nt ärge kasutage pikki -4 baiti- kui vajate ainult int-2-baiti)
    • kasutage oma muutujate jaoks õiget ulatust (ja kui võimalik, eelistage virna staatilistele andmetele)
    • vähendage puhvrite suurust rangelt miinimumini
    • teisaldage konstantsed andmed kausta PROGMEM (st staatilised andmed jäävad Flash-mällu ja neid ei kopeerita programmi käivitamisel SRAM-i); see kehtib ka konstantsete stringide kohta, mille jaoks saate kasutada F () makro)
    • vältige dünaamilist jaotust, kui see pole tingimata vajalik; väldite killustatud hunnikut , mis ei pruugi kahaneda isegi pärast mälu vabastamist

Kirjeldatakse ka täiendavat lähenemisviisi SRAM-i kasutamise vähendamiseks (kuid kasutatakse harva, kuna see on kodeerimisel natuke raske ja pole eriti efektiivne), see seisneb EEPROM-i kasutamises teie programmi loodud andmete salvestamiseks, kuid seda kasutatakse alles hiljem, kui ilmnevad mõned tingimused, kui andmeid saab EEPROM-ist tagasi laadida .

Surnud koodi eemaldamine - kompilaator on selle jaoks teie jaoks _hästi _ hea - see ei muuda midagi, kui teil on palju koode, mida pole kunagi kutsutud. Kui helistate kogemata koodile, mida te ei vaja, on see muidugi erinev.
#4
+9
David Cary
2014-02-16 03:21:35 UTC
view on stackexchange narkive permalink

Kui salvestusruum otsa saab, peate tegema kahte asja:

  • Kuidagi "optimeerige" oma koodi, nii et see vajab vähem salvestusruumi; või kasutab vähemalt vähem seda tüüpi salvestusruumi, mis teil otsa sai (ja kasutab rohkem sellist tüüpi salvestusruumi, mida teil on veel palju). Või
  • lisage rohkem salvestusruumi.

Veebis on palju näpunäiteid, kuidas esimest korda teha (ja valdava enamiku asjade jaoks, mida inimesed teevad Arduinoga, sisseehitatud salvestusruum on pärast "optimeerimist" enam kui piisav). Seega keskendun teisele:

Flash-i või SRAM-i kasutab 3 asja; igaüks vajab salvestamise lisamiseks veidi erinevat lähenemist:

  • muutuv salvestusruum: SRAM-i on võimalik laiendada, nagu sachleen on juba märkinud. SRAM, FRAM ja NVSRAM sobivad kõik kiiresti muutuvate muutujate jaoks. (Kui põhimõtteliselt võiksite muutujate salvestamiseks kasutada välku, peate muretsema välgu kulumise pärast). SPI-d (jadaprotokoll) on kõige lihtsam ühendada Arduino. SpiRAM-i teek töötab koos Microchip 23K256 jada SRAM-kiibiga. Kiip Ramtron FM25W256 jada FRAM (nüüd Cypressile kuuluv) kasutab ka SPI-d . Cypress CY14B101 NVSRAM kasutab ka rakendust SPI.Etc.

  • pidevad andmed, mis peavad järgmisel voolu sisselülitamisel ikka olemas olema: see on peaaegu sama lihtne kui SRAMi laiendamine. Saadaval on palju väliseid salvestusseadmeid EEPROM, FRAM, NVSRAM ja FLASH . Praegu on madalaim MB-i hind SD-välkmälukaardid (millele pääseb juurde SPI kaudu). FM25W256 (vt eespool), Cypress CY14B101 (vt ülalt) jms suudavad salvestada ka püsivaid andmeid. Paljud laienduskilbid sisaldavad SD-kaardi pesa ning mitut teeki ja õpetust toetage SD-kaartidele (flash-mälukaartidele) lugemist ja kirjutamist. (Me ei saa selleks SRAM-i kasutada, kuna SRAM unustab kõik, kui toide kustub).

  • käivitatav kood: kahjuks pole Arduino Flash-mälu laiendamine programmi ruumi suurendamiseks võimalik. Programmeerija saab aga alati visandi ümber kujundada, et koodimahtu vähendada andmete suuruse suurendamise ja selle aeglasema töötamise arvelt. (Teoreetiliselt võiksite minna nii kaugele, et tõlgite kogu oma visandi mõnesse tõlgitud keelde, salvestage selle visandi versiooni SD-kaardile ja seejärel kirjutage Arduinos töötavale keelele tõlk, et hankida ja täita juhiseid SD-kaart - teine ​​Arduinol, BASIC-tõlk, Tom Napier Picaro tõlk, mõni rakenduspõhine keel jne).



See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...