REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
align.h
Go to the documentation of this file.
1#ifndef UTILS_ALIGN_H
2#define UTILS_ALIGN_H
3
4#include <cstdint>
5#include <cstdlib>
6
7namespace utils {
8 // Memory alignment in a similar syntax to the linker ". = align(4)"
9 // example usage: uint8_t* mem = align((uintptr_t)mem, 4)
10 uintptr_t align(uintptr_t base, uint8_t exp) { return (base + exp - 1) & ~(exp - 1); }
11 uint8_t* align(uint8_t* base, uint8_t exp) { return (uint8_t*)align((uintptr_t)base, exp); }
12
13 // Returns the number of bytes "lost" by alignment. It is 0 <= disalignment <= exp.
14 uintptr_t disalignment(uint8_t* base, uint8_t exp) { return align(base,exp) - base; }
15
23 inline uint8_t* assert_callable(uint8_t* addr) {
24 if(disalignment(addr, 4) != 0) return 0;
25 return addr + 1;
26 }
27
28}
29
30#endif /* UTILS_ALIGN_H */
uintptr_t align(uintptr_t base, uint8_t exp)
Definition align.h:10
uintptr_t disalignment(uint8_t *base, uint8_t exp)
Definition align.h:14
uint8_t * assert_callable(uint8_t *addr)
ARM32 requires callable addresses to be memory aligned.
Definition align.h:23