avr-libc
2.0.0
Standard C library for AVR-GCC
|
|
Go to the documentation of this file.
83 #define __PGMSPACE_H_ 1
93 #ifndef __ATTR_CONST__
94 #define __ATTR_CONST__ __attribute__((__const__))
97 #ifndef __ATTR_PROGMEM__
98 #define __ATTR_PROGMEM__ __attribute__((__progmem__))
101 #ifndef __ATTR_PURE__
102 #define __ATTR_PURE__ __attribute__((__pure__))
113 #define PROGMEM __ATTR_PROGMEM__
119 #if defined(__DOXYGEN__)
339 #define PGM_P const char *
348 #define PGM_VOID_P const void *
351 #elif defined(__PROG_TYPES_COMPAT__)
368 #define PGM_P const prog_char *
372 #define PGM_VOID_P const prog_void *
378 #define PGM_P const char *
382 #define PGM_VOID_P const void *
396 #if defined(__DOXYGEN__)
405 # define PSTR(s) ((const PROGMEM char *)(s))
408 # define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];}))
412 #define __LPM_classic__(addr) \
414 uint16_t __addr16 = (uint16_t)(addr); \
416 __asm__ __volatile__ \
419 "mov %0, r0" "\n\t" \
427 #define __LPM_tiny__(addr) \
429 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \
440 #define __LPM_enhanced__(addr) \
442 uint16_t __addr16 = (uint16_t)(addr); \
444 __asm__ __volatile__ \
453 #define __LPM_word_classic__(addr) \
455 uint16_t __addr16 = (uint16_t)(addr); \
457 __asm__ __volatile__ \
460 "mov %A0, r0" "\n\t" \
461 "adiw r30, 1" "\n\t" \
463 "mov %B0, r0" "\n\t" \
464 : "=r" (__result), "=z" (__addr16) \
471 #define __LPM_word_tiny__(addr) \
473 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \
477 "ld %A0, z+" "\n\t" \
479 : "=r" (__result), "=z" (__addr16) \
485 #define __LPM_word_enhanced__(addr) \
487 uint16_t __addr16 = (uint16_t)(addr); \
489 __asm__ __volatile__ \
491 "lpm %A0, Z+" "\n\t" \
492 "lpm %B0, Z" "\n\t" \
493 : "=r" (__result), "=z" (__addr16) \
499 #define __LPM_dword_classic__(addr) \
501 uint16_t __addr16 = (uint16_t)(addr); \
503 __asm__ __volatile__ \
506 "mov %A0, r0" "\n\t" \
507 "adiw r30, 1" "\n\t" \
509 "mov %B0, r0" "\n\t" \
510 "adiw r30, 1" "\n\t" \
512 "mov %C0, r0" "\n\t" \
513 "adiw r30, 1" "\n\t" \
515 "mov %D0, r0" "\n\t" \
516 : "=r" (__result), "=z" (__addr16) \
523 #define __LPM_dword_tiny__(addr) \
525 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \
529 "ld %A0, z+" "\n\t" \
530 "ld %B0, z+" "\n\t" \
531 "ld %C0, z+" "\n\t" \
533 : "=r" (__result), "=z" (__addr16) \
539 #define __LPM_dword_enhanced__(addr) \
541 uint16_t __addr16 = (uint16_t)(addr); \
543 __asm__ __volatile__ \
545 "lpm %A0, Z+" "\n\t" \
546 "lpm %B0, Z+" "\n\t" \
547 "lpm %C0, Z+" "\n\t" \
548 "lpm %D0, Z" "\n\t" \
549 : "=r" (__result), "=z" (__addr16) \
555 #define __LPM_float_classic__(addr) \
557 uint16_t __addr16 = (uint16_t)(addr); \
559 __asm__ __volatile__ \
562 "mov %A0, r0" "\n\t" \
563 "adiw r30, 1" "\n\t" \
565 "mov %B0, r0" "\n\t" \
566 "adiw r30, 1" "\n\t" \
568 "mov %C0, r0" "\n\t" \
569 "adiw r30, 1" "\n\t" \
571 "mov %D0, r0" "\n\t" \
572 : "=r" (__result), "=z" (__addr16) \
579 #define __LPM_float_tiny__(addr) \
581 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \
585 "ld %A0, z+" "\n\t" \
586 "ld %B0, z+" "\n\t" \
587 "ld %C0, z+" "\n\t" \
589 : "=r" (__result), "=z" (__addr16) \
595 #define __LPM_float_enhanced__(addr) \
597 uint16_t __addr16 = (uint16_t)(addr); \
599 __asm__ __volatile__ \
601 "lpm %A0, Z+" "\n\t" \
602 "lpm %B0, Z+" "\n\t" \
603 "lpm %C0, Z+" "\n\t" \
604 "lpm %D0, Z" "\n\t" \
605 : "=r" (__result), "=z" (__addr16) \
611 #if defined (__AVR_HAVE_LPMX__)
612 #define __LPM(addr) __LPM_enhanced__(addr)
613 #define __LPM_word(addr) __LPM_word_enhanced__(addr)
614 #define __LPM_dword(addr) __LPM_dword_enhanced__(addr)
615 #define __LPM_float(addr) __LPM_float_enhanced__(addr)
625 #elif defined (__AVR_TINY__)
626 #define __LPM(addr) __LPM_tiny__(addr)
627 #define __LPM_word(addr) __LPM_word_tiny__(addr)
628 #define __LPM_dword(addr) __LPM_dword_tiny__(addr)
629 #define __LPM_float(addr) __LPM_float_tiny__(addr)
631 #define __LPM(addr) __LPM_classic__(addr)
632 #define __LPM_word(addr) __LPM_word_classic__(addr)
633 #define __LPM_dword(addr) __LPM_dword_classic__(addr)
634 #define __LPM_float(addr) __LPM_float_classic__(addr)
645 #define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short))
653 #define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short))
661 #define pgm_read_dword_near(address_short) \
662 __LPM_dword((uint16_t)(address_short))
670 #define pgm_read_float_near(address_short) \
671 __LPM_float((uint16_t)(address_short))
679 #define pgm_read_ptr_near(address_short) \
680 (void*)__LPM_word((uint16_t)(address_short))
682 #if defined(RAMPZ) || defined(__DOXYGEN__)
691 #define __ELPM_classic__(addr) \
693 uint32_t __addr32 = (uint32_t)(addr); \
695 __asm__ __volatile__ \
697 "out %2, %C1" "\n\t" \
698 "mov r31, %B1" "\n\t" \
699 "mov r30, %A1" "\n\t" \
701 "mov %0, r0" "\n\t" \
704 "I" (_SFR_IO_ADDR(RAMPZ)) \
705 : "r0", "r30", "r31" \
710 #define __ELPM_enhanced__(addr) \
712 uint32_t __addr32 = (uint32_t)(addr); \
714 __asm__ __volatile__ \
716 "out %2, %C1" "\n\t" \
717 "movw r30, %1" "\n\t" \
718 "elpm %0, Z+" "\n\t" \
721 "I" (_SFR_IO_ADDR(RAMPZ)) \
727 #define __ELPM_xmega__(addr) \
729 uint32_t __addr32 = (uint32_t)(addr); \
731 __asm__ __volatile__ \
733 "in __tmp_reg__, %2" "\n\t" \
734 "out %2, %C1" "\n\t" \
735 "movw r30, %1" "\n\t" \
736 "elpm %0, Z+" "\n\t" \
737 "out %2, __tmp_reg__" \
740 "I" (_SFR_IO_ADDR(RAMPZ)) \
746 #define __ELPM_word_classic__(addr) \
748 uint32_t __addr32 = (uint32_t)(addr); \
750 __asm__ __volatile__ \
752 "out %2, %C1" "\n\t" \
753 "mov r31, %B1" "\n\t" \
754 "mov r30, %A1" "\n\t" \
756 "mov %A0, r0" "\n\t" \
758 "adiw r30, 1" "\n\t" \
759 "adc r0, __zero_reg__" "\n\t" \
760 "out %2, r0" "\n\t" \
762 "mov %B0, r0" "\n\t" \
765 "I" (_SFR_IO_ADDR(RAMPZ)) \
766 : "r0", "r30", "r31" \
771 #define __ELPM_word_enhanced__(addr) \
773 uint32_t __addr32 = (uint32_t)(addr); \
775 __asm__ __volatile__ \
777 "out %2, %C1" "\n\t" \
778 "movw r30, %1" "\n\t" \
779 "elpm %A0, Z+" "\n\t" \
780 "elpm %B0, Z" "\n\t" \
783 "I" (_SFR_IO_ADDR(RAMPZ)) \
789 #define __ELPM_word_xmega__(addr) \
791 uint32_t __addr32 = (uint32_t)(addr); \
793 __asm__ __volatile__ \
795 "in __tmp_reg__, %2" "\n\t" \
796 "out %2, %C1" "\n\t" \
797 "movw r30, %1" "\n\t" \
798 "elpm %A0, Z+" "\n\t" \
799 "elpm %B0, Z" "\n\t" \
800 "out %2, __tmp_reg__" \
803 "I" (_SFR_IO_ADDR(RAMPZ)) \
809 #define __ELPM_dword_classic__(addr) \
811 uint32_t __addr32 = (uint32_t)(addr); \
813 __asm__ __volatile__ \
815 "out %2, %C1" "\n\t" \
816 "mov r31, %B1" "\n\t" \
817 "mov r30, %A1" "\n\t" \
819 "mov %A0, r0" "\n\t" \
821 "adiw r30, 1" "\n\t" \
822 "adc r0, __zero_reg__" "\n\t" \
823 "out %2, r0" "\n\t" \
825 "mov %B0, r0" "\n\t" \
827 "adiw r30, 1" "\n\t" \
828 "adc r0, __zero_reg__" "\n\t" \
829 "out %2, r0" "\n\t" \
831 "mov %C0, r0" "\n\t" \
833 "adiw r30, 1" "\n\t" \
834 "adc r0, __zero_reg__" "\n\t" \
835 "out %2, r0" "\n\t" \
837 "mov %D0, r0" "\n\t" \
840 "I" (_SFR_IO_ADDR(RAMPZ)) \
841 : "r0", "r30", "r31" \
846 #define __ELPM_dword_enhanced__(addr) \
848 uint32_t __addr32 = (uint32_t)(addr); \
850 __asm__ __volatile__ \
852 "out %2, %C1" "\n\t" \
853 "movw r30, %1" "\n\t" \
854 "elpm %A0, Z+" "\n\t" \
855 "elpm %B0, Z+" "\n\t" \
856 "elpm %C0, Z+" "\n\t" \
857 "elpm %D0, Z" "\n\t" \
860 "I" (_SFR_IO_ADDR(RAMPZ)) \
866 #define __ELPM_dword_xmega__(addr) \
868 uint32_t __addr32 = (uint32_t)(addr); \
870 __asm__ __volatile__ \
872 "in __tmp_reg__, %2" "\n\t" \
873 "out %2, %C1" "\n\t" \
874 "movw r30, %1" "\n\t" \
875 "elpm %A0, Z+" "\n\t" \
876 "elpm %B0, Z+" "\n\t" \
877 "elpm %C0, Z+" "\n\t" \
878 "elpm %D0, Z" "\n\t" \
879 "out %2, __tmp_reg__" \
882 "I" (_SFR_IO_ADDR(RAMPZ)) \
888 #define __ELPM_float_classic__(addr) \
890 uint32_t __addr32 = (uint32_t)(addr); \
892 __asm__ __volatile__ \
894 "out %2, %C1" "\n\t" \
895 "mov r31, %B1" "\n\t" \
896 "mov r30, %A1" "\n\t" \
898 "mov %A0, r0" "\n\t" \
900 "adiw r30, 1" "\n\t" \
901 "adc r0, __zero_reg__" "\n\t" \
902 "out %2, r0" "\n\t" \
904 "mov %B0, r0" "\n\t" \
906 "adiw r30, 1" "\n\t" \
907 "adc r0, __zero_reg__" "\n\t" \
908 "out %2, r0" "\n\t" \
910 "mov %C0, r0" "\n\t" \
912 "adiw r30, 1" "\n\t" \
913 "adc r0, __zero_reg__" "\n\t" \
914 "out %2, r0" "\n\t" \
916 "mov %D0, r0" "\n\t" \
919 "I" (_SFR_IO_ADDR(RAMPZ)) \
920 : "r0", "r30", "r31" \
925 #define __ELPM_float_enhanced__(addr) \
927 uint32_t __addr32 = (uint32_t)(addr); \
929 __asm__ __volatile__ \
931 "out %2, %C1" "\n\t" \
932 "movw r30, %1" "\n\t" \
933 "elpm %A0, Z+" "\n\t" \
934 "elpm %B0, Z+" "\n\t" \
935 "elpm %C0, Z+" "\n\t" \
936 "elpm %D0, Z" "\n\t" \
939 "I" (_SFR_IO_ADDR(RAMPZ)) \
945 #define __ELPM_float_xmega__(addr) \
947 uint32_t __addr32 = (uint32_t)(addr); \
949 __asm__ __volatile__ \
951 "in __tmp_reg__, %2" "\n\t" \
952 "out %2, %C1" "\n\t" \
953 "movw r30, %1" "\n\t" \
954 "elpm %A0, Z+" "\n\t" \
955 "elpm %B0, Z+" "\n\t" \
956 "elpm %C0, Z+" "\n\t" \
957 "elpm %D0, Z" "\n\t" \
958 "out %2, __tmp_reg__" \
961 "I" (_SFR_IO_ADDR(RAMPZ)) \
972 #if defined (__AVR_HAVE_RAMPD__)
974 #define __ELPM(addr) __ELPM_xmega__(addr)
975 #define __ELPM_word(addr) __ELPM_word_xmega__(addr)
976 #define __ELPM_dword(addr) __ELPM_dword_xmega__(addr)
977 #define __ELPM_float(addr) __ELPM_float_xmega__(addr)
981 #if defined (__AVR_HAVE_LPMX__)
983 #define __ELPM(addr) __ELPM_enhanced__(addr)
984 #define __ELPM_word(addr) __ELPM_word_enhanced__(addr)
985 #define __ELPM_dword(addr) __ELPM_dword_enhanced__(addr)
986 #define __ELPM_float(addr) __ELPM_float_enhanced__(addr)
990 #define __ELPM(addr) __ELPM_classic__(addr)
991 #define __ELPM_word(addr) __ELPM_word_classic__(addr)
992 #define __ELPM_dword(addr) __ELPM_dword_classic__(addr)
993 #define __ELPM_float(addr) __ELPM_float_classic__(addr)
1008 #define pgm_read_byte_far(address_long) __ELPM((uint32_t)(address_long))
1017 #define pgm_read_word_far(address_long) __ELPM_word((uint32_t)(address_long))
1026 #define pgm_read_dword_far(address_long) __ELPM_dword((uint32_t)(address_long))
1035 #define pgm_read_float_far(address_long) __ELPM_float((uint32_t)(address_long))
1044 #define pgm_read_ptr_far(address_long) (void*)__ELPM_word((uint32_t)(address_long))
1055 #define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
1064 #define pgm_read_word(address_short) pgm_read_word_near(address_short)
1073 #define pgm_read_dword(address_short) pgm_read_dword_near(address_short)
1082 #define pgm_read_float(address_short) pgm_read_float_near(address_short)
1091 #define pgm_read_ptr(address_short) pgm_read_ptr_near(address_short)
1126 #define pgm_get_far_address(var) \
1128 uint_farptr_t tmp; \
1130 __asm__ __volatile__( \
1132 "ldi %A0, lo8(%1)" "\n\t" \
1133 "ldi %B0, hi8(%1)" "\n\t" \
1134 "ldi %C0, hh8(%1)" "\n\t" \
1158 extern const void *
memchr_P(
const void *,
int __val,
size_t __len) __ATTR_CONST__;
1172 extern int memcmp_P(
const void *,
const void *,
size_t) __ATTR_PURE__;
1179 extern void *
memccpy_P(
void *,
const void *,
int __val,
size_t);
1195 extern void *
memmem_P(
const void *,
size_t,
const void *,
size_t) __ATTR_PURE__;
1207 extern const void *
memrchr_P(
const void *,
int __val,
size_t __len) __ATTR_CONST__;
1233 extern const char *
strchr_P(
const char *,
int __val) __ATTR_CONST__;
1245 extern const char *
strchrnul_P(
const char *,
int __val) __ATTR_CONST__;
1258 extern int strcmp_P(
const char *,
const char *) __ATTR_PURE__;
1305 extern size_t strcspn_P(
const char *__s,
const char * __reject) __ATTR_PURE__;
1346 extern size_t strnlen_P(
const char *,
size_t) __ATTR_CONST__;
1357 extern int strncmp_P(
const char *,
const char *,
size_t) __ATTR_PURE__;
1416 extern char *
strpbrk_P(
const char *__s,
const char * __accept) __ATTR_PURE__;
1427 extern const char *
strrchr_P(
const char *,
int __val) __ATTR_CONST__;
1447 extern char *
strsep_P(
char **__sp,
const char * __delim);
1460 extern size_t strspn_P(
const char *__s,
const char * __accept) __ATTR_PURE__;
1474 extern char *
strstr_P(
const char *,
const char *) __ATTR_PURE__;
1496 extern char *
strtok_P(
char *__s,
const char * __delim);
1516 extern char *
strtok_rP(
char *__s,
const char * __delim,
char **__last);
1779 extern size_t __strlen_P(
const char *) __ATTR_CONST__;
1781 static __inline__
size_t strlen_P(
const char *s) {
1782 return __builtin_constant_p(__builtin_strlen(s))
1783 ? __builtin_strlen(s) : __strlen_P(s);
char * strncat_PF(char *dest, uint_farptr_t src, size_t len)
Concatenate two strings.
char * strcat_PF(char *dest, uint_farptr_t src)
Concatenates two strings.
uint32_t uint_farptr_t
Definition: inttypes.h:81
char * strcasestr_P(const char *, const char *) __ATTR_PURE__
char * strcpy_P(char *, const char *)
int strncmp_P(const char *, const char *, size_t) __ATTR_PURE__
int strncasecmp_P(const char *, const char *, size_t) __ATTR_PURE__
Compare two strings ignoring case.
#define PROGMEM
Definition: pgmspace.h:113
void * memcpy_P(void *, const void *, size_t)
signed char int8_t
Definition: stdint.h:78
int8_t PROGMEM prog_int8_t
Definition: pgmspace.h:198
signed long int int32_t
Definition: stdint.h:98
int strcmp_PF(const char *s1, uint_farptr_t s2) __ATTR_PURE__
Compares two strings.
signed int int16_t
Definition: stdint.h:88
size_t strnlen_P(const char *, size_t)
Determine the length of a fixed-size string.
static __inline void __attribute__((__always_inline__)) __power_all_enable()
Definition: power.h:1188
int strncasecmp_PF(const char *s1, uint_farptr_t s2, size_t n) __ATTR_PURE__
Compare two strings ignoring case.
const void * memchr_P(const void *, int __val, size_t __len)
Scan flash memory for a character.
unsigned long int uint32_t
Definition: stdint.h:103
int strcmp_P(const char *, const char *) __ATTR_PURE__
size_t strlen_PF(uint_farptr_t src)
Obtain the length of a string.
size_t strnlen_PF(uint_farptr_t src, size_t len)
Determine the length of a fixed-size string.
char * strncpy_PF(char *dest, uint_farptr_t src, size_t len)
Duplicate a string until a limited length.
char * strsep_P(char **__sp, const char *__delim)
Parse a string into tokens.
signed long long int int64_t
Definition: stdint.h:110
char PROGMEM prog_char
Definition: pgmspace.h:162
unsigned long long int uint64_t
Definition: stdint.h:117
void * memccpy_P(void *, const void *, int __val, size_t)
unsigned int uint16_t
Definition: stdint.h:93
const void * memrchr_P(const void *, int __val, size_t __len)
uint8_t PROGMEM prog_uint8_t
Definition: pgmspace.h:216
char * strpbrk_P(const char *__s, const char *__accept) __ATTR_PURE__
uint64_t PROGMEM prog_uint64_t
Definition: pgmspace.h:330
unsigned char uint8_t
Definition: stdint.h:83
unsigned char PROGMEM prog_uchar
Definition: pgmspace.h:180
char * strncpy_P(char *, const char *, size_t)
void * memcpy_PF(void *dest, uint_farptr_t src, size_t len)
Copy a memory block from flash to SRAM.
int64_t PROGMEM prog_int64_t
Definition: pgmspace.h:309
const char * strchrnul_P(const char *, int __val)
int strcasecmp_P(const char *, const char *) __ATTR_PURE__
Compare two strings ignoring case.
char * strcat_P(char *, const char *)
size_t strlcpy_P(char *, const char *, size_t)
Copy a string from progmem to RAM.
int16_t PROGMEM prog_int16_t
Definition: pgmspace.h:234
int strncmp_PF(const char *s1, uint_farptr_t s2, size_t n) __ATTR_PURE__
Compare two strings with limited length.
size_t strlcat_P(char *, const char *, size_t)
Concatenate two strings.
int32_t PROGMEM prog_int32_t
Definition: pgmspace.h:270
int strcasecmp_PF(const char *s1, uint_farptr_t s2) __ATTR_PURE__
Compare two strings ignoring case.
char * strtok_P(char *__s, const char *__delim)
Parses the string into tokens.
char * strncat_P(char *, const char *, size_t)
Concatenate two strings.
int memcmp_P(const void *, const void *, size_t) __ATTR_PURE__
Compare memory areas.
char * strtok_rP(char *__s, const char *__delim, char **__last)
Parses string into tokens.
size_t strlcat_PF(char *dst, uint_farptr_t src, size_t siz)
Concatenate two strings.
char * strcpy_PF(char *dest, uint_farptr_t src)
Duplicate a string.
char * strstr_P(const char *, const char *) __ATTR_PURE__
Locate a substring.
const char * strchr_P(const char *, int __val)
Locate character in program space string.
int memcmp_PF(const void *, uint_farptr_t, size_t) __ATTR_PURE__
Compare memory areas.
void PROGMEM prog_void
Definition: pgmspace.h:144
const char * strrchr_P(const char *, int __val)
Locate character in string.
uint32_t PROGMEM prog_uint32_t
Definition: pgmspace.h:288
size_t strlcpy_PF(char *dst, uint_farptr_t src, size_t siz)
Copy a string from progmem to RAM.
static size_t strlen_P(const char *s)
void * memmem_P(const void *, size_t, const void *, size_t) __ATTR_PURE__
char * strstr_PF(const char *s1, uint_farptr_t s2)
Locate a substring.
size_t strspn_P(const char *__s, const char *__accept) __ATTR_PURE__
uint16_t PROGMEM prog_uint16_t
Definition: pgmspace.h:252
size_t strcspn_P(const char *__s, const char *__reject) __ATTR_PURE__