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.