[Ratkstu]Voiko Arduinon 2k:n muuttujien rajoitusta kiertää?

Keskustelua mikrokontrollereista ja niiden ohjelmoinnista.

Valvoja: Moderaattorit


Jäsen
Jäsen
Viestit: 129
Liittynyt: La Maalis 17, 2012 14:43
ViestiLähetetty: Pe Marras 17, 2017 20:07
Olen koodaamassa yksinkertaista ohjelmaa, jossa ohjelmakoodi vie noin 10 kt ja muuttujat vievät 2 kt.

Voiko ohjelmakoodista jotenkin siirtää (kätevästi) tilaa (vakio) muuttujille ?

Auttaisiko ehkä eeprom-muisti ?

Nopeuden ei pitäisi kovinkaan paljoa hidastua. :(
Viimeksi muokannut peran päivämäärä Ma Marras 20, 2017 17:16, muokattu yhteensä 1 kerran

Guru
Guru
Viestit: 634
Liittynyt: Pe Tammi 12, 2007 10:23
Paikkakunta: Nokia
ViestiLähetetty: Ma Marras 20, 2017 12:34
Onnistuuko pakkaamalla? purkukoodi ei ole hirveän iso ja jos pakkaa datan ja purkaa sen vaikka lisämuistille, niin vois tomia? toinen vaihtoehto on liitää sovelluksee flash muisti.

Jäsen
Jäsen
Viestit: 129
Liittynyt: La Maalis 17, 2012 14:43
ViestiLähetetty: Ma Marras 20, 2017 16:03
Raimo kirjoitti:Onnistuuko pakkaamalla? purkukoodi ei ole hirveän iso ja jos pakkaa datan ja purkaa sen vaikka lisämuistille, niin vois tomia? toinen vaihtoehto on liitää sovelluksee flash muisti.


Pakkaaminen on mahdollista, ja sitä olen miettinytkin. Se tosin hankaloittaa koodia, kun tieto kulkee sarja-liikenteenä.
Jos sais pakattua %50:iin, niin sekin riittää mainiosti.

Toi Flash-muisti on hyvä idea tosin vaatisi vielä vähän opiskelua. Lisäksi olen miettinyt SD-kortin käyttöä. Valitettavasti kyseiset ratkaisut nostavat hintaa, ja muutenkin monimutkaistavat kovo puolta.

Nopeusvaatimus on mittaluokkaa 500 µs, joten se ei nyt aivan mahdoton ole 16 MHz:n kiteelle.

Tulin vaan nillittämään sitä, että miksei ATMelissa voi edes vakioita esittää keskusmuistin kautta.

Yksi monista vaihtoehdoista olisi myös Arduino Yun, jossa taitaa olla täysverinen Linukka ATmelin kaverina. Se on kylläkin yliampuvaa ongelmaani.

Edit - Ratkaisin yksinkertaisella tavalla (,jota tosin en ole vielä tehnyt). Annan muuttujien pyörähtää rauhassa ympäri, enkä ota stressiä monennessa kierroksessa osuma tulee. Pitää vielä vakiot pakata. Kiitos. (Siis ratkaisuni on tekemistä vaille valmis. :mrgreen: )

Jäsen
Jäsen
Viestit: 143
Liittynyt: La Huhti 12, 2008 14:28
Paikkakunta: salo
ViestiLähetetty: Ma Marras 20, 2017 17:23
Hei.
Kyllä avr:ssä pystyy tallentaa vakiot suoraan flash osioon. Esim. Grafisten näyttöjen fontit yleensä kirjoitetaan ohjelma flashiin.
http://www.avrfreaks.net/forum/tut-c-gc ... ic&t=38003

Toinen kysymys on, että voiko muistinkäyttöä optimoida?
Funktioilla ja glopalejen muuttujien vähentämisellä?

Jäsen
Jäsen
Viestit: 129
Liittynyt: La Maalis 17, 2012 14:43
ViestiLähetetty: Ma Marras 20, 2017 18:17
pielinen kirjoitti:Hei.
Kyllä avr:ssä pystyy tallentaa vakiot suoraan flash osioon. Esim. Grafisten näyttöjen fontit yleensä kirjoitetaan ohjelma flashiin.
http://www.avrfreaks.net/forum/tut-c-gc ... ic&t=38003


Siis AIVAN LOISTAVAA !!!
(Sorry kun huusin, mutta tämä tosiaan ratkaisi ongelman).

pielinen kirjoitti:Toinen kysymys on, että voiko muistinkäyttöä optimoida?
Funktioilla ja glopalejen muuttujien vähentämisellä?


Kuten aikaisemmin mainitsin, niin kyseiset toiminnat eivät välttämättä toimi aivan niin kuin tarve olisi (siis järkevästi).

Kyseessä tosin on yksinkertainen tilakone. Kyseinen tilakone tehdään kahdessa luokassa (Node,luokka ja tree-luokka).
Se on yksinkertaistettu haku-algoritmi Knuth–Morris–Pratt:n algoritmista. (Siinähän nopeus on O(n):n tai O(m*m), mutta omani toimii hitaimmillaan O(n*m), mutta yleensä pääsee samaan O(n):ään, ja kuluttaa huomattavasti vähemmän muistia kuin perus KMP:n algoritmi. n on tekstin pituus, josta haetaan, ja m on hakusanan pituus).

Täysin 100% osumatarkkuutta ei tavoiteltu, eikä algoritmini sitä teekään, mutta riittävään tarkkuuteen päästään omallakin algoritmillani.

Edit - Kyseessä taitaa olla vastaava tiedon sisältö kuin toi fonttien grafiikan kirjoittaminen muistiin.

Jäsen
Jäsen
Viestit: 129
Liittynyt: La Maalis 17, 2012 14:43
ViestiLähetetty: Ma Marras 20, 2017 19:55
Innostuin vähän liian aikaisin. :?:

Miksiähän tämä ei tee sitä, mitä olettaisi ?

Koodi: Valitse kaikki
const char outputString2[] PROGMEM = "Yritetaanpas uudestaan saada kuluttaa muistia!";
const char inputString[] = "Jaahas toimiikos tama sitten todellisuudessa ?";         
  // a String to hold incoming data


boolean stringComplete = false;  // whether the string is complete
int count=0;
void setup() {
  // initialize serial:
  Serial.begin(115200);
  // reserve 200 bytes for the inputString:
  //inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  count++;
  Serial.print(count);
  Serial.println(inputString);
  Serial.println(outputString2);
  delay(1000);
}


Siis tulostaa vain inputStringin sisällön:
Koodi: Valitse kaikki
OZ⸮1Jaahas toimiikos tama sitten todellisuudessa ?

2Jaahas toimiikos tama sitten todellisuudessa ?

3Jaahas toimiikos tama sitten todellisuudessa ?

...

Jäsen
Jäsen
Viestit: 129
Liittynyt: La Maalis 17, 2012 14:43
ViestiLähetetty: Ma Marras 20, 2017 20:31
Jaahas, ei toimikaan täysin suoraviivaisesti...

... Sillä tämä toimineen...
Koodi: Valitse kaikki
// save some unsigned ints
const PROGMEM  uint16_t charSet[]  = { 65000, 32796, 16843, 10, 11234};

// save some chars
const char signMessage[] PROGMEM  = {"I AM PREDATOR,  UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};

unsigned int displayInt;
int k;    // counter variable
char myChar;


void setup() {
  Serial.begin(115200);
  while (!Serial);  // wait for serial port to connect. Needed for native USB

  // put your setup code here, to run once:
  // read back a 2-byte int
  for (k = 0; k < 5; k++)
  {
    displayInt = pgm_read_word_near(charSet + k);
    Serial.println(displayInt);
  }
  Serial.println();

  // read back a char
  for (k = 0; k < strlen_P(signMessage); k++)
  {
    myChar =  pgm_read_byte_near(signMessage + k);
    Serial.print(myChar);
  }

  Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:
}


Lähde: https://www.arduino.cc/reference/en/lan ... s/progmem/

Jäsen
Jäsen
Viestit: 143
Liittynyt: La Huhti 12, 2008 14:28
Paikkakunta: salo
ViestiLähetetty: Ma Marras 20, 2017 20:53
Tuossa lähettämässäni linkissä oli tietoa tuosta. Jos käyttää sarjaportti kirjastoa, niin se ei välttämättä tue flash muistin pointtereita.

En nyt muista tarkkaan miten tuon sai tehtyä viksusti, kun on taas muutama vuosi aikaa.

Jäsen
Jäsen
Viestit: 129
Liittynyt: La Maalis 17, 2012 14:43
ViestiLähetetty: Ma Marras 20, 2017 21:39
pielinen kirjoitti:Tuossa lähettämässäni linkissä oli tietoa tuosta. Jos käyttää sarjaportti kirjastoa, niin se ei välttämättä tue flash muistin pointtereita.


Itse asiassa se ei haittaa muuta kuin debuggausta. Sen mitä tarvitsen on, että toimiiko siinä osoittimen osoittimet.
Eli PROGMEM:n vakio osoittaa PROGMEM:n toiseen osoitteeseen.

Lisäksi olisi kiva saada luokat/struckturit toimimaan, niin vähentäisi purkkaa koodissa.

No, tämä kuitenkin ratkaisi varsinaisen ongelman. Pitää vain perehtyä PROGMEM:n käyttöön.

Ihmettelen vain, miksei kääntäjä oletuksena polta vakioita ohjelma-muistiin, kun ne eivät kuitenkaan muutu ajon aikana, ja niillä siten olisi temmellyskenttänä koko 32kt-ohjelmamuisti.

Se taitaisi monimutkaistaa kääntäjää, ja siksi kyseisen ratkaiseminen jätetään ohjelmoijan harteille.

Jäsen
Jäsen
Viestit: 143
Liittynyt: La Huhti 12, 2008 14:28
Paikkakunta: salo
ViestiLähetetty: Ma Marras 20, 2017 22:25
Flash on yleensä hitaampi kuin ram. Sen takia muutujat käsitellään ramissa. Toinen on, että flashin muutujien käsittely prosessorilla on monimutkaisempaa, siis rautatasolla.

Pointeri kannattaa olla ramissa, muuten sen käyttö on hankalaa. Olettaisin, etteivät ne vie paljontilaa. En tiedä, että voiko pontterin osoite edes olla flash muistissa.

Struktuurit muistaakseni toimii myös flash vakioiden kanssa.

Debugaukseen voi tehdä pienen bufferin ja funktion jolla lukee flashista ramiin pätkän ja lähettää sen. Memory kopiolla.

Jäsen
Jäsen
Viestit: 129
Liittynyt: La Maalis 17, 2012 14:43
ViestiLähetetty: Ti Marras 21, 2017 9:13
Vastaan itselleni:

Täällä on jotain juttua Structuureista...
https://arduino.stackexchange.com/quest ... of-structs

Paluu Mikrokontrollerit ja ohjelmointi

Paikallaolijat

Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 2 vierailijaa