Arduino -Klent med ram minne.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Arduino -Klent med ram minne.
I de flesta miljöer jag har testat så räcker det att deklarera dem "const".
Med AVR däremot har jag för mig att man var tvungen att använda något annat direktiv om man använder avr-gcc som jag tror Arduino gör. Detta pga att flashminnet inte ingår i samma "memory space" som RAM och man behöver en speciell instruktion för att hämta data där.
Inget komplicerat bara man vet hur det fungerar. Tyvärr är det evigheter, nåja tjugo år iallafall, sedan jag använde AVR. Kolla dokumentationen för AVR-gcc.
Med AVR däremot har jag för mig att man var tvungen att använda något annat direktiv om man använder avr-gcc som jag tror Arduino gör. Detta pga att flashminnet inte ingår i samma "memory space" som RAM och man behöver en speciell instruktion för att hämta data där.
Inget komplicerat bara man vet hur det fungerar. Tyvärr är det evigheter, nåja tjugo år iallafall, sedan jag använde AVR. Kolla dokumentationen för AVR-gcc.
Re: Arduino -Klent med ram minne.
Arduino mega2560 mini, 8k SRAM, t ex:
https://www.ebay.com/itm/New-Small-Medu ... 2593120251
men det låter som om du ska börja med att ta reda på hur mycket minne du behöver
https://www.ebay.com/itm/New-Small-Medu ... 2593120251
men det låter som om du ska börja med att ta reda på hur mycket minne du behöver
Re: Arduino -Klent med ram minne.
Prova detta: https://bitbucket.org/tinusaur/ssd1306xled
Jag har provat det och det funkar mycket bättre, jag har visserligen bantat även den koden lite men då blev ett projekt där jag visar en logga, en bar-graf och lite text på displayen såhär:
Program Memory Usage : 2238 bytes 13,7 % Full
Data Memory Usage : 1 bytes 0,1 % Full
Och då är det på ATmega168 som har 16K Flash och 1K RAM
Edit: Jag tyckte att endast 1 byte RAM verkade lite men när jag kollade så är det så, den byten är antal bars i bar-grafen ^^
Jag har provat det och det funkar mycket bättre, jag har visserligen bantat även den koden lite men då blev ett projekt där jag visar en logga, en bar-graf och lite text på displayen såhär:
Program Memory Usage : 2238 bytes 13,7 % Full
Data Memory Usage : 1 bytes 0,1 % Full
Och då är det på ATmega168 som har 16K Flash och 1K RAM
Edit: Jag tyckte att endast 1 byte RAM verkade lite men när jag kollade så är det så, den byten är antal bars i bar-grafen ^^
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Arduino -Klent med ram minne.
GCCs minnesrapport är extremt felvisande. Den räknar bara statiskt allokerat RAM och ignorerar heap och stack. Det är inga problem att fylla minnet till 100% och ändå få gcc att visa 0 byte använt.
Re: Arduino -Klent med ram minne.
Härligt gubbar, fan va kul!! ....
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
Då kan man radda upp all text som ska visas, och sedan hämta den med några enkla siffror. byta ut 'i' mot siffran som motsvarar önskad textrad.
Och texten till display, belastar inte ram minnet som jag förstår det, utan bränns ner i flash minnet vi nerladdning.
Synd att jag inte har tillgång till mitt projekt i skrivande stund, ska bli kul att testa.
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
Då kan man radda upp all text som ska visas, och sedan hämta den med några enkla siffror.
Kod: Markera allt
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))
Och texten till display, belastar inte ram minnet som jag förstår det, utan bränns ner i flash minnet vi nerladdning.
Synd att jag inte har tillgång till mitt projekt i skrivande stund, ska bli kul att testa.
Kod: Markera allt
#include <avr/pgmspace.h>
const char string_0[] PROGMEM = "String 0"; // "String 0" etc are strings to store - change to suit.
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";
// Then set up a table to refer to your strings.
const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};
char buffer[30]; // make sure this is large enough for the largest string it must hold
void setup()
{
Serial.begin(9600);
while(!Serial); // wait for serial port to connect. Needed for native USB
Serial.println("OK");
}
void loop()
{
/* Using the string table in program memory requires the use of special functions to retrieve the data.
The strcpy_P function copies a string from program space to a string in RAM ("buffer").
Make sure your receiving string in RAM is large enough to hold whatever
you are retrieving from program space. */
for (int i = 0; i < 6; i++)
{
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy.
Serial.println(buffer);
delay( 500 );
}
}
Re: Arduino -Klent med ram minne.
Glattnos ... ska testa ditt tips i morgon om tid finns.
Med den kod jag har nu så finns inget utrymme för övrigt. Och det spelar ingen roll om jag använder PROGMEM kom jag fram till ganska snart.
Man måste ju ändå skriva en massa kod som tar plats. Exempel, måste ju koda vart på displayen man vill ha texten.
Med den kod jag har nu så finns inget utrymme för övrigt. Och det spelar ingen roll om jag använder PROGMEM kom jag fram till ganska snart.
Man måste ju ändå skriva en massa kod som tar plats. Exempel, måste ju koda vart på displayen man vill ha texten.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Arduino -Klent med ram minne.
Alltså - har man konstanter (text, värden...) i en ATmega MÅSTE den ju - vid boot - kopiera dom från PROGMEM till RAM varför funktionen för detta redan finns i skiten.
Att positionerna i displayen är ett problem är svårt för mig att förstå, iaf. om de är konstanta. Jag har själv "ett projekt eller två" där jag använder ett 16/20*2 LCD och där min rutin till att skriva ut till LCD'n tolkar en '\x01' som "start av rad 1" och '\x02' som "start av rad 2".
Men då har jag ju en egenutvecklad optimerat rutin för att skriva till LCD.
Att positionerna i displayen är ett problem är svårt för mig att förstå, iaf. om de är konstanta. Jag har själv "ett projekt eller två" där jag använder ett 16/20*2 LCD och där min rutin till att skriva ut till LCD'n tolkar en '\x01' som "start av rad 1" och '\x02' som "start av rad 2".
Men då har jag ju en egenutvecklad optimerat rutin för att skriva till LCD.
Re: Arduino -Klent med ram minne.
Vad jag har förstått så fungerar skiten så att värden för globala variabler kopieras från progrmem till ram vid uppstart. Värden för variabler i en function / på stacken kopieras när man går in i funktionen. Med progmem och de funktionerna kan man styra när kopieringen och platsupptagande i ram ska ske om man tycker man vet bättre än kompilatorn.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Arduino -Klent med ram minne.
Jag minns inte hur det är i AVRen för det var så länge sedan men det normala är att bootkoden, om man programmerar C, gör följande:
Skriver 0 i allt minne som hör till .bss, det vill säga globala och lokala statiska variabler med värdet 0 vid uppstart, alltså även variabler utan definierat värde.
Kopierar ett block med data till .data, det vill säga globala och lokala statiska variabler med värde skilt från noll.
Allt minne på stacken, det vill säga lokala variabler i funktioner som inte är deklarerade 'static' är odefinierat, alltså bara skräp.
Skriver 0 i allt minne som hör till .bss, det vill säga globala och lokala statiska variabler med värdet 0 vid uppstart, alltså även variabler utan definierat värde.
Kopierar ett block med data till .data, det vill säga globala och lokala statiska variabler med värde skilt från noll.
Allt minne på stacken, det vill säga lokala variabler i funktioner som inte är deklarerade 'static' är odefinierat, alltså bara skräp.
Re: Arduino -Klent med ram minne.
Mja, du dår nog kliva ner från de där höga hästarna tror jag.Icecap skrev: Att positionerna i displayen är ett problem är svårt för mig att förstå, iaf. om de är konstanta. Jag har själv "ett projekt eller två" där jag använder ett 16/20*2 LCD och där min rutin till att skriva ut till LCD'n tolkar en '\x01' som "start av rad 1" och '\x02' som "start av rad 2".
Men då har jag ju en egenutvecklad optimerat rutin för att skriva till LCD.
Biblioteket för LCD väger ju nästan inget, testade nu, ett standard "Hello World" meddelande på en LCD tar bara 219 byte du har 90% kvar.
Men det oled bibliotek jag använder går det åt 1511 byte för att göra samma sak. Och efter som att IDE programmet upplyser användaren om klen minne när ca 500 byte återstår så har man kanske 500 byte att leka med, för att vara på den säkra sidan. Jag har ingen användning av bara 500 byte, det är som att försöka äta sig mätt på donken för en tio krona. Visst är du väldigt liten i maten eller redan ätit nån annanstans funkar det väl, annars blir du bara förbannad över att du inte har större resurser.
Men jag ska utvärdera Glattnos tips i kväll om tid finnes.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Arduino -Klent med ram minne.
orvar-e: jag är inte på någon hög häst - men jag kan lägga in positionsvärden i strängar och då formatera utskrifter utan problem och det verkar ju vara ett problem för dig.
Konstanter i PROGMEM stannar kvar där och tar inte RAM innan kopieringen måste ske. Men med en så gammal typ processor är det väl OK, jag jobbar inte med dom av många anledningar varav de nämnda problem är en del av det.
Konstanter i PROGMEM stannar kvar där och tar inte RAM innan kopieringen måste ske. Men med en så gammal typ processor är det väl OK, jag jobbar inte med dom av många anledningar varav de nämnda problem är en del av det.
Senast redigerad av Icecap 3 april 2018, 20:33:50, redigerad totalt 1 gång.
Re: Arduino -Klent med ram minne.
Om du fortfarande vill köra ATmega så kan jag tipsa om ATmega1284P som har 16KB RAM
Eller så väljer du någon nyare och billigare MCU. Jobbigt att behöva skriva ett eget bibliotek för ssd1306, Adafruits bibliotek borde väl inte vara alltför dåligt.
Nu har ju andra tipsat om ESP8266 och STM32. Dock kostar en STM32F103 "Blue pill" 20:-. 72MHz, 64K flash, 20K SRAM och stöd för "Arduino".
ESP8266 är ju kanon men har lite dåligt med in/utgångar.
Eller så väljer du någon nyare och billigare MCU. Jobbigt att behöva skriva ett eget bibliotek för ssd1306, Adafruits bibliotek borde väl inte vara alltför dåligt.
Nu har ju andra tipsat om ESP8266 och STM32. Dock kostar en STM32F103 "Blue pill" 20:-. 72MHz, 64K flash, 20K SRAM och stöd för "Arduino".
ESP8266 är ju kanon men har lite dåligt med in/utgångar.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Arduino -Klent med ram minne.
orvar-e: Om det bara handlar om text och lite linjer på displayen är det snudd på trivialt att skriva ett bibliotek som kräver knappt något RAM.