Arduino Uno nu poate gestiona matricea bidimensională

Acum codul pe care îl scriu în Arduino (folosind Arduino) folosește mai multe matrice bidimensionale. Acum, când Imprim ceva folosind Serial Monitor, îl imprimă corect, dar atunci când declar și inițializez matricea bidimensională, nu o voi imprima.

Cod:

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

Acum, în acest caz,” codul funcționează „nu se imprimă, dar când elimin declarația matricei, codul de inițializare funcționează și se imprimă. Care este problema?

Matricile 2 dimensionale funcționează diferit în Arduino sau este o problemă spațială?

Comentarii

  • Chiar și o matrice unidimensională de 5376 octeți, pe un procesor cu 2048 octeți, va eșua.
  • Am vrut să spun, 10752 octeți. Am trecut cu vederea că fiecare element de matrice are 2 octeți. Rețineți că nu ‘ nici măcar nu aveți la dispoziție toți acești 2048 octeți. Numai tampoanele de transmisie și recepție seriale utilizează 128 de octeți.
  • Dacă conectez o mașină micro-SD, există vreo metodă de declarare a matricei în memoria respectivă?
  • Puteți conecta o Card SD și scrieți date în conținutul inimii ‘. Cu toate acestea, puteți ‘ t ” declara tabloul din memorie ” pe el. Care este aplicația dvs. aici? Un Arduino cu 2 KB de RAM nu este ‘ cel mai bun lucru pentru procesarea imaginii.
  • Am nevoie să citesc un fișier BMP mic într-o serie de inți din Arduino și trebuie să procedăm la procesare. Și dimensiunea fișierului este de 56 pe 96 de pixeli.

Răspuns

Matricile 2D funcționează bine pe arduino, dar tu rămâne fără spațiu foarte repede.

Unul are 2 kilobyți de berbec; matricea dvs. are 56 * 96 = 5376 elemente de 2 octeți.

Aș presupune că scrieți peste o valoare critică a memoriei cu 5 la un moment dat, provocând eșecul programului.

Comentarii

  • Nu numai pe memorie, ci probabil și pe toate registrele I / O.
  • Adresare pe 16 biți, cu SRAM începând de la 256. Astfel încât ‘ s 65279 octeți de spațiu de adrese. Deci, nu ați câștigat ‘ pentru a ajunge la asta. De asemenea, sunt ‘ destul de sigur că există un fel de protecție care împiedică acest lucru.
  • Nu există protecție. Registrele CPU sunt mapate de memorie începând de la adresa 0, apoi I / O se înregistrează de la adresa 32, apoi memoria RAM alocată static începe la adresa 256.

Răspuns

Încercați să utilizați mai multă memorie decât aveți la dispoziție: 96 * 56 * 2 = 10.752KBytes. Nu prea mult ce MCU poate face atunci când se întâmplă acest lucru.

Dacă vă uitați în foaia de date , veți vedea că microcontrolerul dvs. (ATmega328p) are doar 2KBytes de RAM.

Cred că întrebarea atunci este să vă întrebați dacă într-adevăr aveți nevoie de o matrice atât de mare. S-ar putea să luați în considerare obținerea unui cip flash extern sau a unui scut SDcard. tabel), puteți utiliza o parte din memoria flash a programului dvs. (aveți 32KBytes).

Comentarii

  • ‘ m folosind un SDcard sheild, dar ‘ m citesc datele într-un tablou declarat astfel. Cum aș putea folosi memoria cardului SD.
  • Nu ‘ de obicei trebuie să vă ocupați de toate cele 5376 de elemente ale matricei dvs. la un moment dat. Luați în considerare împărțind imaginea dvs. în bucăți mai mici pentru procesare. În funcție de tipul de procesare pe care îl faceți, este posibil să aveți nevoie de inteligențe diferite pentru a optimiza procesul . 😉
  • Poate scrie cineva în memoria flash din nou și din nou? Ce vrei să spui prin citire numai? Cum se scrie o dată datele pe ea. De exemplu, vreau să scriu datele imaginii pe memoria flash. Cum o voi putea face?
  • Mă refer la memoria flash a programului. AFAIK, puteți scrie numai pe blițul programului în timpul programării. În momentul în care vă porniți MCU-ul, blițul programului este folosit ca memorie numai în citire (astfel încât să nu ‘ să deranjăm programul atunci când ‘ s rulează.) Din moment ce doriți să scrieți datele, programul flash nu este potrivit.
  • Chiar trebuie să procesați întreaga imagine dintr-o singură încercare? După cum am menționat anterior, ‘, puteți împărți imaginea în blocuri mai mici, să spunem că bucăți [8] [8] ar fi o dimensiune confortabilă pentru Arduino înghițiți și funcționează bine chiar dacă utilizați filtre de convoluție. (Acestea fiind spuse, trebuie să subliniez că Arduino Uno este inadecvat pentru orice aplicație serioasă de procesare a imaginilor.)

Răspuns

Într-adevăr, aceasta este o problemă a memoriei RAM disponibile.Dacă nu aveți nevoie de 8 biți pe bucată de date (de exemplu, dacă sunteți dispus să reduceți calitatea imaginii), luați în considerare compactarea datelor astfel încât să aveți mai multe bucăți de date pe biți. De exemplu, valorile hex sau BCD (zecimale codate binare) ar putea funcționa, în funcție de dimensiunea fiecărei date.

Comentarii

  • OP vrea să citească un fișier BMP în memorie, așa că mă îndoiesc că poate fi transformat în BCD foarte util.
  • Acest ‘ este un punct bun. Poate că ‘ este dispus să scadă semnificativ calitatea imaginii? Oricum ar fi, stocarea suplimentară ar fi înțeleaptă.

Răspuns

După cum au observat alții, matricea dvs. este mai mare decât memoria RAM disponibilă în Arduino. Alții au menționat memoria Flash, care ar putea fi o soluție pentru dvs. Arduino-ul dvs. are 32 KB de memorie care vă poate păstra matricea. Consultați următoarea referință pentru mai multe informații despre memoria Flash. Rețineți că Flash și EEPROM au un număr limitat de cicluri de scriere înainte de a deveni fiabile.

Puteri ascunse – stocarea datelor în Flash și EEPROM

Răspuns

În cazul în care matricea este în mare parte goală sau oricum are valori care pot fi calculate programatic, matrici rare ar putea fi salvate. Necesită alocarea și saltarea memoriei, astfel încât timpul de acces la elementele individuale nu este determinist, dar puteți calcula cel mai rău scenariu.

Răspuns

Aceasta este ceea ce am hrănit cu Uno:

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

Aceasta va rula pe întreaga matrice, în timp ce se imprimă progresul pe Serial, care apoi imprimă „Gata!” odată ce este. Vă sugerez să schimbați:

 #define IMAGEWIDTH 56 #define IMAGEHEIGHT 96  

La valori mai mici, cu excepția cazului în care aveți câteva bune minute la îndemână.

Comentarii

  • Acest lucru nu va rezolva deloc problema lui. Nu este ‘ t timp, este dimensiunea matricei. 56 * 96 * 2 (un int este de doi octeți) folosește 10752 octeți. Uno-ul dvs. are 2048 de octeți. Problema nu este timpul, este stocarea.
  • Nick a avut dreptate, acest lucru nu a rezolvat problema mea ‘. Oricum, vă mulțumim că ați încercat.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *