Main Menu
Home
Cadastre-se
Como colaborar
Contato
Sugerir Conteúdo
Reportar Problema
Conteúdo
Fórum
Notícias
Artigos
Projetos
Inovação
Downloads
Eventos
Links
Blogs
Conteúdo Parceiro
Wiki da CBE
Wiki iMXdev
Blogesfera
Login
Usuários online
Nenhum usuário online
Nós temos 24 visitantes online
Usuários Registrados
4432 registrados
2 hoje
8 esta semana
22 no mês
Último: randrade offline
Próximos Eventos
Nenhum evento
« < Setembro 2010 > »
D S Q Q Q S D
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
Tradutor
Escolha o idioma:
PageRank
Uso de variaveis tipo volatile PDF Imprimir E-mail
 

Por Josilton Rocha, em 19-04-2010

Hits : 352

Publicado em : Blogs, Blogs Embarcados


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

 

 

 



   
Citar este artigo no meu website
Enviar por email
Conteúdo relacionado
Tag para del.icio.us

Comentários  RSS feed dos comentários
 

Avaliação dos usuários

   (0 voto)

 


Adicionar comentário
Apenas utilizadores registados podem comentar um artigo.

Nenhum comentário



mXcomment 1.0.9 © 2007-2010 - visualclinic.fr
License Creative Commons - Some rights reserved
Próximo >
Links do Dia
8051 - My8051  
8051 - Small Device C Compiler SDCC  
Arrow Brasil SA 
Atmel Corporation  
Rafael Quines 
Pesquisar no Portal
Newsletter
Assinar a newsletter do
Portal Embarcados
Nome:
Email:


Enquete
Qual é a sua formação?
 
Oportunidades
Últimas do Fórum

Mais...
Blogs
PROPELLER CHIP Autor: Josilton Rocha
Procuramos consultoria - GSOAP Autor: Claudio Boechat
IDE Free para SDCC Autor: Alexandre Andrade Souza
Parceiros
Comunidade C&C++ Brasil
Comunidade Brasileira de Eletronica
Eletromaniacos
Tempo Real
Psoc-Chile