Kysymys:
Kuinka löytää muistin ylivuotovirheet Arduino C -koodista?
powtac
2013-04-10 03:15:27 UTC
view on stackexchange narkive permalink

Minulla oli useita kertoja Serial Monitorissa epäilyttäviä tuloksia lähettäessäni koodia Arduinoon: kuten tyhjien tilojen ikuinen ulostulo tai yhtäkkiä katkaistut merkkijonot tai sekoitetut merkkijonot.

Koska Arduino IDE: ssä ei ollut kääntövirheitä tai varoituksia, luulin Arduino olevan rikki, mutta joidenkin testien jälkeen huomasin, että Arduino IDE-kääntäjä ei tartu kaikenlaisiin virheisiin - varsinkin muuttujia määritettäessä taulukkorakenteiden silmukassa. Tämä näyttää kaatavan Arduinon lyhyessä ajassa.

Kuinka löydän virheet, joita Arduino IDE ei näytä?

Kolme vastused:
Robert
2013-04-10 06:48:26 UTC
view on stackexchange narkive permalink

MemoryFree-kirjasto voi auttaa sinua löytämään muistin käyttöön liittyviä riskejä.

Esimerkki :

  #include <MemoryFree.h> // Arduino Duemilanove -palvelussa ATmega328: //// Ilmoitettu vapaa muisti, str kommentoitu: // 1824 tavua // // Ilmoitettu vapaa muisti, jossa str ja Serial.println (str) ei kommentoitu: // 1810 //// Ero: 14 tavua (13 ascii-merkkiä + tyhjä terminaattori) // 14-tavun merkkijono // char str [] = "Hei , maailma! "; void setup () {Serial.begin (115200);} void loop () {//Serial.println(str); Sarja.tulos ("freeMemory () ="); Serial.println (freeMemory ()); delay (1000);}  

En ole varma, onko MemoryFree pinoosoitin. Jos pinon osoittimesi törmää kasan osoittimeen, voit kokea segmentointivirheitä

JamesC4S
2013-04-11 08:32:19 UTC
view on stackexchange narkive permalink

Yleisin syy RAM-muistin sammumiseen on String-objektin käyttö tai paljon vakiomerkkijärjestelmiä (c-tyylinen merkkijono).

Forutantly IDE 1.0.4 sisältää korjauksen mallociin, joka on vaivannut String-objekti hyvin kauan.

Vähentää vakiomerkkijonojen tuhlaamaa RAM-muistia:

  Serial.print ("Hello World"); // Tämä kuluttaa RAM-muistia!  

Voit käyttää F () -makroa. Tämä makro pakottaa merkkijonon pysymään PROGMEM: ssä. Kun taulukkoa käytetään, vain yksi tavu muistia kuluu.

  Sarja.tulostus (F ("Hello World")); // Säilyttää merkkitaulukon PROGMEMissä  

Muista, että PROGMEMiin tallennettuja merkkijonoja ei voi muuttaa ajon aikana.

Etsinnän suhteen ilman virheenkorjainta tai muistiohjaimella, sinun on käytettävä vanhanaikaisia ​​etsintätekniikoita löytääkseen ongelmat.

Kiitos hyödyllisestä vastauksesta! Ei todellakaan ole IDE-tuen muistivirheenkorjainta?
Tämä on vanha kysymys, mutta kyllä, * atmel ATmega * MCU: illa on asianmukaiset virheenkorjaajat. * Arduinosille * ei ole virheenkorjaajia, koska arduino-työkaluketju ja "IDE" ovat pohjimmiltaan lelu.
Itse asiassa vihje F: llä () säästää meille satoja tavuja RAM-muistissa!
Saan käännösvirheen käytettäessä F () -merkkiä merkkijonoilla, jotka sisältävät `` // ''.:-(
Saan tämän kääntövirheen Arduino 1.5.7: ssä ...
Manishearth
2013-04-10 06:00:30 UTC
view on stackexchange narkive permalink

Näyttää siltä, ​​että puhut ajonaikaisista virheistä (muistivuodot / segfault-tyyppiset) täällä.

Tällaisia ​​virheitä ei ole mitään tapaa löytää (ellet kampaa koodia huolellisesti läpi) koodissa, joka on jo kirjoitettu. On kuitenkin melko helppoa estää näitä tapahtumasta, kun kirjoitat koodia. Ole vain varovainen, kun kirjoitat silmukoita tai rekursiivisia puheluita; kysy itseltäsi "voisiko tämä päästä käsistä?". Jos näyttää siltä, ​​että sillä on tilaa "päästä käsistä", kirjoita koodi suojaamaan sitä.

Tietoja häiriöistä - tarkista vain taulukkoindeksien raja-arvot ja sinun pitäisi olla kunnossa . Jos käytät osoittimia, ole varovainen osoittimen aritmeettisen suhteen.

Voisitteko kertoa tarkemmin "häiriöistä".Kun googlen sitä, se näyttää olevan virhe, joka tapahtuu käännettäessä, ei koodia suoritettaessa ... Ja miten "tarkistan matriisimerkkien raja-arvot"?Kierrän indeksini ympärille `i = (i + 1)% array_size`.Tällä tavoin indeksini pitäisi olla kunnossa, eikö?


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...