Atmega328P outo jumiutuminen

Onko kukaan törmännyt seuraavanlaiseen ongelmaan tai osaisiko antaa vinkkiä…?

Eli kun tulostelen sarjaporttiin (serial monitor) tulostuksia tarpeeksi kauan, niitä prosessori jumiutuu… Täyttyykö joku muisti vai mistä tälläinen voisi johtua…? Onkohan tähän ongelmaan jotain helppoa ratkaisua olemassa…?

Lähetäs koodinpätkäs tänne. En oikeen usko että se serialista johtuu…

Se koodi on niin sekavaa, että ei kehtais ennen siistimistä lähettää… Mutta ajattelin kysästä jos joku olisi törmännyt tälläiseen ongelmaan ja olisi osannut heittää jotain vinkkiä mistä jumiutuminen voisi johtua… Pitää katsoa jos ei ala selviämään ongelma, että siistisi koodin ja laittaisi sen tänne…

Noh laita nyt vain. en arvostele.

Villi veikkaus tietämättä koodipainajaisista.

Yrität tulostaa miljoona kertaa sekunnissa ja sarjanarun nopeus on 9600. Buffer overrun.

99% sarjaliikenteen ongelmista on ajoitusongelmia. Olikohan tuo jollain AVRFreaksillä siguna tai jossain.

Mutta paheksutaan sitten koodisi joukolla kuntoon. Vinkkejä miten kirjoittaa selvää koodia tulennee kunhan vain saadaan se tänne :slight_smile:

Sarjaportin nopeus on 57600… Ja tulostukset on ajoitettu siten, että tulostettavan nipun välissä on aina vähän väliä ajallisesti noin 5s, kun tulostetaan tulostettavat rivit putkeen (4kpl rivejä)… Ja tämä jumiutuminen tapahtuu aina noin 19:sta nipun kohdalla…

Käytäkkö mitä käyttistä. (freeRTOS / vast)
Tuli mieleen, että varattua muistia ei vapautettas tulostuksen jälkeen. Esim 20. tulostukseen ei saatas enää varattua muistia ja esim jättää koodin jumiin tai menee sekasi esim. kirjoittaa väärälle alueelle.

Mitä tarkoitat tuolla “Tuli mieleen, että varattua muistia ei vapautettas tulostuksen jälkeen.”…? Millaisessa tapauksessa muisti voisi jäädä vapauttamatta ja miten vapautus tapahtuu tulostuksen jälkeen…?

No lähinnä tuossa on kyse, jos käytetään jotain käyttistä esim freeRTOS.
Lähinnä kyse, että käytätkö malloc() ja free() tai vastaavia käskyjä ohjelmassa ja vapautetaanko kaikki varatut alueet.

Ootko koittanut ajaa debuggerilla tota? esim. AVR Dragon tai AVR JTAG ICE mk II. Tuolla näkis suoraan minne se jää odottelemaan.

Koodia näkemättä pahempi mennä sanomaan mitä on vialla.

Ongelma ratkesi viimein… Piti esitellä muuttuja koodin alussa eikä funktion sisällä… En kyllä ymmärrä, että miten se siitä pystyi johtumaan, mutta nyt kuiteskin koodi toimii ilman, että se jumiutuu oudosti… :wink:

Kiitoksia kaikille vinkeistä…

Oliko isokin muuttuja :slight_smile:
Jos joku iso bufferi, niin helposti stack menee yli ja sitte ihmetellään omituisuuksia.

Se oli String muuttuja, mutta en ymmärrä että mitenkä se voi noin paljon vaikuttaa, että onko se esitelty funktion sisällä vaiko koodin alussa…:slight_smile:

Alustikko sen vakiostringiksi vai oliko ns. dynaaminen eli muokkasikko sitä.

Kannattaa melkeen suoraan käyttää esim. “char[64] pText;” tyylistä ja käyttää puhtaana null merkkijonona.

Käytin arduinon omaa String muuttuja, jonka alustin seuraavasti:
String teksti = “”;

Tänne sitten luettiin aina tilanteesta riippuen tekstiä…