ну вот это вот Uart0<64> то зачем по всей программе размазывать? А если вы FIFO поменять захотите, то будете в 100500 местах это делать?
typedef вам в помощь. Ибо шаблон это ТИП!
Поэтому весь шаблон со всем своим сколько угодно длинным набором параметров можно просто обозвать как-то удачно.
Например
typedef UartDriver<Uart0, Fifo64, ParamsDefault> Uart0;
Ну а дальше уже в зависимости от реализации.
Если в шаблоне UartDriver<> вообще нет состояния и там все методы статичны то экземпляр вам не нужен. Сразу приступаем к использованию:
Uart0::Tx("blablabla");
Uart0::ISR();
А если там есть какое-то состояние то потребуется инстанциировать этот класс(тип) путем объявления перменной
Uart0 Uart0Instance;
И дальше уже обращаться к Uart0Instance.Tx("blablabla"); и Uart0Instance.ISR();
У вас же тут
Код
ISR( TIM0_OVF_vect ){
Uart0<64>::pc.CallFromISR();
}
Какое-то масло масленное......
The truth is out there...