Ах вот оно как! Я чего-то подумал, что TIMER1 это у вас объект класса _TIMER, а это вы так VIC_TIMER1 переобозвали... Маленькое замечание - не рекомендуется использовать подчеркивание в качестве первого символа в именах, такие имена зарезервированы за компилятором, можете напороться на интересные ошибки. И имена из одних заглавных обычно используются для мароопределений (#define).
Цитата(Vitaliy_ARM @ May 22 2008, 17:29)

На третью строчку в фигурных скобках таже ошибка, не может сконвертировать тип.
Функция, вызываемая по этому указателю, требует this в качестве неявного параметра. По этому указателю определяется, с каким именно из объектов данного класса идет работа. Как ваш обработчик передаст в функцию этот this? Если бы компилятор разрешил вам это преобразование, то у вас для нескольких прерваний VICVectAddr указывал бы
на одну и ту же функцию. И как бы эта функция разгребала, какой из таймеров надо обрабатывать? VIC на каждый источник прерывания хочет вызвать
отдельную функцию. И никак вы это не обойдете. Или вам придется сделать на N таймеров N функций-"оберток", или в классе объявить N
статических обработчиков, которые отличаются от "оберток" только областью видимости.
Посмотрите дизассемблированный текст обращения к любой функции-члену. В R1 находится указатель на объект Если бы компилятор разрешил вам это преобразование, то, поскольку в момент прерывания у вас R1 может иметь произвольное значение, эта функция-член начала бы править данные не в конкретном объекте, а в произвольном месте памяти.
Нет, есть конечно финт ушами - сделать все классы, имеющие обработчики прерывания, полиморфными наследниками абстрактного базового класса, в VICVectAddr заносить указатели на объекты этих классов, а единый обработчик на векторе IRQ считывает VICVectAddr, преобразовывает его к типу "указатель на этот абстракный базовый класс" и вызывает по нему метод обработчика. Но это будет громоздкое (по сохранению регистров на стеке) и совершенно непереносимое на другие архитектуры решение.
Что-то вроде вот такого:
Код
class interrupt_t
{
friend __irq void IRQ_Handler();
protected:
interrupt_t(uint_fast8_t const vector_num, uint32_t const irq_ID);
private:
virtual void Handler() = 0;
};
class timer_t : private interrupt_t
{
public:
timer_t(uint_fast8_t const vector_num, uint32_t const irq_ID);
private:
virtual void Handler();
uint32_t Time;
};
inline interrupt_t::interrupt_t(uint_fast8_t const vector_num, uint32_t const irq_ID)
{
uint32_t *Vector = &VICVectAddr0;
Vector[vector_num] = (uint32_t)this;
uint32_t *Control = &VICVectCtnl0;
Control[vector_num] = (1 << 5) | irq_ID;
VICVectEnable = (1 << irq_ID);
}
inline timer_t::timer_t(uint32_t const vector_num, uint32_t const irq_ID)
: interrupt_t(vector_num, irq_ID)
{
// настройка таймера
.........
}
timer_t::Handler()
{
++Time;
}
timer_t Timer1 (15, VIC_TIMER1);
#pragma vector = 0x18
__irq void IRQ_Handler()
{
interrupt_t * pSource = (interrupt_t *)VICVectAddr;
pSource->Handler();
VICVectAddr = 0;
}
Хм, а интересная мысль. Надо взять ее на заметку для небольших неторопливых безОСевых приложений типа загрузчиков.