Soms heb ik te weinig ruimte voor de programmagrootte voor het embedded C-programma dat ik op een Arduino wil zetten. Dus welke chip heb ik nodig om het programmageheugen van de arduino uit te breiden zodat ik grotere C-programmas kan gebruiken met mijn arduino?
Opmerkingen
- Overweeg dat een kerel met de naam Petri H ä kkinen plaatst een arcade-achtig spel op een Atmega328P, misschien moet je kijken naar het besparen van ruimte in je code? Als dat niet ‘ praktisch is, zoals sommige antwoorden zeggen, kun je een grotere chip krijgen met meer programmageheugen. De Atmega644 wordt bijvoorbeeld geleverd in een DIP-chip-pakket.
- Zie ook forum.arduino.cc/index.php?topic= 226465.0
- kunt u uw antwoord wat meer toelichten? 2) De Arduino heeft SPI, dus een SD-kaart is toegankelijk. Elke code op de SD-kaart moet in het uitvoerbare geheugen worden geladen. Dit is ingewikkeld en niet voor beginners … Bedoel je dat je het instructiegeheugen kunt wijzigen of herprogrammeren terwijl het programma loopt? Kan het actieve programma de bootloader oproepen en nieuwe instructies op een ander adres laden? Heeft deze tijd ´ het programmageheugen gewonnen? Een andere oplossing kan zijn: rutines identificeren in je programma en alle ” aanroepen ´ s ” opgeslagen met de gegevens op een extern spi-geheugen … Bedankt!
Antwoord
Een ATmega2560 is de chip om toe te voegen voor meer geheugen als je geen programmageheugen meer hebt op een Uno. Verwijzend naar de Geheugen webpagina op arduino.cc, “zult u zien dat deze Flash = 256 KB, SRAM = 8 KB, EEPROM = 4KB heeft, waar de ATmega328-chip op de Uno heeft Flash = 32KB, SRAM = 2KB, EEPROM = 1KB.
Als je geen programmageheugen meer hebt op een Uno, heb je ongeveer drie praktische keuzes: maak het programma kleiner; verwijder de bootloader (om een of twee KB vrij te maken), gebruik een ander bord met een processor met meer mogelijkheden. De CPU op een Uno-bord heeft geen manier om toegang te krijgen tot programmabytes vanaf andere plaatsen dan de 32KB flash op de chip. De CPU op een Mega2560-bord begint met 8 keer zoveel flash, dus het kan grotere programmas bevatten dan een Uno.
Als je de bootloader verwijdert, kun je in plaats daarvan programmeren met een USBASP-bord, zoals beschreven in een “Programmeer AVR-chip met een USBASP met 10-pins kabel” artikel op learningaboutelectronics.com.
Reacties
- maar als je de bootloader vrijmaakt, hoe zou ik dan de arduino IDE gebruiken om te programmeren?
- @ qwerty10, zie de laatste paragraaf van bewerken. Arduino IDE ondersteunt USBASP ok.
- Zou het niet werken met een programmeur die code kan uploaden naar ATMEGA? In plaats van alleen een USBASP. Zoals ik het begrijp, gebruikt het eigenlijk geen 10 pinnen, maar een subset van die pinnen.
- @ qwerty10, USPASP is een ISP-programmeur (in systeemprogrammering). Over het algemeen kan elke ISP-programmeur worden gebruikt om een chip te programmeren (met of zonder bootloader erop) zolang MOSI-, MISO-, SCK-, RST-, VCC- en GND-pinnen beschikbaar zijn op de doelchip.
- Huidige Unos gebruiken de zeer compacte optiboot bootloader. Als u het verwijdert, worden slechts 512 bytes vrijgemaakt.
Answer
Een andere manier (anders dan MCU met meer geheugen) is geen Arduino-framework en zijn bibliotheken gebruiken. Een dergelijk abstractieniveau is in beide opzichten duur: geheugengebruik en snelheid. Maar dat is veel moeilijker. Als je een bibliotheek nodig hebt, moet je deze porten (als je geen native hebt gevonden) of op zijn minst de vereiste functies van Arduino voorzien.
Bijvoorbeeld in Arduino IDE 1.6.11 lege sketch gebruikt tot 444 bytes aan flash. Het gebruik van een pinMode
en digitalWrite(13, ! digitalRead(13));
+ delay(500);
betekent 964 bytes. Dit zijn natuurlijk hoogstwaarschijnlijk one-timers. Als u nog zes pinnen gebruikt en deze omschakelt, gebruikt het veel minder programmageheugen dan de eerste (1192B). Maar het groeit nog steeds erg snel.
In pure C is een leeg programma ongeveer 134 bytes lang. Dezelfde functionaliteit (om de 500 ms één pin omschakelen) kost 158 bytes (en het is veel sneller).
Maar voor hobbyprojecten zou ik in plaats daarvan voor ATMega2560 of ATMega644 / 1284 gaan.
En je kunt ook directe toegang tot hardware gebruiken. Toggle pin sketch door direct registers te gebruiken en _delay_ms van avr libraries gebruikt 468 bytes in plaats van 964B. Met vertraging van Arduino core libraries is het 602B.
Opmerkingen
- Je bedoelt
_delay_ms()
. - Dit heeft als bijkomend voordeel dat je daadwerkelijk leert over de mcu die je ‘ opnieuw in gebruik. De AVRs op deze Arduinos zijn veel beter in staat dan de ” standaardbibliotheek ” je doet geloven.++
Answer
Hoe zit het met een framboos pi nul ? Ik heb er een paar en gebruik ze vrij vaak als arduinos.
Opmerkingen
- Andere architecturen zouden inderdaad moeten worden overwogen, maar een embedded linux-systeem met verplicht opstarten van de SD-kaart zoals de pi voegt veel complexiteit toe en is op unieke manieren kwetsbaar, zelfs als het niet duurder is. Er zijn veel boards gebaseerd op kleinere, meer sterk geïntegreerde ARM MCUs die qua toepassingen veel meer op een Arduino lijken, maar ook drastisch beter in staat zijn. Maar als je veel verwerking nodig hebt, of megabytes aan geheugen, ja, dan beginnen deze complexiteiten de moeite waard te worden.
- Ik geef ook de voorkeur aan de nul omdat deze zo flexibel is. U kunt meer opslagruimte toevoegen of insluiten in projecten terwijl u ook een processor heeft die groot genoeg is om vrijwel alles te doen.
Answer
Je zou ook naar andere platforms kunnen kijken. Een Teensy 3.2 is bijvoorbeeld Arduino-compatibel en heeft een 2KB eeprom en 64KB RAM.
Antwoord
Wen vragen een brede vraag, is het nuttig om enkele details op te nemen. Zoals hoeveel geheugen en waarom je denkt dat je het nodig hebt.
Ik heb ooit een processor gespecificeerd met 2 KB programmaruimte, 64 bytes RAM en 1 KIPS. De ingenieur vroeg, MIPS, legde ik duizenden per seconde uit. Hij antwoordde dat ze niet zo langzaam komen. Aan het einde van het project werd een enorme gebruikersinterface toegevoegd en werd het geheugen krap … maar nog steeds zonder problemen.
Overweeg dus om bedachtzamer te zijn over de gebruikte bronnen.
Om de vraag te beantwoorden:
1) De Arduino biedt geen handige bus om geheugen op te halen. Er is dus geen manier om een chip om meer geheugen te krijgen.
2) De Arduino heeft SPI, dus een SD-kaart kan worden benaderd. Elke code op de SD-kaart moet in het uitvoerbare geheugen worden geladen. Dit is ingewikkeld en niet voor beginners …
3) Zoals voorgesteld, verscherp je code. Dit is waarschijnlijk een goede manier om te leren.
3) Ga naar een grotere Arduino.
Er zijn verschillende Arduino-processors. Sommige in de ACR-lijn, andere in de ARM-lijn. Naar een ander apparaat in dezelfde familie gaan is een relatief bescheiden verandering en kan tot 368 bytes aan progam FLASH leveren. Maar dit zijn geen Arduino-boards precies.
De op Arduino ARM gebaseerde apparaten zijn erg verschillend en gebruik verschillende bibliotheken.
Bekijk de Arduino Mega 2560, hij lijkt erg op de Uno, heeft een vergelijkbare footprint, code zou relatief gemakkelijk moeten porteren en is niet duur.
Er zijn grotere apparaten in de AVR-familie.
Let op, de AVR32 is een andere processor en de randapparatuur is zo verschillend dat het een ander apparaat is.
Als u in zeer grote programmas ( gigabytes geheugen), bekijk dan het Beagleboard. Het heeft een volledige linux, met virtueel geheugen (zie # 2 hierboven) en heeft krachtigere I / O-mechanismen.
Commentaren
- Herstel misschien wat typefouten, zoals Wen, 3, en differnt
- Ik bedoel, als je die typefouten corrigeert, zou iemand je antwoord kunnen stemmen …