Qualquer pessoa que tenha trabalhado com microcontroladores, microprocessadores ou afins, em algum momento já fez ou precisou fazer uma análise comparativa entre diferentes modelos de CPU. O propósito desta página é disponibilizar uma análise técnica imparcial sobre o desempenho de diferentes microcontroladores disponíveis no mercado, permitindo comparar suas performances considerando operações comumente desempenhadas por estas máquinas.

O conjunto de testes utilizado neste benchmarking considera algumas das tarefas mais comuns desempenhadas por microcontroladores em aplicações reais, nesta versão inicial foram definidos os seguintes testes:

  1. SBA – Este teste simula um transmissor serial assíncrono por software, deslocando serialmente 10 bits. Avalia-se a velocidade com que a CPU processa dados utilizando deslocamento e teste de bits.
  2. WRT4 – Simula uma operação de escrita de um buffer de 16 bytes em uma porta de 4 bits, tipicamente utilizada em LCDs.
  3. WRT8 – Simula a escrita de um buffer de 16 bytes em uma porta de 8 bits.
  4. DTR8 – Transferência seletiva de dados de um buffer de 16 bytes para outro buffer de 16 bytes, somente os valores maiores que 1 são copiados.
  5. DTR16 – Idem acima, mas utilizando buffers de 16 bits.
  6. DTR32 – Idem acima, mas utilizando buffers de 32 bits.
  7. BMP – Simulação de operações de manipulação de bits (setar, apagar, testar).
  8. STR – Simulação da escrita de uma string constante em um buffer (utilizado em LCDs, portas seriais, etc).
  9. PRD – Conversão de um dado de 8 bits em string de 3 caracteres ASCII.
  10. CALC8 – Resolução de equação com variáveis de 8 bits.
  11. CALC16 – Resolução de equação com variáveis de 16 bits.
  12. CALC32 – Resolução de equação com variáveis de 32 bits.
  13. MMA – Algoritmo para determinar o valor médio (média flutuante), mínimo e máximo de um buffer de 16 bytes.
  14. CRC – Cálculo de CRC16.
  15. FSM – Uma máquina de estados simples, com a passagem por seus diversos estados.

Outra característica deste benchmarking é que ele é totalmente baseado na linguagem C, o que significa que está sujeito a qualidade do compilador utilizado. Para reduzir este efeito, utilizamos, sempre que possível os ambientes e compiladores da IAR, mas em algumas plataformas (como no caso dos PICs) isso não foi possível. De qualquer forma, entendemos que ainda assim o teste é válido, pois demonstra condições reais de uso para a grande maioria dos programadores de sistemas embarcados (utilizadores da linguagem C).

O código utilizado nos testes pode ser visto AQUI.

 

Plataformas Avaliadas

 

Nesta primeira versão do benchmarking, foram avaliadas as seguintes plataformas:

  • 8 bits: AVR, HCS08, PIC18
  • 16 bits: MSP430, RL78

A máquina escolhida para avaliação dos Atmel AVR foi o ATXMEGA32A4, esta máquina foi escolhida por ser um exemplar relativamente recente desta linha de microcontroladores e em especial por pertencer a linha picopower. A linha AVR de 8 bits consiste em máquinas RISC Harvard com um excelente conjunto de registradores e um ótimo conjunto de instruções, que são executadas na maioria dos casos em um ciclo de clock, o que lhes garante uma excelente performance. Na avaliação foi utilizado o compilador IAR Kickstart Embedded Workbench for AVR 6.11.

No caso dos Freescale HCS08 o escolhido  foi o MC9S08QE32, um exemplar relativamente recente desta linha de microcontroladores e que também apresenta números de performance e consumo interessantes. A linha HCS08 da Freescale é derivada da linha HC08, são microcontroladores CISC Von Neumann de 8 bits, com um conjunto simples de registradores e um vasto conjunto de instruções. Os tempos de execução variam na casa de 8 ciclos de clock (4 ciclos de barramento ou BUSCLK). Na avaliação foi utilizado o compilador IAR Kickstart Embedded Workbench for HCS08 5.6.

Com relação aos Microchip PIC18, selecionamos o microcontrolador PIC18F46K20, por apresentar características de baixo consumo de energia. A linha PIC18 consiste em máquinas RISC Harvard de 8 bits, onde há apenas um registrador na CPU (o W), no entanto, o restante da memória RAM é considerado também como registradores (GPR ou SFR no jargão da Microchip), o que faz com que os PICs não sejam máquinas RISC load-and-store convencionais. Os PIC18 incluem um multiplicador de 8×8 bits. O tempo de execução da maioria das instruções é de 4 ciclos de clock (1 ciclo de máquina). Na avaliação foi utilizado o ambiente MPLAB 8.8 e o compilador C18 versão 3.42.

