From d8835df9abbcde6f0092f231c84baf1def29c72b Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 28 Jan 2022 18:44:34 -0800 Subject: [PATCH] Fix pgm_read_ macros with inline functions (#449) Fixes #447 --- ArduinoCore-API | 2 +- .../api/deprecated-avr-comp/avr/pgmspace.h | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ArduinoCore-API b/ArduinoCore-API index 9da5373..ff01bb6 160000 --- a/ArduinoCore-API +++ b/ArduinoCore-API @@ -1 +1 @@ -Subproject commit 9da53735171f7cccbe781c66d9ee1068d94d6ec8 +Subproject commit ff01bb620e0c3386e39e032e209d9a07ad799d25 diff --git a/cores/rp2040/api/deprecated-avr-comp/avr/pgmspace.h b/cores/rp2040/api/deprecated-avr-comp/avr/pgmspace.h index c0c26f3..42df894 100644 --- a/cores/rp2040/api/deprecated-avr-comp/avr/pgmspace.h +++ b/cores/rp2040/api/deprecated-avr-comp/avr/pgmspace.h @@ -110,11 +110,23 @@ typedef const void* uint_farptr_t; #define pgm_read_ptr(addr) (*(void *const *)(addr)) #else // Supports misaligned addresses -#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) -#define pgm_read_word(addr) ((unsigned short)(pgm_read_byte((intptr_t)addr) | (pgm_read_byte((intptr_t)addr + 1) << 8))) -#define pgm_read_dword(addr) ((unsigned long)(pgm_read_byte((intptr_t)addr) | (pgm_read_byte((intptr_t)addr + 1) << 8)) | \ - (pgm_read_byte((intptr_t)addr + 2) << 16) | (pgm_read_byte((intptr_t)addr + 3) << 24)) -#define pgm_read_ptr(addr) ((void *)pgm_read_dword(addr)) +#ifdef __cplusplus +extern "C"{ +#endif +static inline unsigned char pgm_read_byte(const void *addr) { + return *(const unsigned char *)(addr); +} +static inline unsigned short pgm_read_word(const void *addr) { + const unsigned char *a = (const unsigned char *)addr; + return pgm_read_byte(a) | ( pgm_read_byte(a + 1) << 8 ); +} +static inline unsigned long pgm_read_dword(const void *addr) { + const unsigned char *a = (const unsigned char *)addr; + return pgm_read_byte(a) | ( pgm_read_byte(a + 1) << 8 ) | ( pgm_read_byte(a + 2) << 16 ) | ( pgm_read_byte(a + 3) << 24 ); +} +static inline void *pgm_read_ptr(const void *addr) { + return (void*) pgm_read_dword(addr); +} static inline float pgm_read_float(const void *addr) { union { void *p; @@ -123,6 +135,10 @@ static inline float pgm_read_float(const void *addr) { x.p = pgm_read_ptr(addr); return x.f; } +#ifdef __cplusplus +} +#endif + #endif #define pgm_read_byte_near(addr) pgm_read_byte(addr)