Lidando com Wrap Around em contadores

Confira este artigo e aprenda através de um tutorial como lidar com wrap around em contadores com apenas uma linha de código.
wrap around em contadores

Em qualquer tipo de sistema existem aqueles contadores de frequência de eventos, tanto em hardware quanto em software. Com relação à implementação em hardware, pode-se citar, como exemplo, o periférico em silício chamado time counter que existe em todos os controladores e processadores modernos. Já com relação à presença de contadores em software, é muito utilizado o tick counter, encontrado nas implementações de sistemas operacionais, desde o FreeRTOS até o Linux. Em termos de software ainda, pode-se mencionar também qualquer contador de eventos que o programador tenha que inserir no seu sistema, como quando é necessário medir qual a frequência que um pacote de dados é recebido.

 

O mistério sobre esses contadores é que são incrementados livremente, geralmente sem qualquer controle. No caso de software por questões de desempenho, e no caso de hardware por razões de tangibilidade. Essencialmente, precisam ser operados atomicamente para eliminar a problemática da concorrência. Além disso, lidar com wrap around em contadores pode criar um código menos legível devido aos condicionais.

Adota-se como exemplo, neste artigo, a criação de uma função de timeout baseada em um contador de tempo de unsigned int, onde time_now() retorna o valor atual do contador de tempo e é dependente de plataforma. Abaixo construímos a função que verifica se um timeout aconteceu.

A subtração no corpo do timeout_check é responsável em anular o efeito do wrap around. Quando incide, no contador que conta o tempo e é obtido por  time_now(), o primeiro operando da subtração fica menor que o segundo, mas, graças ao limite de bits, o resultado dessa subtração se mantém correto. Sendo a exata diferença desejada independente da incidência de um wrap around.

Abaixo um exemplo de uso da função timeout_check.

A técnica da subtração é válida para qualquer tipo, inteiro ou não, de qualquer largura de bits, contanto que todas as variáveis que participam da operação sejam do mesmo tipo, inclusive o contador,  e, contanto que, ocorra apenas um único wrap around. No Codepad encontra-se um teste em C da técnica apresentada: http://codepad.org/WjoIpV85.

Devido a sua simplicidade, a técnica é largamente usada, a exemplo da variável jiffies, acessível de dentro do kernel do Linux (#include <linux/jiffies.h>) que tem a função de contar ticks do sistema operacional, onde suas funções auxiliares fazem uso da subtração apresentada.

Engenheiro, desenvolve software para embarcados e Linux, evangelista dos processos de qualidade.
Mais informações e redes sociais: http://flp.lv

Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments

WEBINAR

Imagens de Ultrassom: Princípios e Aplicações

DATA: 26/10 ÀS 19:30 H