Salute!
Посидел, подумал..
Первая проблема - как разместить переменную по определенному адресу. Честно говоря - не знаю.
Второе - эта надстройка не должна кушать никакую дополнительную память, т.е. создать класс-оболочку будет плохо.
Третье - хотелось бы контролировать права доступа, чтоб не записать случайно в регистр только чтения.
Основная идея которая придумалась - это использование конструкции вида
Код
//-----------------------------------------------------------------------------
template <unsigned A, unsigned P, unsigned L>
class CBitsRW{
public:
void operator = (unsigned Val){
*((volatile unsigned*) A) &= ~(((1<<L)-1)<<P);
*((volatile unsigned*) A) |= ((Val&((1<<L)-1))<<P);
};
operator unsigned(){
return ((*((volatile unsigned*) A))>>P)&((1<<L)-1);
}
};
//-----------------------------------------------------------------------------
template <unsigned A>
class CMixReg {
public:
CBitsRW<A, 0, 2> First;
CBitsRW<A, 2, 6> Second;
void operator = (unsigned Val) {
*((volatile unsigned*) A) = Val;
};
operator unsigned() {
return *((volatile unsigned*) A);
}
};
//-----------------------------------------------------------------------------
// example
CMixReg MixReg;
MixReg.First = 1;
В качестве примера - описал так регистры USB в LPC2148 (в прикрепленном файле). Громоздко это все очень.
Так же остался не решенным вопрос, как сделать в памяти копию регистра, поработать с ним в такой же семантике, а потом записать обратно.
Best regards