Я пытался реализовать этот подход доступа к регистрам: http://www.drdobbs.com/cpp/register-access-in-c/184401954?pgno=2доступа к регистрам в C++
Это пример кода: В этом примере, я пытаюсь создать два Регистр базы - UART и ШИМ. Оба имеют свой набор регистров (со смещением от базового адреса). Базовый адрес высмеивается для целей тестирования.
Вопрос 1: В статье подробно не говорится о способе обработки нескольких устройств, и является ли моя реализация правильным пониманием? если это так
Вопрос 2 Есть ли способ избежать дублирования кода - функции regWrite, regRead и regAddress? В идеале я хотел бы просто определить пространство имен с базовым адресом и перечислением регистров и повторно использовать функции доступа. Каков наилучший способ достижения этого?
Я получаю ошибку компиляции с помощью regWrite, regRead, regAddress за пределами пространств имен. Он не может распознавать регистры, baseAddress.
ПРИМЕЧАНИЕ: Я пишу код для контроллера 2k RAM с RTOS, работающим поверх него. Поэтому я также заинтересован в том, чтобы размер кода и время выполнения были относительно низкими, но все же улучшали удобочитаемость.
namespace UART{
enum Registers {
STATUS = 0, RESET = 1
};
unsigned int fakeBase[2];
unsigned int baseAddress = (unsigned int)(&fakeBase);
inline volatile unsigned int *regAddress(Registers Reg){
return reinterpret_cast<volatile unsigned int *> (baseAddress + Reg);
}
inline void regWrite(Registers Reg, unsigned int value){
*regAddress(Reg) = value;
}
inline volatile unsigned int regRead(Registers Reg){
return *regAddress(Reg);
}
}
namespace PWM{
enum Registers {
DCA = 0, DCB = 1, DCC = 2
};
unsigned int fakeBase[3];
unsigned int baseAddress = (unsigned int)(&fakeBase);
inline volatile unsigned int *regAddress(Registers Reg){
return reinterpret_cast<volatile unsigned int *> (baseAddress + Reg);
}
inline void regWrite(Registers Reg, unsigned int value){
*regAddress(Reg) = value;
}
inline volatile unsigned int regRead(Registers Reg){
return *regAddress(Reg);
}
}
int main() {
regWrite(UART::STATUS, 12);
std::cout << "UART 0 " << regRead(UART::STATUS)<< std::endl;
regWrite(PWM::DCA, 34);
std::cout << "PWM 0 " << regRead(PWM::DCA)<< std::endl;
regWrite(UART::RESET, 13);
std::cout << "UART 1 " << regRead(UART::RESET)<< std::endl;
return 0;
}
Я получаю ошибку компиляции, потому что вы поставили пробел между ':' символами. Пространство имен называется с токеном '::' (без пробела). –
@RichardHodges, я думаю, опрятный (при добавлении кода) вариант испортил пробелы. Я не собирался компилировать, просто хотел отобразить фрагмент кода. – Saaras
@Saaras: Фрагменты для C++ не работают. Я думаю, что в настоящее время это только HTML, CSS и JavaScript. –