A falta de experiencia no emprego do modificador volatile na declarcacao de variaveis e uma nas causas mais frequentes de bugs intermitentes em software para sistemas embarcados escritos na linguagem C.
A palavra-chava volatile serve para proteger de efeitos colaterais causados por opitimizacoes de codigo pelo compilador.
Um dos exemplos mais frequentes encontrados e nos classicos programas de microcontrolador que usam uma variavel compartilhada pela rotina de servico de interrupcao e o programa principal.
Considere um programa bem simples onde voce tem uma rotina de servico de interrupcao (interrupt handler) fazendo uma leitura periodica de uma porta serial RS-232. A rotina de interrupcao checa o valor lido do registrador e se o valor e um carriage return ('\n') o codigo de interrupcao indica por meio de um flag que uma string completo foi recebido. O valor do flag e testado em main usando polling.
while (fim_de_mensagem == 0) {
/* busy loop */
}
Qualquer compilador decente vai olhar o codigo acima e perceber que nao tem nenhuma expressao naquele loop que modifica o valor de fim_de_mensagem, por isso em vez de ler o valor da memoria antes de testar, ele vai tentar armazenar o valor no registrador.
Voce pode evitar um bocado de dor de cabeca se voce declarar a variavel como volatile:
volatile uint8_t fim_de_mensagem; /* value modified in interrupt handler */
Um compilador inteligente vai
daqueles compiladores "espertos" instruir o compilador que aquela variavel pode ser modificada num rotina de tratamento interrupcao (interrupt handler),
Algumas regras simples:
1. A variavel faz referencia a hardware mapeado em memoria. Por exemplo, vamos supor que a variavel
|