Arduino Uno ikke i stand til at håndtere det 2-dimensionelle array

Nu bruger koden, jeg skriver i Arduino (ved hjælp af Arduino) flere 2-dimensionelle arrays. Nu når Jeg udskriver nogle ting ved hjælp af Serial Monitor, det udskriver det korrekt, men når jeg erklærer og initialiserer det 2-dimensionelle array, vil det ikke udskrive det.

Kode:

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

Nu i dette tilfælde udskrives” code works “ikke, men når jeg fjerner, udskrives array-erklæringen og initialiseringskoden. Hvad er problemet?

Fungerer 2-dimensionelle arrays forskelligt i Arduino, eller er det et rumproblem?

Kommentarer

  • Selv et endimensionelt array på 5376 bytes, på en processor med 2048 byte, vil mislykkes.
  • Jeg mente, 10752 bytes. Jeg overså, at hvert array-element er 2 byte. Husk, at du ikke ‘ ikke engang har alle disse 2048 byte til rådighed. Seriel transmittere og modtage buffere alene bruger 128 byte.
  • Nå, hvis jeg tilslutter en micro-SD-bil, er der en metode til at erklære array i den hukommelse?
  • Du kan forbinde en SD-kort og skriv data til dit hjerte ‘ s indhold. Du kan dog ‘ t ” erklære arrayet i hukommelsen ” på det. Hvad er din ansøgning her? En Arduino med 2 KB RAM er ikke ‘ t den bedste ting til billedbehandling.
  • Jeg har brug for at læse en lille BMP-fil i en række ints i Arduino og har brug for at bearbejde det. Og filstørrelsen er 56 x 96 pixels.

Svar

2D-arrays fungerer fint på arduino, men du løber tør for plads meget hurtigt.

En uno har 2 kilobyte ram; din matrix har 56 * 96 = 5376 2-byte-elementer.

Jeg vil gætte, at du skriver over en kritisk hukommelsesværdi med en 5 på et eller andet tidspunkt, hvilket får programmet til at mislykkes.

Kommentarer

  • Ikke kun over hukommelse, men sandsynligvis også over alle I / O-registre.
  • 16 bit adressering, med SRAM startende fra 256. Så ‘ s 65279 bytes adresseområde. Så du vinder ‘ ikke når det. Jeg er ‘ også ret sikker på, at der er en form for beskyttelse, der forhindrer dette i at ske.
  • Der er ingen beskyttelse. CPU-registre er hukommelseskortet startende ved adresse 0, derefter registreres I / O fra adresse 32, derefter starter det statisk tildelte RAM ved adresse 256.

Svar

Du prøver at bruge mere hukommelse, end du har til rådighed: 96 * 56 * 2 = 10.752KBytes. Ikke meget, som MCU kan gøre, når dette sker.

Hvis du ser på databladet , vil du se, at din mikrokontroller (ATmega328p) kun har 2 KB RAM.

Jeg antager, at spørgsmålet er at spørge dig selv, om du virkelig har brug for det store array. Du kan overveje at få en ekstern flashchip eller et SDcard-skjold. Hvis du kun har brug for det til skrivebeskyttede formål (såsom et opslag tabel), kan du bruge noget af din flash-programhukommelse (du har 32 KB).

Kommentarer

  • I ‘ m ved hjælp af et SD-kort, men jeg ‘ m læser dataene i et array, der er erklæret som dette. Hvordan ville jeg være i stand til at bruge hukommelsen til SD-kortet.
  • Du behøver normalt ikke ‘ t at håndtere alle 5376 elementer i dit array på et øjeblik. Overvej opdele dit billede i mindre stykker til behandling. Afhængigt af den slags behandling, du foretager, kan du kræve forskellige smarts for at optimere processen . 😉
  • Kan man skrive data i flashhukommelsen igen og igen. Hvad mener du med skrivebeskyttet? Hvordan skriver man dataene en gang om det. For eksempel vil jeg skrive billeddataene i flashhukommelsen. Hvordan kan jeg gøre det?
  • Jeg henviser til dit program flash-hukommelse. AFAIK, du kan kun skrive til programblitzen under programmering. Når du starter din MCU, bruges programflashen som skrivebeskyttet hukommelse (så vi ikke ‘ ikke ødelægger programmet, når det ‘ s kører.) Da du vil skrive dine data, er programflashen ikke egnet.
  • Har du virkelig brug for at behandle hele billedet på én gang? Som jeg ‘ har nævnt før, kan du dele dit billede i mindre blokke, siger klump [8] [8] ville være en behagelig størrelse for Arduino til sluge, og det fungerer godt, selvom du bruger foldningsfiltre. (Når det er sagt, må jeg understrege, at Arduino Uno er dårligt egnet til enhver seriøs billedbehandlingsapplikation.)

Svar

Faktisk er dette et tilgængeligt RAM-problem.Hvis du ikke har brug for 8 bits pr. Stykke data (hvis du f.eks. Er villig til at reducere billedkvaliteten), skal du overveje at komprimere dine data, så du har flere data pr. Bit. For eksempel kan hex-værdier eller BCD (binære kodede decimaler) fungere, afhængigt af størrelsen på hvert stykke data.

Kommentarer

  • OP ønsker at læse en BMP-fil i hukommelsen, så jeg tvivler på, at den kan omdannes til BCD meget nyttigt.
  • At ‘ er et godt punkt. Måske er han ‘ villig til at nedsætte sin billedkvalitet markant? Uanset hvad ville yderligere lagerplads være klogt.

Svar

Som andre har bemærket, er din matrix større end den tilgængelige RAM i din Arduino. Andre nævnte Flash-hukommelse, som kunne være en løsning for dig. Din Arduino har 32 KB hukommelse, der kan rumme dit array. Se følgende reference for mere information om Flash-hukommelse. Husk, at Flash og EEPROM har et begrænset antal skrivecyklusser, inden de bliver upålidelige.

Skjulte beføjelser – lagring af data i Flash og EEPROM

Svar

Hvis matrixen for det meste er tom eller alligevel har værdier, der kan beregnes programmatisk, tynde arrays kan komme til undsætning. Det kræver hukommelsesallokering og hopping, så adgangstiden til individuelle elementer er ikke deterministisk, men du kan beregne det værst tænkelige scenarie.

Svar

Dette er hvad jeg fodrede min 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() { }  

Dette kører over hele matrixen, mens udskrivningen fortsætter over Serial, som derefter udskriver “Udført!” når det er. Jeg foreslår at ændre:

 #define IMAGEWIDTH 56 #define IMAGEHEIGHT 96  

Til mindre værdier, medmindre du har et par gode minutter ved hånden.

Kommentarer

  • Dette løser slet ikke hans problem. Det er ikke ‘ tid, det er størrelsen på arrayet. 56 * 96 * 2 (en int er to byte) bruger 10752 byte. Din Uno har 2048 byte. Problemet er ikke tid, det er opbevaring.
  • Nick havde ret, dette har ikke ‘ t løst mit problem. I hvert fald tak, fordi du prøvede.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *