Az Arduino Uno nem képes kezelni a 2-dimenziós tömböt

Most az Arduino-ban (az Arduino használatával) írt kódom több kétdimenziós tömböt használ. Néhány dolgot a Serial Monitor segítségével nyomtatok ki, és helyesen kinyomtatja, de amikor kijelentem és inicializálom a kétdimenziós tömböt, nem fogja kinyomtatni.

Kód:

 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"); }  

Ebben az esetben a” kód működik “nem nyomtat, de amikor eltávolítom a tömb deklarációt, és az inicializáló kód a nyomtatódik. Mi a probléma?

A 2 dimenziós tömbök másképp működnek az Arduino-ban, vagy szóköz kérdés?

Megjegyzések

  • Még egy 2076 bájtos processzorral rendelkező 5376 bájtos egydimenziós tömb is meghiúsul.
  • Úgy értettem, hogy 10752 bájt. Elnéztem, hogy minden tömb elem 2 bájt. Ne feledje, hogy nem is rendelkezik 2048 bájttal. Önmagában a soros adás és vétel pufferek 128 bájtot használnak fel.
  • Nos, ha csatlakoztatok egy mikro-SD autót, van-e valamilyen módszer a tömb deklarálására ebben a memóriában?
  • Csatlakoztathat egy SD-kártyára, és írjon adatokat a szív ' tartalmába. Azonban ' t " deklarálhatja a tömböt a memóriában ". Mi itt a pályázata? A 2 KB RAM-mal rendelkező Arduino nem a legjobb a képfeldolgozáshoz.
  • El kell olvasnom egy kis BMP-fájlt az Arduino-ban található tömbök tömbjében. és némi feldolgozást kell végrehajtania rajta. A fájlméret pedig 56×96 képpont.

Válasz

A 2D tömbök jól működnek az arduinón, de Ön nagyon gyorsan elfogy a hely.

Egy uno-nak 2 kilobájt ramja van; tömbje 56 * 96 = 5376 2 bájtos elemeket tartalmaz.

Gondolom, hogy valamilyen kritikus memóriaértéket ír át egy 5-tel, ami a program kudarcát eredményezi.

Megjegyzések

  • Nem csak a memória, hanem valószínűleg az összes I / O regiszter felett is.
  • 16 bites címzés, az SRAM 256-tól kezdődik. Tehát ' 65279 bájt címteret. Tehát nem fogod ' elérni ezt. Ezenkívül ' biztos vagyok abban, hogy van valamilyen védelem, amely megakadályozza ennek bekövetkezését. A CPU regiszterek memória-leképezése a 0. címetől kezdődően történik, majd az I / O regisztráció a 32. címetől kezdődik, majd a statikusan lefoglalt RAM a 256. címből indul.

Válasz

Több memóriát próbál használni, mint amennyi rendelkezésre áll: 96 * 56 * 2 = 10,752 KB. Az MCU nem sokat tehet, amikor ez megtörténik.

Ha megnézi a adatlapot , látni fogja, hogy a mikrovezérlője (ATmega328p) csak 2 KB RAM-mal rendelkezik.

Azt hiszem, az a kérdés, hogy felteszi-e magának a kérdést, hogy valóban szüksége van-e ekkora tömbre. Fontolja meg egy külső flash chip vagy SDcard-pajzs beszerzését. Ha csak olvasható célokra (például keresésre) van szüksége táblázat), használhatja néhány flash programmemóriáját (32 KByte van).

Megjegyzések

  • I ' m egy SDcard sheild használatával, de ' m az adatokat így kinyilvánított tömbbe olvasom. Hogyan tudnám használni az SD-kártya memóriáját?
  • Önnek általában nem kell egy pillanat alatt kezelnie a tömb 5376 elemét. Fontolja meg a kép kisebb darabokra bontása a feldolgozáshoz. A feldolgozás fajtájától függően különböző okosokra lehet szükség a folyamat optimalizálásához . 😉
  • Írhat-e újra és újra adatokat a flash memóriára. Mit értesz csak olvasható alatt? Hogyan lehet egyszer ráírni az adatokat. Például szeretnék írni a képadatokat a flash memóriára. Hogyan lesz képes rá?
  • A program flash memóriájára utalok. AFAIK, csak programozás közben írhat a program villogására. Amint elindítja az MCU-t, a program flash-jét csak olvasható memóriaként használják (hogy ne ' ne rontsuk el a programot, amikor ' s fut.) Mivel meg akarja írni az adatait, a program vaku nem megfelelő.
  • Tényleg egy lépésben kell feldolgoznia a teljes képet? Ahogy már ' említettem, a képét kisebb tömbökre oszthatja, mondjuk a chunk [8] [8] kényelmes méret lenne Arduino számára lenyelni, és akkor is jól működik, ha konvolúciós szűrőket használ. (Ennek ellenére hangsúlyoznom kell, hogy az Arduino Uno alkalmatlan bármilyen komoly képfeldolgozó alkalmazáshoz.)

Válasz

Valóban, ez a rendelkezésre álló RAM kérdése.Ha nincs szüksége 8 bitre adatként (ha például hajlandó csökkenteni a képminőséget), fontolja meg az adatok tömörítését úgy, hogy bitenként több adat álljon rendelkezésre. Például a hexadecimális értékek vagy a BCD (bináris kódolású tizedesjegyek) működhetnek, az egyes adatok méretétől függően.

Megjegyzések

  • Az OP egy BMP fájlt akar memóriába olvasni, ezért kétlem, hogy nagyon hasznos BCD-dé alakítható.
  • Ez ' jó pont. Talán hajlandó ' jelentősen csökkenteni a képminőséget? Akárhogy is, a további tárhely bölcs lenne.

Válasz

Amint mások megjegyezték, tömbje nagyobb, mint a rendelkezésre álló RAM az Arduino-ban. Mások a Flash memóriát említették, amely megoldást jelenthet az Ön számára. Az Arduino 32 KB memóriával rendelkezik, amely elfér a tömbön. A Flash memóriával kapcsolatos további információkért lásd az alábbi hivatkozást. Ne feledje, hogy a Flash és az EEPROM korlátozott számú írási ciklussal rendelkezik, mielőtt megbízhatatlanná válnának.

Rejtett erők – adatok tárolása a Flash-ben és az EEPROM-ban

Válasz

Abban az esetben, ha a mátrix többnyire üres, vagy amúgy is vannak programozhatóan kiszámolható értékei, ritka tömbök segíthetnek. Memóriafoglalást és ugrálást igényel, ezért az egyes elemek elérési ideje nem meghatározó, de kiszámíthatja a legrosszabb esetet.

Válasz

Ezt tápláltam az Unóval:

 #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() { }  

Ez futni fog az egész tömbön, miközben a nyomtatás halad a Serial felett, amely ezt követően a “Kész!” ha egyszer az. Azt javaslom, hogy változtassa meg:

 #define IMAGEWIDTH 56 #define IMAGEHEIGHT 96  

Kisebb értékekre, hacsak nincs néhány jó perc.

Megjegyzések

  • Ez egyáltalán nem oldja meg a problémáját. Ez nem ' t idő, ez a tömb mérete. 56 * 96 * 2 (az int két bájt) 10752 bájtot használ. Az Uno 2048 bájttal rendelkezik. A kérdés nem idő, hanem tárolás.
  • Nicknek igaza volt, ez nem ' nem oldotta meg a problémámat. Különben is, köszönöm, hogy megpróbálta.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük