題:
如何在arduino上擴展程序存儲器?
qwerty10
2016-08-28 10:00:46 UTC
view on stackexchange narkive permalink

有時,我要放在arduino上的嵌入式C程序的程序大小空間不足。那麼,我需要什麼芯片來擴展arduino的程序內存,以便可以在arduino中使用更大的C程序?

考慮到[一個名叫PetriHäkkinen的同伴](https://plus.google.com/100797925989882885975)放置了[街機風格的遊戲](http://www.gammon.com.au/forum/?id = 12623)在Atmega328P上,也許您應該考慮節省代碼空間?如某些答案所述,如果這樣做不切實際,則可以使用更大的程序內存來獲得更大的芯片。例如,Atmega644採用DIP芯片封裝。
另請參閱https://forum.arduino.cc/index.php?topic=226465.0
您能再解釋一下您的答案嗎? 2)Arduino具有SPI,因此可以訪問SD卡。 SD卡上的所有代碼都需要加載到可執行內存中。這很複雜,不適合初學者...您的意思是您可以在程序運行時更改或重新編程指令存儲器?正在運行的程序可以調用引導加載程序並在其他地址上加載新指令嗎?這個年齡會不會存儲程序?一個不同的解決方案可能是在程序中標識常規程序,然後將所有“調用”都存儲在spi外部存儲器中……謝謝!
五 答案:
James Waldby - jwpat7
2016-08-28 10:13:30 UTC
view on stackexchange narkive permalink

當Uno上的程序存儲器用完時,ATmega2560可以添加更多的存儲器。參考arduino.cc上的內存頁面,您會看到它具有Flash = 256KB,SRAM = 8KB,EEPROM = 4KB,其中Uno上的ATmega328芯片具有Flash = 32KB,SRAM = 2KB,EEPROM = 1KB。

當您在Uno上用盡程序存儲器時,有大約三個可行的選擇:減小程序大小;減小程序大小。刪除引導加載程序(以釋放一兩個KB);使用具有更強大功能的處理器的另一塊板。 Uno板上的CPU無法從片上32KB閃存以外的其他位置訪問程序字節。 Mega2560板上的CPU啟動時的閃存數量是8倍,因此它可以容納比Uno更大的程序。

如果卸下引導加載程序,則可以使用USBASP板進行編程,如所述在learningaboutelectronics.com上的“使用帶有10針電纜的USBASP編程AVR芯片”中。

但是,如果您釋放了引導程序,那我將如何使用arduino IDE進行編程?
請參見@qwerty10,的最後一段。 Arduino IDE支持USBASP。
它可以與可以將代碼上傳到ATMEGA的任何程序員一起使用嗎?而不只是USBASP。據我了解,它實際上並沒有使用10個引腳,而是這些引腳的一個子集。
@qwerty10, USPASP是ISP(在系統編程中)程序員。通常,只要目標芯片上有MOSI,MISO,SCK,RST,VCC和GND引腳可用,任何ISP編程器都可用於對芯片(帶有或不帶有引導加載程序)進行編程。
當前的Unos使用非常緊湊的optboot引導程序。刪除它只會釋放512個字節。
@qwerty10:有些版本的USBASP具有6針連接器。 10針連接器具有4個冗餘針。
@Edgar Bonet。我還有一個問題埃德加。如果我從Uno上的插槽中取出atmega 328芯片並改為使用atmega8-16PU替換它,然後燒掉這512字節的引導加載程序,這確實意味著我可以將atuto8上的arduino Uno與atmaga328一起使用(但使用328功能的子集)。 atmega8當然是比328更舊的芯片,但其引腳排列仍然相同。
@qwerty10:我非常相信它應該在物理上起作用。但是,在軟件級別,您必須說服Arduino IDE很好地使用它。您可以嘗試告訴IDE您的開發板實際上是“ Arduino NG或更舊的帶ATmega8的產品”。
@Edgar Bonet。因此,將其用作帶有atmeg8芯片的Arduino NG是否意味著引導加載程序會設置arduino的atmega8上的保險絲以使用arduino pcb上的晶體?還是引導程序將arduino的atmega8上的保險絲設置為使用其內部振盪器?從arduino原型轉移到永久PCB版本的電路時,需要知道該時鐘信息。將bootlader寫入atmega8後還剩下多少內存-是7.5 KB而不是8KB?
@qwerty10:您的問題與您的原始問題相距甚遠。這確實應該是一個新問題。
@Edgar Bonet。我猜答案是這樣的,因為它固定在uno板上atmega328的引腳子集(即328的引腳可以與mega8相同),因此需要一個晶體和電容器。
KIIV
2016-08-28 12:53:30 UTC
view on stackexchange narkive permalink

