É realmente necessário limpar manualmente o sinalizador de interrupção de estouro do timer XMEGA?

8

Como alguns de vocês devem saber, o Atmel fornece uma estrutura de software (principalmente como parte do Atmel Studio) que fornece drivers e exemplos e é atualizada com mais ou menos regularidade.

Em uma atualização recente, eles explicitamente apontam que é importante limpar manualmente o sinalizador de interrupção de estouro na função de retorno de chamada de interrupção.

 // * \subsection xmega_tc_qs_ovf_setup_code Example code
 // *
 // * Add a callback function that will be executed when the overflow interrupt
 // * trigger.
 // * \code
 static void my_callback(void)
 {
    // User code to execute when the overflow occurs here

    // THIS WAS ADDED IN LAST UPDATE
    // Important to clear Interrupt Flag
    tc_clear_overflow(&TCC0);
    // THIS WAS ADDED IN LAST UPDATE

 }
 //\endcode

De acordo com a folha de dados do XMEGAA:

OVFIF é limpo automaticamente quando o vetor de interrupção correspondente é executado. A bandeira também pode ser limpa escrevendo uma na sua localização de bits.

Existe um cenário / motivo pelo qual a limpeza manual do sinalizador pode ser necessária?

Rev1.0
fonte
Parece que a resposta é: se você não interromper, precisará limpá-la manualmente. essencialmente se / ao pesquisar em vez de usar interrupções. você pode simplesmente ler o registro na interrupção e exibi-lo de alguma forma para ver se ele estava realmente definido. da mesma forma, tente pesquisar sem a interrupção ativada e veja se ela está definida e se você pode limpá-la. validar se a documentação está correta ou não.
old_timer
1
Esse não seria o primeiro caso que eu vi nos produtos Atmel em que uma interrupção "limpa automaticamente" parece não ser realmente limpa quando o manipulador é acionado.
Connor Lobo
1
@ConnorWolf: Sério? Você se lembra de qual controlador e interrompe? Trabalhamos muito silenciosamente com os controladores Atmel e isso pode ser uma armadilha em potencial.
Rev1.0
3
@ Rev1.0 - Um exemplo com o qual estou trabalhando agora: SAM4SD32C- As interrupções do timer ( TC0_Handler, etc ...) não são limpas ao entrar no ISR, a menos que eu leia explicitamente TC0->TC_SR. Indo mais fundo, nesse caso, é porque a interrupção é acionada a partir do RCbit de correspondência do registro de comparação e isso não é limpo até que você leia explicitamente TC_SR. IOW, estou incorreto sobre a causa real (não era o bit ISR diretamente), mas o resultado final é o mesmo: você deve limpar manualmente a causa ISR , se não o sinalizador ISR .
Connor Lobo
1
Talvez haja uma errata?
vicatcu

Respostas:

1

Existe um cenário / motivo pelo qual a limpeza manual do sinalizador pode ser necessária?

Não tenho certeza sobre o ASF, mas há casos em que você precisa cancelar qualquer interrupção pendente. Por exemplo, ao (re) configurar um cronômetro, você pode desativar as interrupções, modificá-lo e cancelar as interrupções que possam ter ocorrido nesse período, antes de reativar as interrupções.

Se você ainda não possui um ISR de estouro, ainda pode pesquisar o OVIF para detectar o estouro e redefinir o sinalizador para armar para o próximo estouro.

JimmyB
fonte
1

Em geral, eu sempre limpo os sinalizadores de interrupção antes de ativar uma determinada interrupção, caso algo tenha definido o sinalizador no passado. Parece seguro barato.

Não conheço nenhum cenário em que você precise limpar manualmente o sinalizador, a menos que não esteja usando interrupções, e você está olhando para o sinalizador com uma rotina que é executada periodicamente para verificar se o sinalizador está sendo definido.

user103218
fonte