Vraag:
Wat zijn de FLASH_ARRAY / FLASH_TABLE-macro's in deze code?
Cybergibbons
2014-03-05 04:35:37 UTC
view on stackexchange narkive permalink

In deze code voor verwarmingsmonitor lijken er macro's te zijn genaamd FLASH_ARRAY en FLASH_TABLE . Ik kan er noch in deze code, Arduino, noch op internet naar verwijzen. Wat doen ze?

  FLASH_ARRAY (byte, VARIABLE_DEVICE_TABLE, DEVICE_LADDNING_RETUR, DEVICE_LADDNING_UT, DEVICE_TANK1, DEVICE_TANK2, ... VARIABLE_ID_LOPTY_TI> / p> 
  FLASH_TABLE (byte, NUMBER_TEMP_TABLE, 7, {DEVICE_LADDNING_RETUR, 99, 5, 10, 7, MAIN_TYPE_TEXT_CELCIUS, 2}, {DEVICE_LADDNING_UT, 99_ 43, 10, 7, MAIN_TYPE_TEXT_CELCIUS, 2}, {DEVICE_LADDNING_UT, 99_TEUS_TYPE},. .. {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});  
Twee antwoorden:
Cybergibbons
2014-03-05 04:42:39 UTC
view on stackexchange narkive permalink

Na verder graven blijkt dit afkomstig te zijn van Mikal Hart's Flash-bibliotheek.

De reden dat deze bibliotheek is ontwikkeld is:

Opslaan statische programmagegevens in flash / PROGMEM zijn een lastig onderdeel van Arduino-programmering. Om kostbare RAM te sparen, moet een beginnende gebruiker die al een onbekende C ++ -syntaxis heeft, zulke ontmoedigende concepten verwerken alsprog_char, PSTR (), PROGMEM, pgm_read_word (), enz. Zelfs ervaren gebruikers worden overvallen door de indirecte en typecasting die nodig zijn om geldige PROGMEM-gegevens te verkrijgen . Voeg daar een paar duidelijke bugs in de implementatie aan toe, en het is duidelijk dat PROGMEM een gecompliceerde puinhoop is.

Ik heb een nieuwe bibliotheek geschreven, Flash, die de meeste van deze complexiteit wegneemt. Het biedt nieuwe String-, Array-, Table- en String Array-typen die ROM-gebaseerde gegevensverzamelingen net zo gemakkelijk te gebruiken maken als "normale" typen. Elk overschrijft de C ++ [] -operator, dus om individuele elementen te extraheren, gebruikt men de bekende syntaxis voor arraytoegang:

Concreet zijn dit macro's en een eenvoudige hulpklasse om het gemakkelijker te maken om arrays en tabellen van waarden in het programmageheugen.

De twee macro's worden als volgt gedeclareerd:

  // Voorbeeld: FLASH_ARRAY (float, temperaturen, 98.1, 98.5, 99.1, 102.1); # definieer FLASH_ARRAY (type, naam, waarden ...) \ statische const type naam ## _ flash [] PROGMEM = {waarden}; \ _FLASH_ARRAY<type> name (name ## _ flash, sizeof (name ## _ flash) / sizeof (type)); // Voorbeeld: FLASH_TABLE (uint8_t, fonts, 7, {ON, OFF, ON, ON, OFF, ON, OFF} , {UIT, AAN, UIT, AAN, UIT, AAN, UIT}); # definieer FLASH_TABLE (type, naam, cols, waarden ...) \ statische const type naam ## _ flash [] [cols] PROGMEM = {waarden }; \ _FLASH_TABLE<type> name ((const PROGMEM type *) name ## _ flash, sizeof (name ## _ flash) / sizeof (name ## _ flash [0]), cols);  

De helper functies omvatten grootte en overschrijven de operator [] zodat ze gemakkelijk op deze manier toegankelijk zijn

  FLASH_ARRAY [0]  

Ik ben het niet eens met zmo - dit is meer dan standaard. Het gebied van PROGMEM roept veel vragen op van Arduino-gebruikers, en het is heel gemakkelijk om dingen fout te doen bij het maken van arrays in PROGMEM.

Kunt u een uitleg van de macro's toevoegen aan het antwoord? Dit antwoord bevat alleen een link en heeft weinig nut als de link offline gaat.
Cybergibbons, dit is leuk, handig en nuttig, maar dit voegt zeker een niet-triviale overhead toe: het kapselt een object in een volledige instantie in. Als je maar 2k RAM hebt, is elke byte kostbaar.
zmo
2014-03-05 07:43:33 UTC
view on stackexchange narkive permalink

De flash-array is van Mikal Hart's flash-bibliotheek zoals je laat zien, en wat het doet is dat ze een array of een matrix (tabel) object declareren in het PROGMEM-geheugen:

#define FLASH_ARRAY (type, naam, waarden ...) \ statische const type naam ## _ flash [] PROGMEM = {waarden}; \ _FLASH_ARRAY<type> name (name ## _ flash, sizeof (name ## _ flash) / sizeof (type));

wat een instantie is van de gedefinieerde klasse _FLASH_ARRAY in datzelfde bestand, wat een faciliteit is om toegang te krijgen tot PROGMEM / Flash-geheugen.

Kortom, het is veel standaardplaat voor wat al doet de PSTR () -macro, onder andere van pgmspace.h . Persoonlijk zou ik dat vermijden en geef ik er de voorkeur aan om de originele macro's samen met mijn eigen index en pointers te gebruiken.

Trouwens, behalve wat Arduono IDE-magie, denk ik niet dat dat kan compileren, aangezien de Flash.h is niet inbegrepen.

EDIT:

Om nog een punt te maken tegen de FLASH_TABLE / FLASH_ARRAY boilerplate / overhead, aangezien avc-gcc 4.8 de __flash -kwalificatie heeft geïntroduceerd die een vervanging is voor de PROGMEM -macro, waardoor het hele gedoe wordt vereenvoudigd :

  // om letterlijke tekenreeksen te gebruiken zonder # define FSTR (X) ((const __flash char []) {X}) / / create string pstr in het .progmem.data adres spaceconst __flash char * pstr = FSTR ("foo"); 

en geen gebruik meer van de pgm_read _ * () -functies, je hebt nu toegang tot de inhoud van het flash-geheugen met * pstr , zoals getoond is deze thread. Als je een code compatibel wilt houden met een oudere versie van avr-gcc, hier is een bericht dat macro's aanbiedt om met beide systemen om te gaan.



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...