A primeira máquina avaliada na categoria de 16 bits foi o MSP430F249 da Texas Instruments. Este microcontrolador é um membro da linha 2xx da família MSP430, com uma CPU de bom desempenho, baixo consumo de energia, conjunto de instruções RISC e 16 registradores internos. Este modelo de MSP430 possui hardware interno de multiplicação (16×16 bits) que foi utilizado nos testes. O tempo médio de execução das instruções é de cerca de 4 ciclos de clock. Na avaliação foi utilizado o compilador IAR Kickstart Embedded Workbench for MSP430 5.40.2.

Outra máquina avaliada na linha de 16 bits foi o RL78/G13 (modelo R5F100BC) da Renesas. Esta família de microcontroladores é derivada da linha 78k, a CPU possui um bom conjunto de registradores da CPU, um excelente conjunto de instruções e características de baixo consumo de energia. Todos os membros desta família possuem um multiplicador de 16 x 16 bits que foi utilizado nos testes. O tempo médio de execução das instruções é de 1 ciclo de clock. Na avaliação foi utilizado o compilador IAR Kickstart Embedded Workbench for RL78 6.1.

 

Densidade de código

 

Na avaliação da densidade de código foi medido o tamanho de código (em bytes) gerado para cada uma das funções de teste. Esta medição não considerou o código de inicialização gerado pelo compilador e nem o código gerado pela função de inicialização dos buffers de teste. É importante observar que esta função faz uso de operadores aritméticos, o que faz com que o compilador inclua estas funções no código base da aplicação. No entanto, optamos por não incluir o tamanho deste código nesta medição. Ainda assim, a comparação de densidade de código é possível, pois compara o código gerado para a função em cada plataforma.

Obs1.: no RL78, ao habilitar o multiplicador por hardware (nas opções do projeto), o compilador inclui uma biblioteca para utilização do mesmo, o que adiciona cerca de 260 bytes ao tamanho total da aplicação.

Obs2.: no MSP430, a habilitação do multiplicador por hardware não provocou alteração significativa no tamanho do código, mas o impacto de performance também não é tão significativo (nas operações testadas).

O gráfico abaixo mostra a densidade de código obtida para as plataformas testadas (valores menores indicam menor ocupação da flash).

Analisando o gráfico, podemos perceber que as máquinas de 16 bits apresentam, na maioria dos casos, densidade de código melhor que as máquinas de 8 bits. Um destaque especial deve ser dado aos RL78, que apresentaram, no geral, as melhores densidades de código.

Abaixo temos um gráfico comparativo da densidade de código relativa ao microcontrolador AVR de 8 bits.

 

Velocidade de execução

 

Neste teste foi medida a velocidade de execução (em ciclos de clock) de cada uma das funções de teste. Foi utilizado o contador de ciclos disponível dentro dos simuladores (IAR Embedded Workbench e MPLAB). No caso dos PICs, a velocidade medida no MPLAB é dada em ciclos de máquina, por isso ela foi corrigida (multiplicada por 4) para obter o número de ciclos de clock.

O gráfico abaixo mostra o comparativo de velocidade de execução (medida em ciclos de clock) para as plataformas testadas (menores valores indicam CPU mais rápida).

O gráfico abaixo mostra o comparativo de performance utilizando como referência o AVR de 8 bits.

No geral, os microcontroladores PIC18 e HCS08 apresentaram performances relativas ruins. No caso dos HCS08, percebeu-se que o compilador IAR não gerou o código mais otimizado possível, especialmente na função de manipulação de bits, pois apesar de o campo de bits estar declarado na área de endereçamento direto (primeiros 256 bytes da memória), o compilador não utilizou instruções de manipulação de bit. No entanto, a grande culpada pela baixa performance da CPU parece mesmo ser a sua arquitetura e modelo de programação.

One thought on “MCU Benchmarking

  • August 10, 2012 at 8:55 am
    Permalink

    Legal esta iniciativa. Eu já imaginava mesmo, que o AVR era o melhor!! 🙂
    Mas os caras da Freescale não vão gostar mesmo, hahaha!

Leave a Reply