Nu använder koden jag skriver i Arduino (med Arduino) flera tvådimensionella matriser. Nu när Jag skriver ut något med Serial Monitor, det skriver ut det korrekt men när jag deklarerar och initialiserar den 2-dimensionella matrisen kommer den inte att skriva ut.
Kod:
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"); }
I detta fall skrivs inte” code works ”ut men när jag tar bort matrisdeklarationen och initialiseringskoden skrivs ut. Vad är problemet?
Fungerar tvådimensionella matriser annorlunda i Arduino eller är det en rymdfråga?
Kommentarer
- Till och med en endimensionell matris på 5376 byte, på en processor med 2048 byte, kommer att misslyckas.
- Jag menade 10752 byte. Jag förbises att varje array-objekt är 2 byte. Kom ihåg att du inte ens har ' alla dessa 2048 byte tillgängliga. Seriella sändnings- och mottagningsbuffertar använder bara 128 byte.
- Om jag ansluter en micro-SD-bil finns det någon metod för att deklarera array i det minnet?
- Du kan ansluta en SD-kort och skriv data till ditt hjärta ' innehåll. Du kan dock ' t " deklarera arrayen i minnet " på den. Vad är din ansökan här? En Arduino med 2 kB RAM-minne är inte ' det bästa för bildbehandling.
- Jag måste läsa en liten BMP-fil i en rad inter i Arduino och behöver göra lite bearbetning på det. Och filstorleken är 56 gånger 96 pixlar.
Svar
2D-matriser fungerar bra på arduino, men du tar slut snabbt mycket utrymme.
En uno har 2 kilobyte ram; din matris har 56 * 96 = 5376 2-byte-element.
Jag antar att du skriver över ett kritiskt minnesvärde med en 5 någon gång får programmet att misslyckas.
Kommentarer
- Inte bara över minne, utan förmodligen också över alla I / O-register.
- 16-bitars adressering, med SRAM från 256. Så att ' s 65279 byte av adressutrymme. Så du kommer inte ' att nå det. Jag är också ' ganska säker på att det finns någon form av skydd som förhindrar detta.
- Det finns inget skydd. CPU-registren är minnesmappade från adress 0, sedan registreras I / O från adress 32, sedan börjar det statiskt allokerade RAM-numret vid adress 256.
Svar
Du försöker använda mer minne än du har tillgängligt: 96 * 56 * 2 = 10,752 kBytes. Inte mycket som MCU kan göra när detta händer.
Om du tittar på databladet ser du att din mikrokontroller (ATmega328p) bara har 2 kB RAM.
Jag antar att frågan då är att fråga dig själv om du verkligen behöver det stora utbudet. Du kan överväga att få ett externt flashchip eller ett SD-kortskydd. Om du bara behöver det för skrivskyddade ändamål (t.ex. kan du använda en del av ditt flashminne (du har 32 kBytes).
Kommentarer
- Jag ' m använder ett SD-kort, men jag ' läser data i en array som deklareras så här. Hur skulle jag kunna använda SD-kortminnet.
- Du behöver inte ' t behöver vanligtvis hantera alla 5376 element i din array samtidigt. dela upp din bild i mindre bitar för bearbetning. Beroende på vilken typ av bearbetning du gör kan du behöva olika smarts för att optimera processen . 😉
- Kan man skriva data i flashminnet om och om igen. Vad menar du med skrivskyddad? Hur skriver man data en gång på den. Till exempel vill jag skriva bilddata på ett flashminne. Hur kommer jag att kunna göra det?
- Jag hänvisar till ditt Flash-minne. AFAIK, du kan bara skriva till programblixten under programmering. En som du startar din MCU, används programblixten som skrivskyddat minne (så att vi inte ' inte förstör programmet när det ' s igång.) Eftersom du vill skriva dina data är programblixten inte lämplig.
- Behöver du verkligen bearbeta hela bilden på en gång? Som jag ' nämnt tidigare kan du dela din bild i mindre block, säg att bit [8] [8] skulle vara en bekväm storlek för Arduino att svälja, och det fungerar bra även om du använder fällningsfilter. (Med detta sagt måste jag betona att Arduino Uno är olämplig för all seriös bildbehandlingsapplikation.)
Svar
Detta är faktiskt en fråga om RAM-minne.Om du inte behöver 8 bitar per datadel (om du kanske är villig att minska bildkvaliteten, till exempel), överväg att komprimera dina data så att du har flera datadelar per bit. Till exempel kan hex-värden eller BCD (binära kodade decimaler) fungera, beroende på storleken på varje datadel.
Kommentarer
- OP vill läsa en BMP-fil i minnet, så jag tvivlar på att den kan förvandlas till BCD mycket användbart.
- Att ' är en bra punkt. Kanske är han ' villig att avsevärt minska sin bildkvalitet? Hur som helst skulle ytterligare lagring vara klokt.
Svar
Som andra har noterat är din array större än det tillgängliga RAM-minnet i din Arduino. Andra nämnde Flash-minne som kan vara en lösning för dig. Din Arduino har 32 kB minne som kan rymma din matris. Se följande referens för mer information om Flash-minne. Tänk på att Flash och EEPROM har ett begränsat antal skrivcykler innan de blir opålitliga.
Svar
Om matrisen är mestadels tom eller ändå har värden som kan beräknas programmatiskt, glesa matriser kan komma till undsättning. Det kräver minnesallokering och hoppning, så åtkomsttiden till enskilda element är inte deterministisk, men du kan beräkna det värsta fallet.
Svar
Detta är vad jag matade 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() { }
Detta körs över hela matrisen, medan utskriftsförloppet över Serial, som sedan skriver ut ”Klar!” när det är det. Jag föreslår att du ändrar:
#define IMAGEWIDTH 56 #define IMAGEHEIGHT 96
Till mindre värden, såvida du inte har några bra minuter till hands.
Kommentarer
- Detta kommer inte alls att lösa hans problem. Det är inte ' tiden, det är storleken på matrisen. 56 * 96 * 2 (ett int är två byte) använder 10752 byte. Din Uno har 2048 byte. Problemet är inte dags, det är lagring.
- Nick hade rätt, det här har inte ' inte löst mitt problem. Hur som helst, tack för att du försökte.