題:
Arduino Uno無法處理二維數組
George J. Adams
2015-08-20 22:11:54 UTC
view on stackexchange narkive permalink

現在,我在Arduino(使用Arduino)中編寫的代碼使用多個二維數組。現在,當我使用串行監視器打印某些東西時,它可以正確打印它,但是當我聲明並初始化二維數組時,它就不會打印出來。

代碼:

  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(“代碼作品”);}  

現在在這種情況下,“代碼作品”不會打印,但是當我刪除數組聲明並打印初始化代碼作品時。有什麼問題?

二維數組在Arduino中的工作方式是否不同?還是空間問題?

在具有2048字節的處理器上,即使是5376字節的一維數組也將失敗。
我的意思是** 10752 **字節。我忽略了每個數組項都是2個字節。請記住,您甚至沒有全部2048個字節可用。串行發送和接收緩衝區僅佔用128個字節。
好吧,如果我連接了微型SD卡,是否有某種方法可以在該內存中聲明數組?
您可以連接SD卡並將數據寫入心臟的內容。但是,您不能在其上“聲明內存中的數組”。您在這裡的應用是什麼?具有2 KB RAM的Arduino並不是圖像處理的最佳選擇。
我需要在Arduino中的int數組中讀取一個小的BMP文件,並需要對其進行一些處理。文件大小為56 x 96像素。
您將不得不重新考慮這一點。您無法在具有2048字節RAM的Arduino上讀取和“處理” 10752字節像素。也許您可以做到。 “二維數組在Arduino中的工作方式是否不同,還是空間問題?”-絕對是空間問題。
Due有什麼不同?另外,Mega 2560可以為此工作嗎?
如果我將圖像數據保存在閃存中,並且進行了一些處理也將結果保存到閃存中,該怎麼辦。這種方法行得通嗎?
“此外,Mega 2560可以做到這一點嗎?”-Mega擁有8 KB的RAM,如果可以回答您的問題。您需要10.5 KB。
[Due](https://www.arduino.cc/en/Main/ArduinoBoardDue)具有96 KB的RAM。看起來更合適。
六 答案:
BrettAM
2015-08-20 22:36:53 UTC
view on stackexchange narkive permalink

2D數組在arduino上可以正常工作,但是空間很快用完了。

一個Uno的內存為2 KB。您的數組具有56 * 96 = 5376個2字節元素。

我猜您是在寫一些臨界內存值,有時值5會導致程序失敗。

不僅通過內存,而且可能還通過所有I / O寄存器。
16位尋址,SRAM從256開始。因此,這是65279字節的地址空間。因此,您將無法達到目標。另外,我很確定有某種保護措施可以防止這種情況的發生。
沒有保護。從地址0開始對CPU寄存器進行內存映射,然後從地址32開始對I / O寄存器進行映射,然後從地址256開始對靜態分配的RAM進行映射。
bot3663369
2015-08-21 10:34:45 UTC
view on stackexchange narkive permalink

您正在嘗試使用比可用內存更多的內存:96 * 56 * 2 = 10.752KBytes。發生這種情況時,MCU不能做的太多。

如果查看數據表,您會看到微控制器(ATmega328p)僅具有2KB的RAM。

那麼我想的問題是,問自己是否真的需要那麼大的數組。您可以考慮使用外部閃存芯片或SD卡防護罩。如果僅出於只讀目的(例如查找表)需要它,則可以使用某些閃存程序存儲器(您有32KB)。

我正在使用SD卡屏蔽板,但正在將數據讀入這樣聲明的數組中。我將如何使用SD卡內存。
您通常不需要一次處理數組中的所有5376個元素。考慮將圖像分成較小的塊進行處理。根據您執行的處理類型,您可能需要不同的智能來優化流程。 ;-)
一個人可以一次又一次地將數據寫入閃存。只讀是什麼意思?如何一次將數據寫入數據。例如我想將圖像數據寫到閃存之一上。我將如何做?
我指的是您的程序閃存。 AFAIK,您只能在編程期間寫入程序閃存。當您啟動MCU時,程序閃存將被用作只讀存儲器(這樣我們就不會在程序運行時弄亂它。)由於您要寫入數據,因此不適合使用程序閃存。
您真的需要一次性處理整個圖像嗎?正如我之前提到的,您可以將圖像劃分為較小的塊,例如** chunk [8] [8] **對於Arduino來說是一個合適的大小,即使您使用卷積過濾器,效果也很好。 (話雖如此,我必須強調指出,Arduino Uno對於任何嚴肅的圖像處理應用程序都是“不合適的”。)
Dodo
2015-08-22 06:27:52 UTC
view on stackexchange narkive permalink

實際上,這是可用的RAM問題。如果您不需要每條數據8位(例如,如果您可能願意降低圖像質量),請考慮壓縮數據,以便每位有多條數據。例如,十六進制值或BCD(二進制編碼的十進制)可能會起作用,具體取決於每條數據的大小。

OP希望將BMP文件讀入內存,因此我懷疑它能否非常有用地轉換為BCD。
那是個很好的觀點。也許他願意大幅降低圖像質量?無論哪種方式,額外的存儲都是明智的。
linhartr22
2015-08-28 01:42:38 UTC
view on stackexchange narkive permalink

正如其他人所指出的,您的陣列比Arduino中的可用RAM大。其他人提到閃存可能是您的解決方案。您的Arduino具有32 KB的內存,可以容納您的陣列。有關閃存的更多信息,請參見以下參考。請記住,閃存和EEPROM在變得不可靠之前具有有限的寫入周期。

隱藏電源-在閃存和EEPROM中存儲數據

Igor Stoppa
2015-08-28 13:04:55 UTC
view on stackexchange narkive permalink

如果矩陣大部分為空,或者無論如何都可以通過編程方式計算出值,則稀疏數組可能可以解決。它需要內存分配和跳躍,因此對單個元素的訪問時間不確定,但是您可以計算最壞的情況。

avluis
2015-08-21 06:03:33 UTC
view on stackexchange narkive permalink

這就是我餵我的Uno的東西:

  #define IMAGEWIDTH 56#define IMAGEHEIGHT 96void setup(){Serial.begin(9600); int i,j; int image_result [IMAGEWIDTH] [IMAGEHEIGHT];對於(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(){}  

這將在整個數組上運行,同時在Serial上打印進度,然後打印“完成!”曾經是。我建議更改:

  #define IMAGEWIDTH 56#define IMAGEHEIGHT 96  

為較小的值,除非您有幾分鐘就好了。

這根本不能解決他的問題。不是時間,這是數組的大小。 56 * 96 * 2(一個int是兩個字節)使用10752個字節。您的Uno有2048個字節。問題不是時間,而是存儲。
尼克說得對,這並不能解決我的問題。無論如何,感謝您的嘗試。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...