bug 1: No arquivo handler.h A definição dos vetores de interrupção deve estar dentro de uma declaração extern "C", porque senão, o compilador C++ fará mudanças no nome das funções de modo que o montador não as reconhecerá como tratadoras de interrupção. bug 2: No arquivo main.cc Está faltando um ; (ponto e virgula) após o for, o que faz em que cada interação do for ocorra uma excecução do return 1, que na verdade será executado apenas uma vez, pois o return encerrará a função main, encerrando assim o programa. bug 3: No arquivo my_handler.cc Nas funções INT0 e TIMER0, executam um ret quando deveriam executar reti, assim após a ocorrencia da primeira interrupção as interrupções permanecerão desabilitadas, pois a instrução ret não habilita as interrupçõs tal qual reti. bug 4: No arquivo system.cc Na linha 10, o valor escrito no registrador SREG é 0x08 quando deveria ser 0x80, ou seja, ao inves de habilitar a interrupção global estava habilitando o flag de overflow em complemento de dois. bug 5: No arquivo system.cc No método System::handle_timer0(), o contador deveria ser re-iniciado cada vez que chegasse a 60, portando está faltando um count = 0, dentro do if (count==60) o que faz com que o bloco if seja executado apenas uma vez, ou seja o tratador funciona só uma vez, acendendo os leds apenas uma vez. bug 6: No arquivo timer.h Nos métodos start e stop, a ordem dos parâmetros do asm está trocada, fazendo com que o endereço correspondente ao registrador destino seja origem e vice-versa. bug 7: No arquivo avr8.h Os endereços das portas estam com os endereços de memória ao invés dos endereços de I/O. O que causará um acesso aos registradores incorretos. bug 8: No arquivo avr8.h Várias declarações de registradores foram comentadas por estes não serem usados no program, no entando isto causa um deslocamento nos endereços dos demais registraroes, fazendo com que estes sejam posicionados em endereços errados. bug 9: No arquivo makefile Estavam faltando a directiva -fomit-frame-pointer, na compilação dos arquivos handler.cc, vector.cc e my_handler.cc, o que faz com que as rotinas tratadoras de interrupção mantenham o frame pointer em registrador, fazendo com que o salvamento de contexto restaure o frame pointer e não o real valor do registrador, pois antes deste ser restaurado a instrução reti é executada. bug 10: No arquivo context.h Havia um espaço depois da última instrução em SAVE_CONTEXT e REST_CONTEXT, além de causar um warning, faz com que o pre-processador não continue a substituição, portanto não colocando o );, que neste caso não causa maiores danos pois o compilador faz isso.