另一種方法(除了具有更多內存的MCU之外)不使用Arduino框架及其庫。這樣的抽象級別在兩種方式上都很昂貴-內存使用率和速度。但這要困難得多。如果需要一些庫,則必須將其移植(如果找不到本機庫),或者至少要提供Arduino所需的功能。

例如在Arduino IDE 1.6.11中,空草圖正在用完444字節的閃存。使用一個 pinMode digitalWrite(13,!digitalRead(13)); + delay(500); 表示964個字節。當然,這些很可能是一次性的。如果再使用六個引腳並進行切換,則它使用的程序存儲器要比使用第一個引腳(1192B)少得多。

在純C空程序中,其長度約為134字節。相同的功能(每500ms切換一個引腳)需要158個字節(並且速度更快)。

但是對於業餘項目,我會選擇ATMega2560或ATMega644 / 1284。

您也可以使用直接訪問硬件。直接使用寄存器來切換引腳草圖,而來自avr庫的_delay_ms使用468字節而不是964B。延遲了Arduino核心庫的版本是602B。

您的意思是“ _delay_ms()”。
這具有實際學習所使用的MCU的額外好處。這些Arduino上的AVR比您認為的“標準庫”要強大得多。 ++
dalearn
2016-08-28 17:30:56 UTC
view on stackexchange narkive permalink

樹莓pi零怎麼辦?我有一對夫婦,經常將它們用作arduinos。

確實應該考慮使用其他體系結構,但是帶有pi的強制性SD卡引導*的嵌入式linux系統會增加很多複雜性,並且以獨特的方式易碎,即使不昂貴。有很多基於較小,集成度更高的ARM MCU的板,它們在應用方面與Arduino非常相似,但功能卻大大增強。但是,如果您需要大量處理或兆字節的內存,那麼是的,這些複雜性就值得了。
我也更喜歡零,因為它是如此靈活。您可以添加更多存儲或將其嵌入項目中,同時還具有足夠大的處理器來執行幾乎所有操作。
deltaray
2016-08-28 17:37:27 UTC
view on stackexchange narkive permalink

您還可以研究其他平台。例如,Teensy 3.2與Arduino兼容,並具有2KB eeprom和64KB RAM。

Trivet
2017-10-03 17:52:19 UTC
view on stackexchange narkive permalink

在問一個廣泛的問題時,包括一些細節會很有幫助。就像有多少內存以及為什麼要使用它。

我曾經以2 KB的程序空間,64字節的RAM和1 KIPS來指定處理器。工程師問MIPS,我每秒要解釋數千個。他回答說,他們來的並不慢。在項目結束時,添加了一個巨大的UI,並且內存緊張...但是仍然沒有問題。

因此,請考慮對正在使用的資源進行更仔細的考慮。

回答這個問題:

1)Arduino沒有提供方便的總線來獲取內存,因此,沒有辦法插入芯片來獲取更多的內存。

2)Arduino具有SPI,因此可以訪問SD卡.SD卡上的任何代碼都需要加載到可執行內存中。這很複雜,不適合初學者...

3 )按照建議,收緊代碼。

3)移至更大的Arduino。

有不同的Arduino處理器。有些在ACR線中,有些在ARM線中。使用同一系列中的其他設備是一個相對適度的更改,最多可以提供368字節的progam FLASH。

基於Arduino ARM的設備非常不同,並且使用不同的庫。

查看Arduino Mega 2560,它與Uno非常相似,具有

AVR系列中的設備更大。

注意,AVR32是不同的處理器,外圍設備也足夠不同

如果要進入超大型程序(千兆字節的內存),請查看Beagleboard。它具有完整的linux,帶有虛擬內存(請參閱上面的#2),並且具有更強大的I / O機制。

也許修正了一些錯別字,例如,何時,3和其他
我的意思是,如果您修正了這些錯字,可能有人會投票贊成您的答案。


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