указатель constexpr на фиксированный адрес процессора - PullRequest
0 голосов
/ 07 октября 2018

Я прочитал все сообщения на эту тему.Понятно, что вы не можете использовать статические переменные в constexpr, так как они не известны до времени ссылки.Однако я не понимаю, почему компилятор не позволит создать статический указатель на действительно статический адрес.

Мы конвертировали наш код в C ++ 11 из-за «многих преимуществ для встроенного программирования».Эта конкретная проблема вызывает беспокойство.Вот различные попытки заставить это работать.

#define PERIPH_BASE   0x40000000U
#define GPIOH_BASE    (AHB1PERIPH_BASE + 0x1C00U)
#define GPIOH         ((GPIO_TypeDef *) GPIOH_BASE)

#define KBATH_NFAULT_GPIO_Port GPIOH

// Attempt #1
const  GPIO_TypeDef* KBATH_NFAULT_GPIO_Port = (GPIO_TypeDef*)GPIOH_BASE;
constexpr DigitalInput BathNFaultK {const_cast<GPIO_TypeDef*> 
    (KBATH_NFAULT_GPIO_Port), BATH_NFAULT_Pin};

// Attempt #2
constexpr GPIO_TypeDef*  KBATH_NFAULT_GPIO_Port = (GPIO_TypeDef*)GPIOH_BASE;
constexpr DigitalInput BathNFaultK {KBATH_NFAULT_GPIO_Port, BATH_NFAULT_Pin};

// Attempt #3
#define STM_PERIPH(a) __builtin_constant_p (a) ? a : a
constexpr DigitalInput BathNFaultK {
    STM_PERIPH((GPIO_TypeDef*)GPIOH_BASE), BATH_NFAULT_Pin};

// Attempt #4
static constexpr inline GPIO_TypeDef* STM_GPIO_PORT(GPIO_TypeDef* p){
    return __builtin_constant_p((p))?(p):(p);
}
constexpr DigitalInput BathNFaultK {
    const_cast<GPIO_TypeDef*>(STM_GPIO_PORT(BATH_NFAULT_GPIO_Port)), 
    BATH_NFAULT_Pin
};

В обычном «С» это приемлемо.Есть ли решение?Это исправлено в C ++ 17?

Спасибо

1 Ответ

0 голосов
/ 12 октября 2018

Я собираюсь снять этот вопрос.Цель состояла в том, чтобы найти способ определить простой объект, который можно было бы использовать во время компиляции без необходимости фактической реализации объекта.constexpr был единственным решением, которое пришло на ум.Возможно, этот вопрос недействителен.

...