73 #define __PGMSPACE_H_ 1 88 #ifndef __ATTR_CONST__ 89 #define __ATTR_CONST__ __attribute__((__const__)) 92 #ifndef __ATTR_PROGMEM__ 93 #define __ATTR_PROGMEM__ __attribute__((__progmem__)) 97 #define __ATTR_PURE__ __attribute__((__pure__)) 107 #define PROGMEM __ATTR_PROGMEM__ 113 #if defined(__DOXYGEN__) 127 typedef void PROGMEM prog_void;
134 typedef char PROGMEM prog_char;
142 typedef unsigned char PROGMEM prog_uchar;
151 typedef int8_t PROGMEM prog_int8_t;
159 typedef uint8_t PROGMEM prog_uint8_t;
167 typedef int16_t PROGMEM prog_int16_t;
175 typedef uint16_t PROGMEM prog_uint16_t;
183 typedef int32_t PROGMEM prog_int32_t;
191 typedef uint32_t PROGMEM prog_uint32_t;
202 typedef int64_t PROGMEM prog_int64_t;
213 typedef uint64_t PROGMEM prog_uint64_t;
215 typedef void prog_void
PROGMEM;
216 typedef char prog_char
PROGMEM;
217 typedef unsigned char prog_uchar
PROGMEM;
219 typedef int8_t prog_int8_t
PROGMEM;
220 typedef uint8_t prog_uint8_t
PROGMEM;
221 typedef int16_t prog_int16_t
PROGMEM;
222 typedef uint16_t prog_uint16_t
PROGMEM;
223 typedef int32_t prog_int32_t
PROGMEM;
224 typedef uint32_t prog_uint32_t
PROGMEM;
226 typedef int64_t prog_int64_t
PROGMEM;
227 typedef uint64_t prog_uint64_t
PROGMEM;
241 #if defined(__DOXYGEN__) 250 # define PSTR(s) ((const PROGMEM char *)(s)) 253 # define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) 256 #define __LPM_classic__(addr) \ 258 uint16_t __addr16 = (uint16_t)(addr); \ 263 "mov %0, r0" "\n\t" \ 271 #define __LPM_enhanced__(addr) \ 273 uint16_t __addr16 = (uint16_t)(addr); \ 284 #define __LPM_word_classic__(addr) \ 286 uint16_t __addr16 = (uint16_t)(addr); \ 291 "mov %A0, r0" "\n\t" \ 292 "adiw r30, 1" "\n\t" \ 294 "mov %B0, r0" "\n\t" \ 295 : "=r" (__result), "=z" (__addr16) \ 302 #define __LPM_word_enhanced__(addr) \ 304 uint16_t __addr16 = (uint16_t)(addr); \ 308 "lpm %A0, Z+" "\n\t" \ 309 "lpm %B0, Z" "\n\t" \ 310 : "=r" (__result), "=z" (__addr16) \ 316 #define __LPM_dword_classic__(addr) \ 318 uint16_t __addr16 = (uint16_t)(addr); \ 323 "mov %A0, r0" "\n\t" \ 324 "adiw r30, 1" "\n\t" \ 326 "mov %B0, r0" "\n\t" \ 327 "adiw r30, 1" "\n\t" \ 329 "mov %C0, r0" "\n\t" \ 330 "adiw r30, 1" "\n\t" \ 332 "mov %D0, r0" "\n\t" \ 333 : "=r" (__result), "=z" (__addr16) \ 340 #define __LPM_dword_enhanced__(addr) \ 342 uint16_t __addr16 = (uint16_t)(addr); \ 346 "lpm %A0, Z+" "\n\t" \ 347 "lpm %B0, Z+" "\n\t" \ 348 "lpm %C0, Z+" "\n\t" \ 349 "lpm %D0, Z" "\n\t" \ 350 : "=r" (__result), "=z" (__addr16) \ 356 #define __LPM_float_classic__(addr) \ 358 uint16_t __addr16 = (uint16_t)(addr); \ 363 "mov %A0, r0" "\n\t" \ 364 "adiw r30, 1" "\n\t" \ 366 "mov %B0, r0" "\n\t" \ 367 "adiw r30, 1" "\n\t" \ 369 "mov %C0, r0" "\n\t" \ 370 "adiw r30, 1" "\n\t" \ 372 "mov %D0, r0" "\n\t" \ 373 : "=r" (__result), "=z" (__addr16) \ 380 #define __LPM_float_enhanced__(addr) \ 382 uint16_t __addr16 = (uint16_t)(addr); \ 386 "lpm %A0, Z+" "\n\t" \ 387 "lpm %B0, Z+" "\n\t" \ 388 "lpm %C0, Z+" "\n\t" \ 389 "lpm %D0, Z" "\n\t" \ 390 : "=r" (__result), "=z" (__addr16) \ 396 #if defined (__AVR_HAVE_LPMX__) 397 #define __LPM(addr) __LPM_enhanced__(addr) 398 #define __LPM_word(addr) __LPM_word_enhanced__(addr) 399 #define __LPM_dword(addr) __LPM_dword_enhanced__(addr) 400 #define __LPM_float(addr) __LPM_float_enhanced__(addr) 402 #define __LPM(addr) __LPM_classic__(addr) 403 #define __LPM_word(addr) __LPM_word_classic__(addr) 404 #define __LPM_dword(addr) __LPM_dword_classic__(addr) 405 #define __LPM_float(addr) __LPM_float_classic__(addr) 414 #define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) 422 #define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short)) 430 #define pgm_read_dword_near(address_short) \ 431 __LPM_dword((uint16_t)(address_short)) 439 #define pgm_read_float_near(address_short) \ 440 __LPM_float((uint16_t)(address_short)) 442 #if defined(RAMPZ) || defined(__DOXYGEN__) 450 #define __ELPM_classic__(addr) \ 452 uint32_t __addr32 = (uint32_t)(addr); \ 456 "out %2, %C1" "\n\t" \ 457 "mov r31, %B1" "\n\t" \ 458 "mov r30, %A1" "\n\t" \ 460 "mov %0, r0" "\n\t" \ 463 "I" (_SFR_IO_ADDR(RAMPZ)) \ 464 : "r0", "r30", "r31" \ 469 #define __ELPM_enhanced__(addr) \ 471 uint32_t __addr32 = (uint32_t)(addr); \ 475 "out %2, %C1" "\n\t" \ 476 "movw r30, %1" "\n\t" \ 477 "elpm %0, Z+" "\n\t" \ 480 "I" (_SFR_IO_ADDR(RAMPZ)) \ 486 #define __ELPM_xmega__(addr) \ 488 uint32_t __addr32 = (uint32_t)(addr); \ 492 "in __tmp_reg__, %2" "\n\t" \ 493 "out %2, %C1" "\n\t" \ 494 "movw r30, %1" "\n\t" \ 495 "elpm %0, Z+" "\n\t" \ 496 "out %2, __tmp_reg__" \ 499 "I" (_SFR_IO_ADDR(RAMPZ)) \ 505 #define __ELPM_word_classic__(addr) \ 507 uint32_t __addr32 = (uint32_t)(addr); \ 511 "out %2, %C1" "\n\t" \ 512 "mov r31, %B1" "\n\t" \ 513 "mov r30, %A1" "\n\t" \ 515 "mov %A0, r0" "\n\t" \ 517 "adiw r30, 1" "\n\t" \ 518 "adc r0, __zero_reg__" "\n\t" \ 519 "out %2, r0" "\n\t" \ 521 "mov %B0, r0" "\n\t" \ 524 "I" (_SFR_IO_ADDR(RAMPZ)) \ 525 : "r0", "r30", "r31" \ 530 #define __ELPM_word_enhanced__(addr) \ 532 uint32_t __addr32 = (uint32_t)(addr); \ 536 "out %2, %C1" "\n\t" \ 537 "movw r30, %1" "\n\t" \ 538 "elpm %A0, Z+" "\n\t" \ 539 "elpm %B0, Z" "\n\t" \ 542 "I" (_SFR_IO_ADDR(RAMPZ)) \ 548 #define __ELPM_word_xmega__(addr) \ 550 uint32_t __addr32 = (uint32_t)(addr); \ 554 "in __tmp_reg__, %2" "\n\t" \ 555 "out %2, %C1" "\n\t" \ 556 "movw r30, %1" "\n\t" \ 557 "elpm %A0, Z+" "\n\t" \ 558 "elpm %B0, Z" "\n\t" \ 559 "out %2, __tmp_reg__" \ 562 "I" (_SFR_IO_ADDR(RAMPZ)) \ 568 #define __ELPM_dword_classic__(addr) \ 570 uint32_t __addr32 = (uint32_t)(addr); \ 574 "out %2, %C1" "\n\t" \ 575 "mov r31, %B1" "\n\t" \ 576 "mov r30, %A1" "\n\t" \ 578 "mov %A0, r0" "\n\t" \ 580 "adiw r30, 1" "\n\t" \ 581 "adc r0, __zero_reg__" "\n\t" \ 582 "out %2, r0" "\n\t" \ 584 "mov %B0, r0" "\n\t" \ 586 "adiw r30, 1" "\n\t" \ 587 "adc r0, __zero_reg__" "\n\t" \ 588 "out %2, r0" "\n\t" \ 590 "mov %C0, r0" "\n\t" \ 592 "adiw r30, 1" "\n\t" \ 593 "adc r0, __zero_reg__" "\n\t" \ 594 "out %2, r0" "\n\t" \ 596 "mov %D0, r0" "\n\t" \ 599 "I" (_SFR_IO_ADDR(RAMPZ)) \ 600 : "r0", "r30", "r31" \ 605 #define __ELPM_dword_enhanced__(addr) \ 607 uint32_t __addr32 = (uint32_t)(addr); \ 611 "out %2, %C1" "\n\t" \ 612 "movw r30, %1" "\n\t" \ 613 "elpm %A0, Z+" "\n\t" \ 614 "elpm %B0, Z+" "\n\t" \ 615 "elpm %C0, Z+" "\n\t" \ 616 "elpm %D0, Z" "\n\t" \ 619 "I" (_SFR_IO_ADDR(RAMPZ)) \ 625 #define __ELPM_dword_xmega__(addr) \ 627 uint32_t __addr32 = (uint32_t)(addr); \ 631 "in __tmp_reg__, %2" "\n\t" \ 632 "out %2, %C1" "\n\t" \ 633 "movw r30, %1" "\n\t" \ 634 "elpm %A0, Z+" "\n\t" \ 635 "elpm %B0, Z+" "\n\t" \ 636 "elpm %C0, Z+" "\n\t" \ 637 "elpm %D0, Z" "\n\t" \ 638 "out %2, __tmp_reg__" \ 641 "I" (_SFR_IO_ADDR(RAMPZ)) \ 647 #define __ELPM_float_classic__(addr) \ 649 uint32_t __addr32 = (uint32_t)(addr); \ 653 "out %2, %C1" "\n\t" \ 654 "mov r31, %B1" "\n\t" \ 655 "mov r30, %A1" "\n\t" \ 657 "mov %A0, r0" "\n\t" \ 659 "adiw r30, 1" "\n\t" \ 660 "adc r0, __zero_reg__" "\n\t" \ 661 "out %2, r0" "\n\t" \ 663 "mov %B0, r0" "\n\t" \ 665 "adiw r30, 1" "\n\t" \ 666 "adc r0, __zero_reg__" "\n\t" \ 667 "out %2, r0" "\n\t" \ 669 "mov %C0, r0" "\n\t" \ 671 "adiw r30, 1" "\n\t" \ 672 "adc r0, __zero_reg__" "\n\t" \ 673 "out %2, r0" "\n\t" \ 675 "mov %D0, r0" "\n\t" \ 678 "I" (_SFR_IO_ADDR(RAMPZ)) \ 679 : "r0", "r30", "r31" \ 684 #define __ELPM_float_enhanced__(addr) \ 686 uint32_t __addr32 = (uint32_t)(addr); \ 690 "out %2, %C1" "\n\t" \ 691 "movw r30, %1" "\n\t" \ 692 "elpm %A0, Z+" "\n\t" \ 693 "elpm %B0, Z+" "\n\t" \ 694 "elpm %C0, Z+" "\n\t" \ 695 "elpm %D0, Z" "\n\t" \ 698 "I" (_SFR_IO_ADDR(RAMPZ)) \ 704 #define __ELPM_float_xmega__(addr) \ 706 uint32_t __addr32 = (uint32_t)(addr); \ 710 "in __tmp_reg__, %2" "\n\t" \ 711 "out %2, %C1" "\n\t" \ 712 "movw r30, %1" "\n\t" \ 713 "elpm %A0, Z+" "\n\t" \ 714 "elpm %B0, Z+" "\n\t" \ 715 "elpm %C0, Z+" "\n\t" \ 716 "elpm %D0, Z" "\n\t" \ 717 "out %2, __tmp_reg__" \ 720 "I" (_SFR_IO_ADDR(RAMPZ)) \ 731 #if defined (__AVR_HAVE_RAMPD__) 733 #define __ELPM(addr) __ELPM_xmega__(addr) 734 #define __ELPM_word(addr) __ELPM_word_xmega__(addr) 735 #define __ELPM_dword(addr) __ELPM_dword_xmega__(addr) 736 #define __ELPM_float(addr) __ELPM_float_xmega__(addr) 740 #if defined (__AVR_HAVE_LPMX__) 742 #define __ELPM(addr) __ELPM_enhanced__(addr) 743 #define __ELPM_word(addr) __ELPM_word_enhanced__(addr) 744 #define __ELPM_dword(addr) __ELPM_dword_enhanced__(addr) 745 #define __ELPM_float(addr) __ELPM_float_enhanced__(addr) 749 #define __ELPM(addr) __ELPM_classic__(addr) 750 #define __ELPM_word(addr) __ELPM_word_classic__(addr) 751 #define __ELPM_dword(addr) __ELPM_dword_classic__(addr) 752 #define __ELPM_float(addr) __ELPM_float_classic__(addr) 766 #define pgm_read_byte_far(address_long) __ELPM((uint32_t)(address_long)) 775 #define pgm_read_word_far(address_long) __ELPM_word((uint32_t)(address_long)) 784 #define pgm_read_dword_far(address_long) __ELPM_dword((uint32_t)(address_long)) 793 #define pgm_read_float_far(address_long) __ELPM_float((uint32_t)(address_long)) 804 #define pgm_read_byte(address_short) pgm_read_byte_near(address_short) 813 #define pgm_read_word(address_short) pgm_read_word_near(address_short) 822 #define pgm_read_dword(address_short) pgm_read_dword_near(address_short) 831 #define pgm_read_float(address_short) pgm_read_float_near(address_short) 840 #define PGM_P const prog_char * 849 #define PGM_VOID_P const prog_void * 853 extern int memcmp_P(
const void *,
PGM_VOID_P,
size_t) __ATTR_PURE__;
854 extern void *memccpy_P(
void *,
PGM_VOID_P,
int __val,
size_t);
855 extern void *memcpy_P(
void *,
PGM_VOID_P,
size_t);
856 extern void *memmem_P(
const void *,
size_t,
PGM_VOID_P,
size_t) __ATTR_PURE__;
858 extern char *strcat_P(
char *,
PGM_P);
859 extern PGM_P strchr_P(
PGM_P,
int __val) __ATTR_CONST__;
860 extern PGM_P strchrnul_P(
PGM_P,
int __val) __ATTR_CONST__;
861 extern int strcmp_P(
const char *,
PGM_P) __ATTR_PURE__;
862 extern char *strcpy_P(
char *,
PGM_P);
863 extern int strcasecmp_P(
const char *,
PGM_P) __ATTR_PURE__;
864 extern char *strcasestr_P(
const char *,
PGM_P) __ATTR_PURE__;
865 extern size_t strcspn_P(
const char *__s,
PGM_P __reject) __ATTR_PURE__;
866 extern size_t strlcat_P (
char *,
PGM_P,
size_t );
867 extern size_t strlcpy_P (
char *,
PGM_P,
size_t );
868 extern size_t strlen_P(
PGM_P) __ATTR_CONST__;
869 extern size_t strnlen_P(
PGM_P,
size_t) __ATTR_CONST__;
870 extern int strncmp_P(
const char *,
PGM_P,
size_t) __ATTR_PURE__;
871 extern int strncasecmp_P(
const char *,
PGM_P,
size_t) __ATTR_PURE__;
872 extern char *strncat_P(
char *,
PGM_P,
size_t);
873 extern char *strncpy_P(
char *,
PGM_P,
size_t);
874 extern char *strpbrk_P(
const char *__s,
PGM_P __accept) __ATTR_PURE__;
875 extern PGM_P strrchr_P(
PGM_P,
int __val) __ATTR_CONST__;
876 extern char *strsep_P(
char **__sp,
PGM_P __delim);
877 extern size_t strspn_P(
const char *__s,
PGM_P __accept) __ATTR_PURE__;
878 extern char *strstr_P(
const char *,
PGM_P) __ATTR_PURE__;
879 extern char *strtok_P(
char *__s,
PGM_P __delim);
880 extern char *strtok_rP(
char *__s,
PGM_P __delim,
char **__last);
#define PGM_VOID_P
Used to declare a generic pointer to an object in program space.
Definition: pgmspace.h:849
#define PGM_P
Used to declare a variable that is a pointer to a string in program space.
Definition: pgmspace.h:840
AVR device-specific IO Definitions.
#define PROGMEM
Attribute to use in order to declare an object being located in flash ROM.
Definition: pgmspace.h:107