Arduino -Klent med ram minne.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Arduino -Klent med ram minne.

Inlägg av lillahuset »

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.
nifelheim
Den första
Inlägg: 2325
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: Arduino -Klent med ram minne.

Inlägg av nifelheim »

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 :)
Användarvisningsbild
hawkan
Inlägg: 2621
Blev medlem: 14 augusti 2011, 10:27:40

Re: Arduino -Klent med ram minne.

Inlägg av hawkan »

Glattnos
Inlägg: 2984
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino -Klent med ram minne.

Inlägg av Glattnos »

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 ^^
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Arduino -Klent med ram minne.

Inlägg av Mr Andersson »

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.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino -Klent med ram minne.

Inlägg av orvar-e »

Härligt gubbar, fan va kul!! .... :tumupp:
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]))
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.

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 );
  }
}
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino -Klent med ram minne.

Inlägg av orvar-e »

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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino -Klent med ram minne.

Inlägg av Icecap »

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.
Användarvisningsbild
hawkan
Inlägg: 2621
Blev medlem: 14 augusti 2011, 10:27:40

Re: Arduino -Klent med ram minne.

Inlägg av hawkan »

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.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Arduino -Klent med ram minne.

Inlägg av lillahuset »

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.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino -Klent med ram minne.

Inlägg av orvar-e »

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.
Mja, du dår nog kliva ner från de där höga hästarna tror jag.

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.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Arduino -Klent med ram minne.

Inlägg av lillahuset »

Posta länk till datablad för OLEDen och biblioteket.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino -Klent med ram minne.

Inlägg av Icecap »

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.
Senast redigerad av Icecap 3 april 2018, 20:33:50, redigerad totalt 1 gång.
olof_n
Inlägg: 116
Blev medlem: 23 februari 2011, 21:36:46

Re: Arduino -Klent med ram minne.

Inlägg av olof_n »

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.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Arduino -Klent med ram minne.

Inlägg av lillahuset »

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.
Skriv svar