Replaced workaround with provided macro

This commit is contained in:
BlackMark 2019-08-15 17:48:41 +02:00
parent 16c9015f43
commit 2fd05483ee
2 changed files with 14 additions and 26 deletions

View File

@ -22,24 +22,18 @@ The following works in avr-gcc 5.4.0, but is not legal C++, because ptr's are no
constexpr auto *foo = ptr; constexpr auto *foo = ptr;
Workaround is to store the the address of the ptr in a uintptr_t and reinterpret_cast it at call site Workaround is to store the the address of the ptr in a uintptr_t and reinterpret_cast it at call site
For this to work we need to temporarily disable the _SFR_MEM8 macro so that the register macro just gives the address For this the sfr_defs.h provides a macro which returns the address of a register
*/ */
#undef _SFR_MEM8
#define _SFR_MEM8
struct Registers0 { struct Registers0 {
static constexpr uintptr_t IO_REG_ADDR = UDR0; static constexpr uintptr_t IO_REG_ADDR = _SFR_ADDR(UDR0);
static constexpr uintptr_t CTRL_STAT_REG_A_ADDR = UCSR0A; static constexpr uintptr_t CTRL_STAT_REG_A_ADDR = _SFR_ADDR(UCSR0A);
static constexpr uintptr_t CTRL_STAT_REG_B_ADDR = UCSR0B; static constexpr uintptr_t CTRL_STAT_REG_B_ADDR = _SFR_ADDR(UCSR0B);
static constexpr uintptr_t CTRL_STAT_REG_C_ADDR = UCSR0C; static constexpr uintptr_t CTRL_STAT_REG_C_ADDR = _SFR_ADDR(UCSR0C);
static constexpr uintptr_t BAUD_REG_L_ADDR = UBRR0L; static constexpr uintptr_t BAUD_REG_L_ADDR = _SFR_ADDR(UBRR0L);
static constexpr uintptr_t BAUD_REG_H_ADDR = UBRR0H; static constexpr uintptr_t BAUD_REG_H_ADDR = _SFR_ADDR(UBRR0H);
}; };
#undef _SFR_MEM8
#define _SFR_MEM8(mem_addr) _MMIO_BYTE(mem_addr)
enum class ControlFlagsA0 { enum class ControlFlagsA0 {
MULTI_PROC_COMM_MODE = MPCM0, MULTI_PROC_COMM_MODE = MPCM0,
SPEED_2X = U2X0, SPEED_2X = U2X0,

View File

@ -22,24 +22,18 @@ The following works in avr-gcc 5.4.0, but is not legal C++, because ptr's are no
constexpr auto *foo = ptr; constexpr auto *foo = ptr;
Workaround is to store the the address of the ptr in a uintptr_t and reinterpret_cast it at call site Workaround is to store the the address of the ptr in a uintptr_t and reinterpret_cast it at call site
For this to work we need to temporarily disable the _SFR_MEM8 macro so that the register macro just gives the address For this the sfr_defs.h provides a macro which returns the address of a register
*/ */
#undef _SFR_MEM8
#define _SFR_MEM8
struct Registers1 { struct Registers1 {
static constexpr uintptr_t IO_REG_ADDR = UDR1; static constexpr uintptr_t IO_REG_ADDR = _SFR_ADDR(UDR1);
static constexpr uintptr_t CTRL_STAT_REG_A_ADDR = UCSR1A; static constexpr uintptr_t CTRL_STAT_REG_A_ADDR = _SFR_ADDR(UCSR1A);
static constexpr uintptr_t CTRL_STAT_REG_B_ADDR = UCSR1B; static constexpr uintptr_t CTRL_STAT_REG_B_ADDR = _SFR_ADDR(UCSR1B);
static constexpr uintptr_t CTRL_STAT_REG_C_ADDR = UCSR1C; static constexpr uintptr_t CTRL_STAT_REG_C_ADDR = _SFR_ADDR(UCSR1C);
static constexpr uintptr_t BAUD_REG_L_ADDR = UBRR1L; static constexpr uintptr_t BAUD_REG_L_ADDR = _SFR_ADDR(UBRR1L);
static constexpr uintptr_t BAUD_REG_H_ADDR = UBRR1H; static constexpr uintptr_t BAUD_REG_H_ADDR = _SFR_ADDR(UBRR1H);
}; };
#undef _SFR_MEM8
#define _SFR_MEM8(mem_addr) _MMIO_BYTE(mem_addr)
enum class ControlFlagsA1 { enum class ControlFlagsA1 {
MULTI_PROC_COMM_MODE = MPCM1, MULTI_PROC_COMM_MODE = MPCM1,
SPEED_2X = U2X1, SPEED_2X = U2X1,