Voiko ohjelmakoodista jotenkin siirtää (kätevästi) tilaa (vakio) muuttujille ?
Auttaisiko ehkä eeprom-muisti ?
Nopeuden ei pitäisi kovinkaan paljoa hidastua.

Valvoja: Moderaattorit
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
|
|
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. ![]() |
|
![]() Jäsen ![]()
Viestit: 144
Liittynyt: La Huhti 12, 2008 14:28 |
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ä? |
Siis AIVAN LOISTAVAA !!! (Sorry kun huusin, mutta tämä tosiaan ratkaisi ongelman).
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. |
|
Innostuin vähän liian aikaisin.
![]() Miksiähän tämä ei tee sitä, mitä olettaisi ?
Siis tulostaa vain inputStringin sisällön:
|
|
Jaahas, ei toimikaan täysin suoraviivaisesti...
... Sillä tämä toimineen...
Lähde: https://www.arduino.cc/reference/en/lan ... s/progmem/ |
|
![]() Jäsen ![]()
Viestit: 144
Liittynyt: La Huhti 12, 2008 14:28 |
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. |
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 ![]()
Viestit: 144
Liittynyt: La Huhti 12, 2008 14:28 |
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. |
Vastaan itselleni:
Täällä on jotain juttua Structuureista... https://arduino.stackexchange.com/quest ... of-structs |
|
Paluu Mikrokontrollerit ja ohjelmointi
Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 1 vierailijaa