Arduino Uno klarer ikke å håndtere 2-dimensjonalt array

Nå bruker koden jeg skriver i Arduino (ved hjelp av Arduino) flere 2-dimensjonale arrays. Nå når Jeg skriver ut noen ting ved hjelp av Serial Monitor, den skriver den ut riktig, men når jeg erklærer og initialiserer den 2-dimensjonale matrisen, vil den ikke skrive den ut.

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

Nå i dette tilfellet skrives ikke» code works «ut, men når jeg fjerner blir matrixerklæringen og initialiseringskoden skrevet ut. Hva er problemet?

Fungerer 2-dimensjonale matriser annerledes i Arduino, eller er det et romproblem?

Kommentarer

  • Selv et endimensjonalt utvalg på 5376 byte, på en prosessor med 2048 byte, vil mislykkes. Jeg overså at hvert matriseelement er 2 byte. Husk at du ikke har ' ikke engang alle 2048 byte tilgjengelig. Seriell overføring og mottak av buffere alene bruker opp 128 byte.
  • Vel, hvis jeg kobler til en micro-SD-bil, er det noen metode for å erklære array i det minnet?
  • Du kan koble til en SD-kort og skriv data til ditt hjerte ' innhold. Du kan imidlertid ' t " erklære matrisen i minnet " på den. Hva er søknaden din her? En Arduino med 2 KB RAM er ikke ' t det beste for bildebehandling.
  • Jeg trenger å lese en liten BMP-fil i en rekke ints i Arduino og trenger å gjøre litt behandling på det. Og filstørrelsen er 56 x 96 piksler.

Svar

2D-matriser fungerer fint på arduino, men du går tom for rom veldig raskt.

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

Jeg vil gjette at du skriver over en kritisk minneverdi med en 5 på et eller annet tidspunkt som fører til at programmet mislykkes.

Kommentarer

  • Ikke bare over minne, men sannsynligvis også over alle I / O-registrene.
  • 16-biters adressering, med SRAM fra 256. Slik at ' s 65279 byte adresseplass. Så du vil ikke ' ikke nå det. Jeg ' er ganske sikker på at det er noen form for beskyttelse som forhindrer at dette skjer.
  • Det er ingen beskyttelse. CPU-registrene er minnekartet fra adresse 0, deretter registreres I / O fra adresse 32, og deretter starter det statisk tildelte RAM på adresse 256.

Svar

Du prøver å bruke mer minne enn du har tilgjengelig: 96 * 56 * 2 = 10,752 KB. Ikke mye MCU kan gjøre når dette skjer.

Hvis du ser på databladet , vil du se at mikrokontrolleren din (ATmega328p) bare har 2 kB RAM.

Jeg antar at spørsmålet da er å spørre deg selv om du virkelig trenger et så stort utvalg. Du kan vurdere å få en ekstern flash-chip eller et SD-kortskjerm. Hvis du bare trenger det for skrivebeskyttede formål (for eksempel et oppslag tabell), kan du bruke noe av flashprogramminnet (du har 32 kBytes).

Kommentarer

  • Jeg ' m bruker et SD-kort-skjerm, men jeg ' leser dataene i en matrise som er erklært slik. Hvordan ville jeg være i stand til å bruke SD-kortminnet.
  • Du trenger ikke ' t trenger vanligvis å håndtere alle 5376 elementene i matrisen på ett øyeblikk. dele opp bildet ditt i mindre biter for behandling. Avhengig av hvilken type behandling du gjør, kan det hende du trenger forskjellige smarts for å optimalisere prosessen . 😉
  • Kan man skrive data på flashminnet igjen og igjen. Hva mener du med skrivebeskyttet? Hvordan skriver man dataene en gang på den. For eksempel vil jeg skrive bildedataene på flashminnet. Hvordan vil jeg være i stand til å gjøre det?
  • Jeg refererer til flash-minnet ditt. AFAIK, du kan bare skrive til programblitsen under programmering. Når du starter MCU-en din, brukes programblitsen som skrivebeskyttet minne (slik at vi ikke ' ikke ødelegger programmet når det ' s kjører.) Siden du vil skrive dataene dine, er ikke programblitsen egnet.
  • Trenger du virkelig å behandle hele bildet på en gang? Som jeg ' har nevnt tidligere, kan du dele bildet ditt i mindre blokker, si at klump [8] [8] ville være en behagelig størrelse for Arduino å svelge, og det fungerer bra selv om du bruker konvolusjonsfiltre. (Når det er sagt, må jeg understreke at Arduino Uno er dårlig egnet for enhver seriøs bildebehandlingsapplikasjon.)

Svar

Dette er faktisk et problem med RAM tilgjengelig.Hvis du ikke trenger 8 biter per datastykke (hvis du for eksempel er villig til å redusere bildekvaliteten), bør du vurdere å komprimere dataene dine slik at du har flere data per bit. For eksempel kan hexverdier eller BCD (binære kodede desimaler) fungere, avhengig av størrelsen på hvert stykke data.

Kommentarer

  • OP ønsker å lese en BMP-fil i minnet, så jeg tviler på at den kan gjøres om til BCD veldig nyttig.
  • At ' er et godt poeng. Kanskje er han ' villig til å redusere bildekvaliteten betydelig? Uansett vil ekstra lagring være lurt.

Svar

Som andre har bemerket, er arrayet ditt større enn tilgjengelig RAM i Arduino. Andre nevnte Flash-minne som kan være en løsning for deg. Arduino har 32 kB minne som kan holde din matrise. Se følgende referanse for mer informasjon om Flash-minne. Husk at Flash og EEPROM har et begrenset antall skrivesykluser før de blir upålitelige.

Hidden Powers – lagring av data i Flash og EEPROM

Svar

I tilfelle matrisen stort sett er tom eller uansett har verdier som kan beregnes programmatisk, sparsomme matriser kan komme til unnsetning. Det krever minnetildeling og hopping, så tilgangstiden til enkeltelementer er ikke deterministisk, men du kan beregne det verste tilfellet.

Svar

Dette matet jeg 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 vil kjøre over hele matrisen, mens utskriftsforløpet over Serial, som deretter skriver ut «Ferdig!» når det er det. Jeg foreslår at du endrer:

 #define IMAGEWIDTH 56 #define IMAGEHEIGHT 96  

Til mindre verdier, med mindre du har noen få gode minutter til stede.

Kommentarer

  • Dette kommer ikke til å løse problemet hans. Det er ikke ' tiden, det er størrelsen på matrisen. 56 * 96 * 2 (et int er to byte) bruker 10752 byte. Uno har 2048 byte. Problemet er ikke på tide, det er lagring.
  • Nick hadde rett, dette har ikke ' ikke løst problemet mitt. Uansett, takk for at du prøvde.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *