Skip to content

Commit b20f68b

Browse files
Allow misaligned accesses for pgm_read_XXX
1 parent 8f747a4 commit b20f68b

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

api/deprecated-avr-comp/avr/pgmspace.h

+18
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,29 @@ typedef const void* uint_farptr_t;
9999
#define sprintf_P(s, f, ...) sprintf((s), (f), __VA_ARGS__)
100100
#define snprintf_P(s, f, ...) snprintf((s), (f), __VA_ARGS__)
101101

102+
#if 0
103+
// Requires natural aligned addresses
102104
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
103105
#define pgm_read_word(addr) (*(const unsigned short *)(addr))
104106
#define pgm_read_dword(addr) (*(const unsigned long *)(addr))
105107
#define pgm_read_float(addr) (*(const float *)(addr))
106108
#define pgm_read_ptr(addr) (*(void *const *)(addr))
109+
#else
110+
// Supports misaligned addresses
111+
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
112+
#define pgm_read_word(addr) ((unsigned short)(pgm_read_byte((intptr_t)addr) | (pgm_read_byte((intptr_t)addr + 1) << 8)))
113+
#define pgm_read_dword(addr) ((unsigned long)(pgm_read_byte((intptr_t)addr) | (pgm_read_byte((intptr_t)addr + 1) << 8)) | \
114+
(pgm_read_byte((intptr_t)addr + 2) << 16) | (pgm_read_byte((intptr_t)addr + 3) << 24))
115+
#define pgm_read_ptr(addr) ((void *)pgm_read_dword(addr))
116+
static inline float pgm_read_float(const void *addr) {
117+
union {
118+
void *p;
119+
float f;
120+
} x;
121+
x.p = pgm_read_ptr(addr);
122+
return x.f;
123+
}
124+
#endif
107125

108126
#define pgm_read_byte_near(addr) pgm_read_byte(addr)
109127
#define pgm_read_word_near(addr) pgm_read_word(addr)

0 commit comments

Comments
 (0)