Küsimus:
Mis on selle koodi makrosid FLASH_ARRAY / FLASH_TABLE?
Cybergibbons
2014-03-05 04:35:37 UTC
view on stackexchange narkive permalink

Selles kütmismonitori koodis näivad olevat makrod nimega FLASH_ARRAY ja FLASH_TABLE . Ma ei leia nendest viidetest ei selles koodis, Arduinos ega Internetis. Mida nad teevad?

/ p>
  FLASH_TABLE (bait, 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});  
Kaks vastused:
#1
+5
Cybergibbons
2014-03-05 04:42:39 UTC
view on stackexchange narkive permalink

Pärast edasist kaevamist näib see olevat pärit Mikal Harti Flash-teegist.

Selle teegi väljatöötamise põhjus on järgmine:

Salvestamine staatilised programmiandmed flash / PROGMEM-is on keeruline osa Arrduino programmeerimisest. Väärtusliku RAM-i salvestamiseks peab algaja kasutaja, kellel on juba harjumatu C ++ süntaks, seedima selliseid hirmutavaid mõisteid nagu asprog_char, PSTR (), PROGMEM, pgm_read_word () jne. Isegi kogenud kasutajad on komistanud kehtiva PROGMEM-i andmete otsimiseks . Lisage sellele rakenduses paar ilmset viga ja on selge, et PROGMEM on keeruline segadus.

Olen kirjutanud uue teegi Flash, mis tõmbab suurema osa sellest keerukusest ära. See pakub uusi stringi-, massiivi-, tabeli- ja stringimassiivitüüpe, mis muudavad ROM-põhised andmekogumid sama hõlpsasti kasutatavaks kui „tavalised” tüübid. Igaüks alistab operaatori C ++ [], nii et üksikute elementide väljavõtmiseks kasutatakse tuttavat massiivi juurdepääsu süntaksit:

Täpsemalt, need on makrod ja lihtne abiklass, et hõlbustada massiivide ja tabelite loomist väärtused programmi mälus.

Kaks makrot deklareeritakse nii:

  // Näide: FLASH_ARRAY (ujuk, temperatuurid, 98.1, 98.5, 99.1, 102.1); # define FLASH_ARRAY (tüüp, nimi, väärtused ...) \ staatiline const tüübi nimi ## _ flash [] PROGMEM = {väärtused}; \ _FLASH_ARRAY<type> nimi (nimi ## _ flash, sizeof (name ## _ flash) / sizeof (type)); // Näide: FLASH_TABLE (uint8_t, fondid, 7, {ON, OFF, ON, ON, OFF, ON, OFF} , {OFF, ON, OFF, ON, OFF, ON, OFF}); # defineeri FLASH_TABLE (tüüp, nimi, veerud, väärtused ...) \ staatiline const tüüpi nimi ## _ flash [] [cols] PROGMEM = {väärtused }; \ _FLASH_TABLE<type> name ((const PROGMEM type *) name ## _ flash, sizeof (name ## _ flash) / sizeof (name ## _ flash [0]), cols);  

abistaja funktsioonid hõlmavad suurust ja alistavad operaatori [], nii et neile oleks hõlpsasti juurdepääs.

  FLASH_ARRAY [0]  

Ma ei nõustu zmo-ga - see on midagi enamat kui boilerplate. Programmi PROGMEM ala tekitab Arduino kasutajatelt palju küsimusi ja massiivide loomisel programmis PROGMEM on väga lihtne valesti teha.

Kas saaksite vastuse juurde lisada makrode selgituse? See link sisaldab ainult linki ja sellest pole palju kasu, kui link läheb võrguühenduseta.
Cybergibbons, see on tore, käepärane ja kasulik, kuid see lisab kindlasti mitte triviaalset üldkulusid: see kapseldab objekti täielikus eksemplaris. Kui teil on ainult 2k RAM-i, on iga bait väärtuslik.
#2
+4
zmo
2014-03-05 07:43:33 UTC
view on stackexchange narkive permalink

Flash-massiiv pärineb teie näitamisel Mikal Harti flash-teegist ja see tähendab, et nad deklareerivad massiivi või maatriksi (tabeli) objekti PROGMEM-mälus:

#define FLASH_ARRAY (tüüp, nimi, väärtused ...) \ static const tüüpi nimi ## _ flash [] PROGMEM = {väärtused}; \ _FLASH_ARRAY<type> nimi (nimi ## _ flash, sizeof (name ## _ flash) / sizeof (type));

mis on klassi _FLASH_ARRAY eksemplar selles samas failis, mis on juurdepääs PROGMEM / Flash-mälule.

Põhimõtteliselt on see palju katusekomplekti selle jaoks, mida makro PSTR () juba teeb muu hulgas pgmspace.h . Ma isiklikult väldiksin selle kasutamist ja eelistaksin kasutada algupäraseid makrosid koos oma indeksi ja kursoritega.

BTW, välja arvatud mõned Arduono IDE maagiad, ei usu, et see kompileeriks, kuna > Flash.h ei kuulu komplekti.

MUUDA:

Uue punkti loomiseks FLASH_TABLE / FLASH_ARRAY code vastu > boilerplate / overhead, kuna avc-gcc 4.8 on sisse viidud kvalifikaatori __flash , mis asendab makrot PROGMEM , lihtsustades kogu värki :

  // string literaalide kasutamiseks ilma, et peaksite # defineerima FSTR (X) ((const __flash char []) {X}) / / stringi pstr loomine .progmem.andmete aadressi ruumis __flash char * pstr = FSTR ("foo"); 

ja funktsioone pgm_read _ * () enam ei kasutata, pääsete nüüd välkmälu sisule * pstr , nagu on näidatud, on see lõime. Kui soovite hoida koodi avr-gcc vanema versiooniga ühilduvana, siin on postitus, mis pakub makrosid mõlema süsteemiga tegelemiseks.



See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...