ISR - Variáveis
Devemos seguir algumas regras básicas quando desenvolvemos código que faz uso de interrupção, devemos tratar essa seção do programa como algo especial e que possui algumas regras básicas para operar corretamente.
INFO
Para informações mais detalhadas consulte:
Variáveis volatile
Interrupção é normalmente um evento gerado pelo hardware e que, por consequência, executa uma função de Handler sem que o compilador tenha conhecimento disso (por ser um evento externo ao software). Por conta dessa característica, temos que tomar um cuidado especial com as variáveis que são acessadas por essa função chamada pelo hardware.
Rule 1.2
Todas as variáveis globais acessadas de uma interrupção (ISR) devem possuir a keyword: volatile
Rule 1.3
Somente as variáveis globais e modificadas durante a ISR devem ser globais.
Essas regras podem ser flexibilizadas quando desejamos acessar periféricos e memórias externas, os valores desses endereços de memória são alterados sem o conhecimento do compilador.
Exemplo
O exemplo a seguir demonstra um ==uso errado== da keyword volatile:
btn_callback: É uma função de interrupção chamada pelo Hardware!f_btn: É uma variável global modificada por um evento no pino do botão, deveria servolatilecnt: É apenas um contador, não devemos interferir no processo de compilação.
int f_btn = 0; // deveria ser volatile
// ISR
void btn_callback(void) {
f_btn = 1; // variável alterada de uma interrupcão
}
void main(void) {
volatile int cnt = 0; // não precisa ser volatile
while (1) {
if (f_btn) {
cnt++;
f_btn = 0;
}
}
}O exemplo viola as regras 1.1 e 1.2 nas duas variáveis ( f_btn e cnt ) gerando o seguinte erro:
