Я ищу способ передать регистры встроенных устройств в шаблоны C++, используя gcc 4.8.4. В листах данных, описывающих встроенные устройства, адреса регистров обычно указываются как необработанные ячейки памяти (например, 0x40008000).Регистры как параметр шаблона
Когда я тестирую программное обеспечение, я хочу использовать статические целые числа в качестве регистров, чтобы увидеть, правильно ли установлены значения регистров.
Так в основном обертка вокруг некоторого устройства периферии сводится к классу с его адреса регистров приведены в качестве параметра шаблона:
template < volatile std::uint32_t* Reg >
struct peripheral {};
Тестирование работает отлично:
std::uint32_t reg;
peripheral< ® > mocked;
Но когда я хочу, чтобы создать экземпляр шаблон с фиксированным листом данных, адрес:
peripheral< reinterpret_cast< std::uint32_t* >(0x40008000) > mocked;
gcc жалуется: could not convert template argument '1073774592u' to 'volatile uint32_t* {aka volatile long unsigned int*}
. Кланг не жалуется на это.
Если я использую адрес заданные в виде целого числа в качестве параметра шаблона, у меня есть проблемы создания экземпляров шаблона во время моих тестов с адресом из издевались регистры:
template < std::intptr_t Reg >
struct peripheral {};
std::uint32_t reg;
peripheral< reinterpret_cast<std::intptr_t>(®) > mocked;
Это приводит к error: conversion from pointer type 'uint32_t* {aka long unsigned int*}' to arithmetic type 'intptr_t {aka int}' in a constant-expression
.
Я могу думать о двух решений этого:
1) Использование указателей в качестве параметров шаблона, использовать глобальные переменные, регистры и зафиксировать адрес регистров с некоторым компоновщик сценария магии.
2) Используйте специальные типы регистров, которые имеют общий интерфейс для периферийного шаблона, но две очень разные реализации для тестирования и для реального приложения.
Но я ищу более простой способ выполнить это. Любые идеи, указатели или комментарии?
Имейте в виду, что тип указателя всегда должен быть изменчивым. Это может быть причиной некоторых проблем. – Lundin
Спасибо, что указали это. –
Но это не проблема, которая вызывает ошибку компиляции. Каждый указатель на T должен быть конвертируемым в 'volatile T'. –