Kysymys:
Mitkä ovat FLASH_ARRAY / FLASH_TABLE -makrot tässä koodissa?
Cybergibbons
2014-03-05 04:35:37 UTC
view on stackexchange narkive permalink

Tässä lämmitysmonitorin koodissa näyttää olevan makroja nimeltä FLASH_ARRAY ja FLASH_TABLE . En löydä viitteitä heille tästä koodista, Arduinosta tai Internetistä. Mitä he tekevät?

  FLASH_ARRAY (tavu, VARIABLE_DEVICE_TABLE, DEVICE_LADDNING_RETUR, DEVICE_LADDNING_UT, DEVICE_TANK1, DEVICE_TANK2, ... VARIABLE_ID_LOAD, VARIABLE_PALVELU / p> 
  FLASH_TABLE (tavu, NUMBER_TEMP_TABLE, 7, {DEVICE_LADDNING_RETUR, 99, 5, 10, 7, MAIN_TYPE_TEXT_CELCIUS, 2}, {DEVICE_LADDNING_UT, 99, 43, 10, 7, MAIN_TYP. .. {DEVICE_UTE, 0, 55, 15, 7, MAIN_TYPE_TEXT_CELCIUS_WITH_NEGATIVE, 103}, {VARIABLE_ID_EFFECT, 114, 29, 10, 7, MAIN_TYPE_TEXT_VARIABLE, 2}); 
Kaksi vastused:
#1
+5
Cybergibbons
2014-03-05 04:42:39 UTC
view on stackexchange narkive permalink

Kaivamisen jälkeen tämä näyttää olevan Mikal Hartin Flash-kirjastosta.

Tämän kirjaston kehittämisen syy on:

Tallentaminen staattinen ohjelmatieto Flash / PROGMEM -ohjelmassa on hankala osa arduino-ohjelmointia. Kallisarvoisen RAM-muistin säästämiseksi aloittelevan käyttäjän, jolla on jo tuntematon C ++ -syntaksi, on sulatettava sellaiset pelottavat käsitteet kuin asprog_char, PSTR (), PROGMEM, pgm_read_word () jne. Jopa kokeneet käyttäjät laukaistaan ​​tarvittavalla indirektiolla ja tyyppimerkinnällä, jotta voidaan hakea kelvollisia PROGMEM-tietoja . Lisää siihen muutama ilmeinen vika toteutuksessa, ja on selvää, että PROGMEM on monimutkainen sotku.

Olen kirjoittanut uuden kirjaston, Flashin, joka tiivistää suurimman osan tästä monimutkaisuudesta. Se tarjoaa uusia merkkijono-, taulukko-, taulukko- ja merkkijonotyyppejä, jotka tekevät ROM-pohjaisten tietojenkeräysten käytöstä yhtä helppoa kuin “normaalit” tyypit. Kukin ohittaa C ++ [] -operaattorin, joten yksittäisten elementtien purkamiseen käytetään tuttua matriisin käytön syntaksia:

Tarkemmin sanottuna nämä ovat makroja ja yksinkertainen apuluokka helpottaakseen taulukoiden arvot ohjelmamuistissa.

Kaksi makroa ilmoitetaan näin:

  // Esimerkki: FLASH_ARRAY (kelluva, lämpötilat, 98.1, 98.5, 99.1, 102.1); # määritä FLASH_ARRAY (tyyppi, nimi, arvot ...) \ staattinen const-tyypin nimi ## _ flash [] PROGMEM = {arvot}; \ _FLASH_ARRAY<type> name (name ## _ flash, sizeof (name ## _ flash) / sizeof (type)); // Esimerkki: FLASH_TABLE (uint8_t, fontit, 7, {ON, OFF, ON, ON, OFF, ON, OFF}) , {OFF, ON, OFF, ON, OFF, ON, OFF}); # define FLASH_TABLE (tyyppi, nimi, sarakkeet, arvot ...) \ staattinen const-tyypin nimi ## _ flash [] [cols] PROGMEM = {arvot }; \ _FLASH_TABLE<type> name ((const PROGMEM type *) name ## _ flash, sizeof (name ## _ flash) / sizeof (name ## _ flash [0]), cols);  

Auttaja toiminnot sisältävät koon ja ohittavat operaattorin [], jotta niihin pääsee helposti käsiksi.

  FLASH_ARRAY [0]  

Olen eri mieltä zmo: sta - tämä on enemmän kuin kattilalevy. PROGMEM-alue aiheuttaa paljon kysymyksiä Arduino-käyttäjiltä, ​​ja on erittäin helppoa tehdä asioita väärin, kun luot taulukoita PROGMEM-sovelluksessa.

Voisitko lisätä selityksen makroista vastaukseen? Tämä vastaus sisältää vain linkin, eikä siitä ole paljon hyötyä, jos linkki menee offline-tilaan.
Cybergibbons, tämä on mukavaa, kätevää ja hyödyllistä, mutta tämä lisää ehdottomasti ei-triviaalia yleiskustannuksia: se kapseloi objektin täydelliseen esiintymään. Kun sinulla on vain 2 kt RAM-muistia, jokainen tavu on arvokas.
#2
+4
zmo
2014-03-05 07:43:33 UTC
view on stackexchange narkive permalink

Flash-taulukko on peräisin Mikal Hartin flash-kirjastosta, kun näytät, ja mitä se tekee, on se, että he ilmoittavat matriisi tai matriisi (taulukko) -objektin PROGMEM-muistiin:

#define FLASH_ARRAY (tyyppi, nimi, arvot ...) \ staattinen const-tyypin nimi ## _ flash [] PROGMEM = {arvot}; \ _FLASH_ARRAY<type> name (nimi ## _ flash, sizeof (name ## _ flash) / sizeof (type));

joka on määritetyn luokan _FLASH_ARRAY esiintymä samassa tiedostossa, jolla pääsee käyttämään PROGMEM / Flash-muistia.

Periaatteessa se on paljon kattilaa sille, mitä PSTR () -makro jo tekee muun joukossa pgmspace.h . Henkilökohtaisesti haluan välttää sen käyttöä ja mieluummin käyttää alkuperäisiä makroja omien hakemistojeni ja osoittimien kanssa.

BTW, luulen, että joitain Arduono IDE -taikuuksia ei mielestäni voi kääntää, koska Flash.h ei sisälly.

MUOKKAA:

Uuden pisteen tekeminen FLASH_TABLE / FLASH_ARRAY kattilakivi / yleiskustannus, koska avc-gcc 4.8 on otettu käyttöön __flash -määritelmä, joka korvaa PROGMEM -makron, yksinkertaistaen kaikkea :

  // käyttääksesi merkkijonoliteraaleja ilman, että sinun tarvitsee heittää # define FSTR (X) ((const __flash char []) {X}) / / luo merkkijono pstr .progmem.data-osoitetilaan __flash char * pstr = FSTR ("foo"); 

eikä enää tarvita pgm_read _ * () -toimintoja, voit nyt käyttää flash-muistin sisältöä * pstr -toiminnolla , kuten on esitetty, on tämä säie. Jos haluat pitää koodin yhteensopivana avr-gcc: n vanhemman version kanssa, tässä on viesti, joka tarjoaa makroja käsittelemään molempia järjestelmiä.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...