Biblioteca de Soft Timers

soft timers
Este post faz parte da série Soft Timers. Leia também os outros posts da série:

Em muitos projetos que desenvolvi, sempre tive a necessidade de usar uma biblioteca de timers que possuíssem a capacidade de executar tarefas, sejam elas periódicas ou de uma única chamada.

Pensando nisso eu acabei implementando uma biblioteca de soft timers bem simples que permite ao usuário o registro de funções de callback, as quais são chamadas em um contexto de interrupção.

A biblioteca em questão foi desenvolvida para microcontroladores Texas da família TM4C123G e pode ser utilizada sem muitos problemas para outros microcontroladores. Ela utiliza apenas um timer para essa operação e pode ser utilizada em conjunto com RTOSs ou em sua aplicação bare-metal. Foi preparada para ser compilada com IAR e será fornecida no final do artigo.

Introdução a Soft Timers

Os soft timers são contadores decrescentes que executam uma ação quando chega a zero. O usuário fornece uma ação através de uma função de callback, que é uma função declarada pelo usuário e chamada quando o timer expira. Esta função de callback deve ser utilizada para operações bem rápidas, pois ela está sendo executada no contexto de uma interrupção. É muito importante que não se faça operações que possam bloquear o processamento pois, com isso, a execução de outras atividades será prejudicada.

Soft timers são úteis em protocolos de comunicação (timers de retransmissão, por exemplo) e também podem ser utilizados para polling de dispositivos de E/S em intervalos regulares.

A granularidade do timer é realizada na sua inicialização e esta deve ser ajustada para cada projeto: quanto menor a granularidade, maior é a freqüência que as ISR associadas ao Timer chamam as funções de callback e com isso poderemos prejudicar outras operações que o microcontrolador desempenha. A seguir apresento os diferentes tipos de timers implementados nesta biblioteca.

One-Shot Soft Timers

Como o nome diz, o one-shot timer irá contar de seu valor inicial, chamar a função de callback quando a contagem alcançar zero e parar. A figura 1 descreve a operação de um one-shot timer.

Soft Timers - One-shot timer
Figura 1 – One-shot timer

Como mostrado na figura 2, one-shot soft timers podem ser regatilhados chamando-se a função Start. Esse comportamento pode ser útil para implementar watchdogs ou coisas semelhantes.

Soft Timers - One-shot timer sendo iniciado diversas vezes
Figura 2 – One-shot timer sendo iniciado diversas vezes

Periodic Soft Timers

Periodic soft timers, como o nome diz, irá contar do valor inicial, chamar a função de callback quando o seu contador alcançar o valor zero e recarregar o contador com o valor inicial, entrando em um ciclo contínuo até que a função stop seja chamada.

Soft Timers - Periodic timer
Figura 3 – Periodic timer

Implementação de Soft Timers

Internamente, um timer é um objeto definido pelo tipo interno de dado STTimer, como apresentado na listagem abaixo: 

Descrição de cada membro da estrutura:

  1. identificador único, que o usuário pode usar para iniciar, parar ou desregistrar um timer;
  2. contador de ticks de interrupção do timer que, quando alcança o valor zero, permite ao timer executar a função de callback, dada por callback_func;
  3. valor de recarga do timer;
  4. tipo de timer: oneShot ou Periodic;
  5. parâmetro que é passado à função de callback;
  6. indica se o timer foi inciado ou não através do método start;
  7. ponteiro para a função de callback.

É instanciado um array de estruturas STTimer, sendo que a quantidade de timers que pode ser implementada em software depende principalmente do espaço de memória que o usuário tem à disposição. No projeto pode-se configurar, através de macros, qual é a quantidade de timers que se quer utilizar.

Timer_ISR_Handler

O motor que impulsiona os soft timers é implementado em uma rotina de interrupção periódica que, para a nossa aplicação com a família TM4C123G da Texas, é obtida através do uso do periférico Timer, conforme datasheet do microcontrolador TM4C123GH6PGE e da biblioteca TivaWare Peripheral Library.

A cada vez que a rotina de interrupção Timer_ISR_Handler é chamada, o campo .iCount de  todos timers que estão iniciados, indicados pelo campo .bStarted de STTimer, é decrementado de uma unidade. Se o valor de iCountfor zero, a função de callback é executada. Atente que somente uma função de callback é executada por execução de Timer_ISR_Handler, o que pode provocar um jitter na frequência de chamada da função de callback. Foi implementado dessa forma para que a execução das funções de callback não prejudique a execução das outras funcionalidades do microcontrolador.

Para mais detalhes a respeito da implementação, sugiro que olhe o código fonte.

TTimer – Application Programming Interface

A interface para a biblioteca TTimer é bem simples e intuitiva. Temos basicamente uma função para configurar o tempo de interrupção do timer e registro de uma função de callback, uma para iniciar e outra parar o timer.

A listagem abaixo mostra a API da biblioteca TTimer:

Exemplo de uso

Implementamos um caso simples, ligando e desligando o LED UserLed presente na placa DK-TM4C123G. O código fonte foi escrito com o IAR 6.50.

Veja o projeto dessa biblioteca de soft timers no GitHub.

Referências

http://www.ti.com/product/TM4C123GH6PGE
http://www.ti.com/tool/sw-tm4c
http://www.ti.com/tool/dk-tm4c123g
https://github.com/rdmeneze/TTimerExample

Outros artigos da série

Debouncing de teclas usando Soft Timers >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Biblioteca de Soft Timers
Comentários:
Notificações
Notificar
guest
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
trackback
16/05/2015 18:32

[…] Biblioteca de Soft Timers […]

Talvez você goste:

Séries



Outros da Série

Menu