83 #define __PGMSPACE_H_ 1 90 #ifndef __ATTR_CONST__ 91 #define __ATTR_CONST__ __attribute__((__const__)) 94 #ifndef __ATTR_PROGMEM__ 95 #define __ATTR_PROGMEM__ __attribute__((__progmem__)) 99 #define __ATTR_PURE__ __attribute__((__pure__)) 109 #define PROGMEM __ATTR_PROGMEM__ 115 #if defined(__DOXYGEN__) 335 #define PGM_P const char * 344 #define PGM_VOID_P const void * 347 #elif defined(__PROG_TYPES_COMPAT__) 349 typedef void prog_void __attribute__((__progmem__,deprecated(
"prog_void type is deprecated.")));
350 typedef char prog_char __attribute__((__progmem__,deprecated(
"prog_char type is deprecated.")));
351 typedef unsigned char prog_uchar __attribute__((__progmem__,deprecated(
"prog_uchar type is deprecated.")));
352 typedef int8_t prog_int8_t __attribute__((__progmem__,deprecated(
"prog_int8_t type is deprecated.")));
353 typedef uint8_t prog_uint8_t __attribute__((__progmem__,deprecated(
"prog_uint8_t type is deprecated.")));
354 typedef int16_t prog_int16_t __attribute__((__progmem__,deprecated(
"prog_int16_t type is deprecated.")));
355 typedef uint16_t prog_uint16_t __attribute__((__progmem__,deprecated(
"prog_uint16_t type is deprecated.")));
356 typedef int32_t prog_int32_t __attribute__((__progmem__,deprecated(
"prog_int32_t type is deprecated.")));
357 typedef uint32_t prog_uint32_t __attribute__((__progmem__,deprecated(
"prog_uint32_t type is deprecated.")));
359 typedef int64_t prog_int64_t __attribute__((__progmem__,deprecated(
"prog_int64_t type is deprecated.")));
360 typedef uint64_t prog_uint64_t __attribute__((__progmem__,deprecated(
"prog_uint64_t type is deprecated.")));
364 #define PGM_P const prog_char * 368 #define PGM_VOID_P const prog_void * 374 #define PGM_P const char * 378 #define PGM_VOID_P const void * 392 #if defined(__DOXYGEN__) 401 # define PSTR(s) ((const PROGMEM char *)(s)) 404 # define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) 407 #define __LPM_classic__(addr) \ 409 uint16_t __addr16 = (uint16_t)(addr); \ 411 __asm__ __volatile__ \ 414 "mov %0, r0" "\n\t" \ 422 #define __LPM_tiny__(addr) \ 424 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ 435 #define __LPM_enhanced__(addr) \ 437 uint16_t __addr16 = (uint16_t)(addr); \ 439 __asm__ __volatile__ \ 448 #define __LPM_word_classic__(addr) \ 450 uint16_t __addr16 = (uint16_t)(addr); \ 452 __asm__ __volatile__ \ 455 "mov %A0, r0" "\n\t" \ 456 "adiw r30, 1" "\n\t" \ 458 "mov %B0, r0" "\n\t" \ 459 : "=r" (__result), "=z" (__addr16) \ 466 #define __LPM_word_tiny__(addr) \ 468 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ 472 "ld %A0, z+" "\n\t" \ 474 : "=r" (__result), "=z" (__addr16) \ 480 #define __LPM_word_enhanced__(addr) \ 482 uint16_t __addr16 = (uint16_t)(addr); \ 484 __asm__ __volatile__ \ 486 "lpm %A0, Z+" "\n\t" \ 487 "lpm %B0, Z" "\n\t" \ 488 : "=r" (__result), "=z" (__addr16) \ 494 #define __LPM_dword_classic__(addr) \ 496 uint16_t __addr16 = (uint16_t)(addr); \ 498 __asm__ __volatile__ \ 501 "mov %A0, r0" "\n\t" \ 502 "adiw r30, 1" "\n\t" \ 504 "mov %B0, r0" "\n\t" \ 505 "adiw r30, 1" "\n\t" \ 507 "mov %C0, r0" "\n\t" \ 508 "adiw r30, 1" "\n\t" \ 510 "mov %D0, r0" "\n\t" \ 511 : "=r" (__result), "=z" (__addr16) \ 518 #define __LPM_dword_tiny__(addr) \ 520 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ 524 "ld %A0, z+" "\n\t" \ 525 "ld %B0, z+" "\n\t" \ 526 "ld %C0, z+" "\n\t" \ 528 : "=r" (__result), "=z" (__addr16) \ 534 #define __LPM_dword_enhanced__(addr) \ 536 uint16_t __addr16 = (uint16_t)(addr); \ 538 __asm__ __volatile__ \ 540 "lpm %A0, Z+" "\n\t" \ 541 "lpm %B0, Z+" "\n\t" \ 542 "lpm %C0, Z+" "\n\t" \ 543 "lpm %D0, Z" "\n\t" \ 544 : "=r" (__result), "=z" (__addr16) \ 550 #define __LPM_float_classic__(addr) \ 552 uint16_t __addr16 = (uint16_t)(addr); \ 554 __asm__ __volatile__ \ 557 "mov %A0, r0" "\n\t" \ 558 "adiw r30, 1" "\n\t" \ 560 "mov %B0, r0" "\n\t" \ 561 "adiw r30, 1" "\n\t" \ 563 "mov %C0, r0" "\n\t" \ 564 "adiw r30, 1" "\n\t" \ 566 "mov %D0, r0" "\n\t" \ 567 : "=r" (__result), "=z" (__addr16) \ 574 #define __LPM_float_tiny__(addr) \ 576 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ 580 "ld %A0, z+" "\n\t" \ 581 "ld %B0, z+" "\n\t" \ 582 "ld %C0, z+" "\n\t" \ 584 : "=r" (__result), "=z" (__addr16) \ 590 #define __LPM_float_enhanced__(addr) \ 592 uint16_t __addr16 = (uint16_t)(addr); \ 594 __asm__ __volatile__ \ 596 "lpm %A0, Z+" "\n\t" \ 597 "lpm %B0, Z+" "\n\t" \ 598 "lpm %C0, Z+" "\n\t" \ 599 "lpm %D0, Z" "\n\t" \ 600 : "=r" (__result), "=z" (__addr16) \ 606 #if defined (__AVR_HAVE_LPMX__) 607 #define __LPM(addr) __LPM_enhanced__(addr) 608 #define __LPM_word(addr) __LPM_word_enhanced__(addr) 609 #define __LPM_dword(addr) __LPM_dword_enhanced__(addr) 610 #define __LPM_float(addr) __LPM_float_enhanced__(addr) 620 #elif defined (__AVR_TINY__) 621 #define __LPM(addr) __LPM_tiny__(addr) 622 #define __LPM_word(addr) __LPM_word_tiny__(addr) 623 #define __LPM_dword(addr) __LPM_dword_tiny__(addr) 624 #define __LPM_float(addr) __LPM_float_tiny__(addr) 626 #define __LPM(addr) __LPM_classic__(addr) 627 #define __LPM_word(addr) __LPM_word_classic__(addr) 628 #define __LPM_dword(addr) __LPM_dword_classic__(addr) 629 #define __LPM_float(addr) __LPM_float_classic__(addr) 638 #define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) 646 #define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short)) 654 #define pgm_read_dword_near(address_short) \ 655 __LPM_dword((uint16_t)(address_short)) 663 #define pgm_read_float_near(address_short) \ 664 __LPM_float((uint16_t)(address_short)) 672 #define pgm_read_ptr_near(address_short) \ 673 (void*)__LPM_word((uint16_t)(address_short)) 675 #if defined(RAMPZ) || defined(__DOXYGEN__) 683 #define __ELPM_classic__(addr) \ 685 uint32_t __addr32 = (uint32_t)(addr); \ 687 __asm__ __volatile__ \ 689 "out %2, %C1" "\n\t" \ 690 "mov r31, %B1" "\n\t" \ 691 "mov r30, %A1" "\n\t" \ 693 "mov %0, r0" "\n\t" \ 696 "I" (_SFR_IO_ADDR(RAMPZ)) \ 697 : "r0", "r30", "r31" \ 702 #define __ELPM_enhanced__(addr) \ 704 uint32_t __addr32 = (uint32_t)(addr); \ 706 __asm__ __volatile__ \ 708 "out %2, %C1" "\n\t" \ 709 "movw r30, %1" "\n\t" \ 710 "elpm %0, Z+" "\n\t" \ 713 "I" (_SFR_IO_ADDR(RAMPZ)) \ 719 #define __ELPM_xmega__(addr) \ 721 uint32_t __addr32 = (uint32_t)(addr); \ 723 __asm__ __volatile__ \ 725 "in __tmp_reg__, %2" "\n\t" \ 726 "out %2, %C1" "\n\t" \ 727 "movw r30, %1" "\n\t" \ 728 "elpm %0, Z+" "\n\t" \ 729 "out %2, __tmp_reg__" \ 732 "I" (_SFR_IO_ADDR(RAMPZ)) \ 738 #define __ELPM_word_classic__(addr) \ 740 uint32_t __addr32 = (uint32_t)(addr); \ 742 __asm__ __volatile__ \ 744 "out %2, %C1" "\n\t" \ 745 "mov r31, %B1" "\n\t" \ 746 "mov r30, %A1" "\n\t" \ 748 "mov %A0, r0" "\n\t" \ 750 "adiw r30, 1" "\n\t" \ 751 "adc r0, __zero_reg__" "\n\t" \ 752 "out %2, r0" "\n\t" \ 754 "mov %B0, r0" "\n\t" \ 757 "I" (_SFR_IO_ADDR(RAMPZ)) \ 758 : "r0", "r30", "r31" \ 763 #define __ELPM_word_enhanced__(addr) \ 765 uint32_t __addr32 = (uint32_t)(addr); \ 767 __asm__ __volatile__ \ 769 "out %2, %C1" "\n\t" \ 770 "movw r30, %1" "\n\t" \ 771 "elpm %A0, Z+" "\n\t" \ 772 "elpm %B0, Z" "\n\t" \ 775 "I" (_SFR_IO_ADDR(RAMPZ)) \ 781 #define __ELPM_word_xmega__(addr) \ 783 uint32_t __addr32 = (uint32_t)(addr); \ 785 __asm__ __volatile__ \ 787 "in __tmp_reg__, %2" "\n\t" \ 788 "out %2, %C1" "\n\t" \ 789 "movw r30, %1" "\n\t" \ 790 "elpm %A0, Z+" "\n\t" \ 791 "elpm %B0, Z" "\n\t" \ 792 "out %2, __tmp_reg__" \ 795 "I" (_SFR_IO_ADDR(RAMPZ)) \ 801 #define __ELPM_dword_classic__(addr) \ 803 uint32_t __addr32 = (uint32_t)(addr); \ 805 __asm__ __volatile__ \ 807 "out %2, %C1" "\n\t" \ 808 "mov r31, %B1" "\n\t" \ 809 "mov r30, %A1" "\n\t" \ 811 "mov %A0, r0" "\n\t" \ 813 "adiw r30, 1" "\n\t" \ 814 "adc r0, __zero_reg__" "\n\t" \ 815 "out %2, r0" "\n\t" \ 817 "mov %B0, r0" "\n\t" \ 819 "adiw r30, 1" "\n\t" \ 820 "adc r0, __zero_reg__" "\n\t" \ 821 "out %2, r0" "\n\t" \ 823 "mov %C0, r0" "\n\t" \ 825 "adiw r30, 1" "\n\t" \ 826 "adc r0, __zero_reg__" "\n\t" \ 827 "out %2, r0" "\n\t" \ 829 "mov %D0, r0" "\n\t" \ 832 "I" (_SFR_IO_ADDR(RAMPZ)) \ 833 : "r0", "r30", "r31" \ 838 #define __ELPM_dword_enhanced__(addr) \ 840 uint32_t __addr32 = (uint32_t)(addr); \ 842 __asm__ __volatile__ \ 844 "out %2, %C1" "\n\t" \ 845 "movw r30, %1" "\n\t" \ 846 "elpm %A0, Z+" "\n\t" \ 847 "elpm %B0, Z+" "\n\t" \ 848 "elpm %C0, Z+" "\n\t" \ 849 "elpm %D0, Z" "\n\t" \ 852 "I" (_SFR_IO_ADDR(RAMPZ)) \ 858 #define __ELPM_dword_xmega__(addr) \ 860 uint32_t __addr32 = (uint32_t)(addr); \ 862 __asm__ __volatile__ \ 864 "in __tmp_reg__, %2" "\n\t" \ 865 "out %2, %C1" "\n\t" \ 866 "movw r30, %1" "\n\t" \ 867 "elpm %A0, Z+" "\n\t" \ 868 "elpm %B0, Z+" "\n\t" \ 869 "elpm %C0, Z+" "\n\t" \ 870 "elpm %D0, Z" "\n\t" \ 871 "out %2, __tmp_reg__" \ 874 "I" (_SFR_IO_ADDR(RAMPZ)) \ 880 #define __ELPM_float_classic__(addr) \ 882 uint32_t __addr32 = (uint32_t)(addr); \ 884 __asm__ __volatile__ \ 886 "out %2, %C1" "\n\t" \ 887 "mov r31, %B1" "\n\t" \ 888 "mov r30, %A1" "\n\t" \ 890 "mov %A0, r0" "\n\t" \ 892 "adiw r30, 1" "\n\t" \ 893 "adc r0, __zero_reg__" "\n\t" \ 894 "out %2, r0" "\n\t" \ 896 "mov %B0, r0" "\n\t" \ 898 "adiw r30, 1" "\n\t" \ 899 "adc r0, __zero_reg__" "\n\t" \ 900 "out %2, r0" "\n\t" \ 902 "mov %C0, r0" "\n\t" \ 904 "adiw r30, 1" "\n\t" \ 905 "adc r0, __zero_reg__" "\n\t" \ 906 "out %2, r0" "\n\t" \ 908 "mov %D0, r0" "\n\t" \ 911 "I" (_SFR_IO_ADDR(RAMPZ)) \ 912 : "r0", "r30", "r31" \ 917 #define __ELPM_float_enhanced__(addr) \ 919 uint32_t __addr32 = (uint32_t)(addr); \ 921 __asm__ __volatile__ \ 923 "out %2, %C1" "\n\t" \ 924 "movw r30, %1" "\n\t" \ 925 "elpm %A0, Z+" "\n\t" \ 926 "elpm %B0, Z+" "\n\t" \ 927 "elpm %C0, Z+" "\n\t" \ 928 "elpm %D0, Z" "\n\t" \ 931 "I" (_SFR_IO_ADDR(RAMPZ)) \ 937 #define __ELPM_float_xmega__(addr) \ 939 uint32_t __addr32 = (uint32_t)(addr); \ 941 __asm__ __volatile__ \ 943 "in __tmp_reg__, %2" "\n\t" \ 944 "out %2, %C1" "\n\t" \ 945 "movw r30, %1" "\n\t" \ 946 "elpm %A0, Z+" "\n\t" \ 947 "elpm %B0, Z+" "\n\t" \ 948 "elpm %C0, Z+" "\n\t" \ 949 "elpm %D0, Z" "\n\t" \ 950 "out %2, __tmp_reg__" \ 953 "I" (_SFR_IO_ADDR(RAMPZ)) \ 964 #if defined (__AVR_HAVE_RAMPD__) 966 #define __ELPM(addr) __ELPM_xmega__(addr) 967 #define __ELPM_word(addr) __ELPM_word_xmega__(addr) 968 #define __ELPM_dword(addr) __ELPM_dword_xmega__(addr) 969 #define __ELPM_float(addr) __ELPM_float_xmega__(addr) 973 #if defined (__AVR_HAVE_LPMX__) 975 #define __ELPM(addr) __ELPM_enhanced__(addr) 976 #define __ELPM_word(addr) __ELPM_word_enhanced__(addr) 977 #define __ELPM_dword(addr) __ELPM_dword_enhanced__(addr) 978 #define __ELPM_float(addr) __ELPM_float_enhanced__(addr) 982 #define __ELPM(addr) __ELPM_classic__(addr) 983 #define __ELPM_word(addr) __ELPM_word_classic__(addr) 984 #define __ELPM_dword(addr) __ELPM_dword_classic__(addr) 985 #define __ELPM_float(addr) __ELPM_float_classic__(addr) 999 #define pgm_read_byte_far(address_long) __ELPM((uint32_t)(address_long)) 1008 #define pgm_read_word_far(address_long) __ELPM_word((uint32_t)(address_long)) 1017 #define pgm_read_dword_far(address_long) __ELPM_dword((uint32_t)(address_long)) 1026 #define pgm_read_float_far(address_long) __ELPM_float((uint32_t)(address_long)) 1035 #define pgm_read_ptr_far(address_long) (void*)__ELPM_word((uint32_t)(address_long)) 1046 #define pgm_read_byte(address_short) pgm_read_byte_near(address_short) 1055 #define pgm_read_word(address_short) pgm_read_word_near(address_short) 1064 #define pgm_read_dword(address_short) pgm_read_dword_near(address_short) 1073 #define pgm_read_float(address_short) pgm_read_float_near(address_short) 1082 #define pgm_read_ptr(address_short) pgm_read_ptr_near(address_short) 1117 #define pgm_get_far_address(var) \ 1119 uint_farptr_t tmp; \ 1121 __asm__ __volatile__( \ 1123 "ldi %A0, lo8(%1)" "\n\t" \ 1124 "ldi %B0, hi8(%1)" "\n\t" \ 1125 "ldi %C0, hh8(%1)" "\n\t" \ 1137 extern const void * memchr_P(
const void *,
int __val,
size_t __len) __ATTR_CONST__;
1138 extern int memcmp_P(
const void *,
const void *,
size_t) __ATTR_PURE__;
1139 extern
void *memccpy_P(
void *, const
void *,
int __val,
size_t);
1140 extern
void *memcpy_P(
void *, const
void *,
size_t);
1141 extern
void *memmem_P(const
void *,
size_t, const
void *,
size_t) __ATTR_PURE__;
1142 extern const
void * memrchr_P(const
void *,
int __val,
size_t __len) __ATTR_CONST__;
1143 extern
char *strcat_P(
char *, const
char *);
1144 extern const
char * strchr_P(const
char *,
int __val) __ATTR_CONST__;
1145 extern const
char * strchrnul_P(const
char *,
int __val) __ATTR_CONST__;
1146 extern
int strcmp_P(const
char *, const
char *) __ATTR_PURE__;
1147 extern
char *strcpy_P(
char *, const
char *);
1148 extern
int strcasecmp_P(const
char *, const
char *) __ATTR_PURE__;
1149 extern
char *strcasestr_P(const
char *, const
char *) __ATTR_PURE__;
1150 extern
size_t strcspn_P(const
char *__s, const
char * __reject) __ATTR_PURE__;
1151 extern
size_t strlcat_P (
char *, const
char *,
size_t );
1152 extern
size_t strlcpy_P (
char *, const
char *,
size_t );
1153 extern
size_t __strlen_P(const
char *) __ATTR_CONST__;
1154 extern
size_t strnlen_P(const
char *,
size_t) __ATTR_CONST__;
1155 extern
int strncmp_P(const
char *, const
char *,
size_t) __ATTR_PURE__;
1156 extern
int strncasecmp_P(const
char *, const
char *,
size_t) __ATTR_PURE__;
1157 extern
char *strncat_P(
char *, const
char *,
size_t);
1158 extern
char *strncpy_P(
char *, const
char *,
size_t);
1159 extern
char *strpbrk_P(const
char *__s, const
char * __accept) __ATTR_PURE__;
1160 extern const
char * strrchr_P(const
char *,
int __val) __ATTR_CONST__;
1161 extern
char *strsep_P(
char **__sp, const
char * __delim);
1162 extern
size_t strspn_P(const
char *__s, const
char * __accept) __ATTR_PURE__;
1163 extern
char *strstr_P(const
char *, const
char *) __ATTR_PURE__;
1164 extern
char *
strtok_P(
char *__s, const
char * __delim);
1165 extern
char *strtok_rP(
char *__s, const
char * __delim,
char **__last);
1168 extern
size_t strnlen_PF (
uint_farptr_t src,
size_t len) __ATTR_CONST__;
1169 extern
void *memcpy_PF (
void *dest,
uint_farptr_t src,
size_t len);
1171 extern
char *strncpy_PF (
char *dest,
uint_farptr_t src,
size_t len);
1173 extern
size_t strlcat_PF (
char *dst,
uint_farptr_t src,
size_t siz);
1174 extern
char *strncat_PF (
char *dest,
uint_farptr_t src,
size_t len);
1175 extern
int strcmp_PF (const
char *s1,
uint_farptr_t s2) __ATTR_PURE__;
1176 extern
int strncmp_PF (const
char *s1,
uint_farptr_t s2,
size_t n) __ATTR_PURE__;
1177 extern
int strcasecmp_PF (const
char *s1,
uint_farptr_t s2) __ATTR_PURE__;
1178 extern
int strncasecmp_PF (const
char *s1,
uint_farptr_t s2,
size_t n) __ATTR_PURE__;
1180 extern
size_t strlcpy_PF (
char *dst,
uint_farptr_t src,
size_t siz);
1181 extern
int memcmp_PF(const
void *,
uint_farptr_t,
size_t) __ATTR_PURE__;
1184 __attribute__((__always_inline__)) static __inline__
size_t strlen_P(const
char * s);
1185 static __inline__
size_t strlen_P(const
char *s) {
1186 return __builtin_constant_p(__builtin_strlen(s))
1187 ? __builtin_strlen(s) : __strlen_P(s);
uint32_t PROGMEM prog_uint32_t
Definition: pgmspace.h:284
signed long long int int64_t
Definition: stdint.h:106
char * strtok_P(char *s, PGM_P delim)
Parses the string into tokens.
Definition: strtok_P.c:60
int32_t PROGMEM prog_int32_t
Definition: pgmspace.h:266
uint64_t PROGMEM prog_uint64_t
Definition: pgmspace.h:326
unsigned char PROGMEM prog_uchar
Definition: pgmspace.h:176
void PROGMEM prog_void
Definition: pgmspace.h:140
int64_t PROGMEM prog_int64_t
Definition: pgmspace.h:305
signed int int16_t
Definition: stdint.h:84
signed char int8_t
Definition: stdint.h:74
#define PROGMEM
Definition: pgmspace.h:109
signed long int int32_t
Definition: stdint.h:94
int8_t PROGMEM prog_int8_t
Definition: pgmspace.h:194
unsigned char uint8_t
Definition: stdint.h:79
uint32_t uint_farptr_t
Definition: inttypes.h:81
unsigned long int uint32_t
Definition: stdint.h:99
char PROGMEM prog_char
Definition: pgmspace.h:158
uint16_t PROGMEM prog_uint16_t
Definition: pgmspace.h:248
unsigned long long int uint64_t
Definition: stdint.h:113
unsigned int uint16_t
Definition: stdint.h:89
uint8_t PROGMEM prog_uint8_t
Definition: pgmspace.h:212
int16_t PROGMEM prog_int16_t
Definition: pgmspace.h:230