Todas as armadilhas devem sempre ser definidas?

18

Eu já vi dois casos agora com o dsPIC 30F4013 em que o controlador estava sendo redefinido devido a uma armadilha indefinida. Por que essas armadilhas foram criadas em primeiro lugar ainda é um mistério, mas essa não é minha pergunta imediata. Estou começando a pensar que seria uma boa prática de programação definir sempre todos os traps, mesmo que nunca ocorram, por isso recebo pelo menos uma mensagem de erro clara em vez de uma redefinição aleatória. Esta é uma prática padrão que eu não conheço? Existem desvantagens dessa prática que devo considerar?

Stephen Collings
fonte
4
Não é uma resposta para sua pergunta, mas sofri com esses tipos de sintomas nos sistemas dsPIC e PIC24 há pouco tempo. No meu caso, os desvios resultaram de bits de código nos quais eu estava de-referenciando ponteiros para valores de 16 bits e esses ponteiros tinham valores ímpares (não pares), pois estavam apontando para um buffer de comunicação circular - e eu não tinha maneira de saber se o valor de 16 bits começaria em um limite ímpar ou par. O compilador XC16 não protege você das dificuldades do hardware aqui. Acabei escrevendo uma macro de invólucro para essas funções que forçaram 2 de-refs de ponteiro de 8 bits.
brhans

Respostas:

13

Minha regra informal é:

  1. Se uma interrupção estiver ativada, você deverá ter um código que lide com isso.
  2. Se você não escrever um código para uma interrupção, desative-o.
  3. Se você não pode desativá-lo, escreva um código para ele.

Mesmo sem essa regra, a folha de dados responde explicitamente à sua pergunta:

Se o usuário não pretender executar uma ação corretiva no caso de uma condição de erro de interceptação, esses vetores deverão ser carregados com o endereço de um manipulador padrão que simplesmente contenha a instrução RESET. Se, por outro lado, um dos vetores que contém um endereço inválido for chamado, uma interceptação de erro de endereço será gerada.

( Fonte , seção 8.3, primeira nota)

Como você não pode mascarar armadilhas, deve lidar com elas. Se você não deseja lidar com a armadilha de uma maneira específica, o método apropriado é executar uma RESETinstrução.

Adam Davis
fonte
Sim. Eu tenho um módulo padrão com metas para todas as armadilhas.
Olin Lathrop
16

Sim, é uma boa idéia - a única desvantagem é um tamanho extra de código, e você precisa decidir o que fazer com a armadilha (emitir uma mensagem na porta serial? Acender uma luz "FAILED"? Reiniciar silenciosamente? Etc )

pjc50
fonte
4
Normalmente, o processador é executado em um loop NOP / GOTO infinito. Dessa forma, a pilha não foi corrompida da armadilha e, ao depurar, tenho a chance de desvendá-la e descobrir o que aconteceu. Não recebo armadilhas com frequência, mas 80% das vezes é uma armadilha de endereço ímpar, geralmente porque o lixo é carregado como um ponteiro. Às vezes, o ponteiro da pilha é corrompido e produz traps de endereço ímpares. Essas são mais difíceis de depurar, pois a pilha não está mais lá. Felizmente, isso é realmente raro.
Olin Lathrop