Nyt koodi, jonka kirjoitan Arduinossa (Arduinoa käyttäen), käyttää useita 2-ulotteisia taulukoita. Tulostan jotakin asiaa Serial Monitorilla, se tulostaa sen oikein, mutta kun ilmoitan ja alustan kaksiulotteisen taulukon, se ei tulosta sitä.
Koodi:
void setup() { Serial.begin(9600); int image_width = 56; int image_height = 96; int image_result[image_width][image_height]; for (int i=0; i<image_height; i++) { for (int j=0; j<image_width; j++) { image_result[j][i] = 5; } } Serial.print("code works"); }
Nyt tässä tapauksessa” koodi toimii ”ei tulosta, mutta kun poistan taulukon ilmoituksen ja alustuskoodi toimii, se tulostetaan. Mikä ongelma on?
Toimivatko 2-ulotteiset taulukot eri tavalla Arduinossa vai onko se avaruusongelma?
Kommentit
- Jopa yksiulotteinen 5376 tavun matriisi 2048 tavun prosessorilla epäonnistuu.
- Tarkoitin 10752 tavua. Unohdin, että jokainen matriisikohta on 2 tavua. Muista, että sinulla ei edes ole kaikkia näitä 2048 tavua käytettävissä. Pelkästään sarjaliikenne- ja vastaanottopuskurit kuluttavat 128 tavua.
- No, jos liitän mikro-SD-auton, onko olemassa jotain tapaa ilmoittaa matriisi kyseiseen muistiin?
- Voit liittää SD-kortti ja kirjoita tietoja sydämesi ’ sisältöön. Voit kuitenkin ’ t ” ilmoittaa taulukon muistissa ”. Mikä on hakemuksesi täällä? Arduino, jolla on 2 kt RAM-muistia, ei ole paras asia kuvankäsittelyssä.
- Minun täytyy lukea pieni BMP-tiedosto Arduinon joukossa hahmoja. ja täytyy tehdä siinä jonkin verran käsittelyä. Ja tiedostokoko on 56 x 96 pikseliä.
Vastaus
2D-taulukot toimivat hyvin arduinossa, mutta sinä tila loppuu hyvin nopeasti.
Unolla on 2 kilotavua ram; matriisissasi on 56 * 96 = 5376 2-tavuisia elementtejä.
Oletan, että kirjoitat kriittisen muistiarvon yli 5: llä jossain vaiheessa aiheuttaen ohjelman epäonnistumisen.
Kommentit
- Ei vain muistissa, mutta todennäköisesti myös kaikissa I / O-rekistereissä.
- 16-bittinen osoite, SRAM alkaen 256. Joten ’ s 65279 tavua osoitetilaa. Joten et saavuttanut ’ sitä. Olen myös ’ melko varma, että jonkinlainen suoja estää tätä tapahtumasta.
- Suojausta ei ole. CPU-rekisterit kartoitetaan muistiin alkaen osoitteesta 0, sitten I / O-rekisteröinnit osoitteesta 32, sitten staattisesti varattu RAM alkaa osoitteesta 256.
Vastaus
Yrität käyttää enemmän muistia kuin sinulla on käytettävissä: 96 * 56 * 2 = 10,752 kt. Ei paljon, mitä MCU voi tehdä, kun näin tapahtuu.
Jos tarkastelet -taulukkoa , huomaat, että mikrokontrollerissasi (ATmega328p) on vain 2 kt tavua RAM-muistia.
Luulen siis, että kysyt itseltäsi, tarvitsetko todella suurta matriisia. Voit harkita ulkoisen flash-sirun tai SDcard-suojan hankkimista. Jos tarvitset sitä vain luku-tarkoituksiin (kuten hakuun) taulukko), voit käyttää joitain flash-ohjelmamuistiasi (sinulla on 32 kt).
Kommentit
- I ’ m käyttämällä SD-korttia sheild, mutta minä ’ m luken tiedot näin ilmoitetuksi taulukoksi. Kuinka voisin käyttää SD-kortin muistia.
- Sinun ei tarvitse ’ tavallisesti käsitellä matriisi kaikkia 5376 elementtiä yhdessä hetkessä. Harkitse jakamalla kuvasi pienempiin paloiksi prosessointia varten. Prosessin optimoimiseksi saatat tarvita erilaisia älykkäitä prosessin optimoimiseksi . 😉
- Voiko kirjoittaa tietoja flash-muistiin uudestaan ja uudestaan. Mitä tarkoitat vain luku -tilalla? Kuinka tiedot kirjoitetaan kerran siihen. Haluan esimerkiksi kirjoittaa kuvatiedot flash-muistiin. Kuinka voin tehdä sen?
- Viittaan ohjelman flash-muistiin. AFAIK, voit kirjoittaa ohjelman salamaan vain ohjelmoinnin aikana. Kun käynnistät MCU: n, ohjelman salamaa käytetään vain luku -muistina (jotta emme ’ häiritä ohjelmaa, kun se ’ s on käynnissä.) Koska haluat kirjoittaa tietosi, ohjelman salama ei sovellu.
- Onko sinun todella käsiteltävä koko kuvaa yhdellä kertaa? Kuten olen ’ aiemmin maininnut, voit jakaa kuvan pienempiin lohkoihin, sanoa, että pala [8] [8] olisi mukava koko Arduinolle niellä, ja se toimii hyvin, vaikka käytät konvoluutiosuodattimia. (Tämän sanottuani minun on korostettava, että Arduino Uno ei sovellu mihinkään vakavaan kuvankäsittelyohjelmaan.)
Vastaa
Itse asiassa kyseessä on käytettävissä oleva RAM-muisti.Jos et tarvitse 8 bittiä tietokappaletta kohden (jos olet esimerkiksi halukas heikentämään kuvan laatua, esimerkiksi), harkitse tietojen tiivistämistä siten, että sinulla on useita tietoja bittiä kohti. Esimerkiksi heksadesimaaliarvot tai BCD (binaarikoodatut desimaalit) voivat toimia, riippuen kunkin datan koosta.
Kommentit
- OP haluaa lukea BMP-tiedoston muistiin, joten epäilen, että siitä voidaan tehdä BCD: tä erittäin hyödyllinen.
- Tämä ’ on hyvä asia. Ehkä hän ’ haluaa heikentää kuvanlaatua merkittävästi? Joko niin, lisätallennustila olisi viisasta.
Vastaa
Kuten muut ovat huomanneet, matriisi on suurempi kuin Arduinossa käytettävissä oleva RAM-muisti. Toiset mainitsivat Flash-muistin, joka voisi olla ratkaisu sinulle. Arduinollasi on 32 kt muistia, joka mahtaisi matriisi. Katso seuraavasta viitteestä lisätietoja Flash-muistista. Muista, että Flashilla ja EEPROMilla on rajoitettu määrä kirjoitusjaksoja, ennen kuin niistä tulee epäluotettavia.
Piilotetut voimavarat – tietojen tallentaminen Flashiin ja EEPROMiin
vastaus
Jos matriisi on pääosin tyhjä tai siinä on silti arvoja, jotka voidaan laskea ohjelmallisesti, harvat taulukot saattavat tulla apuun. Se vaatii muistin allokointia ja hyppäämistä, joten yksittäisten elementtien käyttöaika ei ole deterministinen, mutta voit laskea pahimman tilanteen.
Vastaus
Tätä syötin Unolle:
#define IMAGEWIDTH 56 #define IMAGEHEIGHT 96 void setup() { Serial.begin(9600); int i, j; int image_result[IMAGEWIDTH][IMAGEHEIGHT]; for (i = 0; i < IMAGEWIDTH; i++) { Serial.print("\nIMAGEWIDTH "); Serial.print(i + 1); Serial.println(":"); for (j = 0; j < IMAGEHEIGHT; j++) { image_result[i][j] = i + j; Serial.print("image_result["); Serial.print(i + 1); Serial.print("]["); Serial.print(j + 1); Serial.print("]: "); Serial.println(image_result[i][j]); } } Serial.println(F("\nDone!")); } void loop() { }
Tämä suoritetaan koko taulukon yli samalla, kun tulostus etenee Serialissa, joka sitten tulostaa ”Valmis” kun se on. Ehdotan, että muutat:
#define IMAGEWIDTH 56 #define IMAGEHEIGHT 96
Vähemmän arvoihin, ellei sinulla ole muutama hyvä minuuttia käsillä.
Kommentit
- Tämä ei lainkaan ratkaise hänen ongelmaa. Se ei ole ’ t, se on taulukon koko. 56 * 96 * 2 (int on kaksi tavua) käyttää 10752 tavua. Unossa on 2048 tavua. Kysymys ei ole aika, se on tallennustila.
- Nick oli oikeassa, tämä ei ole ratkaissut ongelmaa ’. Joka tapauksessa, kiitos kokeilemisesta.