Endiannes em microcontroladores

Endiannes
Este post faz parte da série Tópicos de Arquitetura. Leia também os outros posts da série:
  • Endiannes em microcontroladores

Olá, caro leitor! Para você que desenvolve firmware, além da programação é essencial conhecer as características do dispositivo que será utilizado, principalmente os relacionados à sua arquitetura. Segundo Stallings, a arquitetura define os atributos visíveis ao programador, por exemplo, o conjunto de instruções, a quantidade de bits usados para representação de dados, os mecanismos de E/S, as técnicas de endereçamento etc. Neste artigo será apresentado um conceito denominado Endiannes. Porém, antes de caracterizá-lo, é importante ter o fundamento de alguns conceitos relacionados à memória.

Memória

Grosso modo, uma memória pode ser definida como um conjunto de elementos que armazenam informação. Esses elementos são chamados de palavras, sendo cada palavra identificada de maneira unívoca a partir de um endereço, isto é, um endereço de memória! Uma característica da palavra é a sua capacidade de armazenar informação, isto é, a quantidade de bytes que a palavra representa.

Representação da Memória.
Figura 1 – Representação da Memória.

Agora sabemos que uma memória é composta por palavras e que toda palavra possui um endereço único. Se considerarmos uma memória endereçada byte a byte, a declaração de uma variável (considere um sistema de 32 bits) do tipo inteiro ocuparia 4 bytes da memória, já um double, 8 bytes. Diante disso, consideramos como endereço de uma variável o endereço de menor valor na região ocupada.

Afinal, o que é Endiannes?

Esse termo está relacionado com a maneira em que uma informação é organizada na memória, isto é, da ordenação dos bytes. Na verdade, essa organização será importante para informações que são compostas por mais de um byte, por exemplo, uma variável inteira. Diante disso, o mesmo valor pode ser armazenado de forma diferente conforme a característica do hardware: Little-Endian ou Big-Endian.

Endiannes: Little-Endian e Big-Endian

Um exemplo simples e prático é mostrador a seguir. Considere que uma variável int x (4 bytes) recebe o valor 0x01234567. Conforme mostra a Figura 2, essa variável está localizada no endereço 1000.

Endiannes
Figura 2 – Variável armazenada na Memória.

No sistema Little-Endian os bytes são organizados de forma que o menor endereço ocupado pela variável armazena o byte menos significativo da informação. Nesse exemplo, o menor endereço é 1000 e o byte menos significativo é 0x67. Essa situação é ilustrada na Figura 3.

Endiannes
Figura 3 – Endiannes: Ordenação Little-Endian.

O oposto ocorre no sistema Big-Endian, isto é, o byte menos significativo é armazenado no maior endereço. Essa situação é ilustrada na Figura 4.

Endiannes: Ordenação Big-Endian.
Figura 4 – Endiannes: Ordenação Big-Endian.

Dito de outra maneira, o formato Big-Endian corresponde à ordem natural na qual estamos acostumados a representar as informações. Cabe ressaltar que apenas a ordem dos bytes é alterada, não a dos bits! Para demonstrar essas diferenças, considere o código abaixo. Nesse código a union Endian é utilizada para acessar o mesmo endereço de formas diferentes, isto é, como um inteiro ou como um array de bytes do tamanho de um inteiro. Atribuindo o valor 1 a esse espaço de memória é possível verificar o endian de forma bem simples. Se o índice 0 do array contém o valor 1 o sistema é Little-Endian, caso contrário, será Big-Endian.

Esse mesmo código foi compilado para as arquiteturas AVR8 (Little-Endian) e AVR32 (Big-Endian). Na Figura 5 é possível observar o primeiro byte com o valor 1, isto é, o byte menos significativo está no menor endereço.

Endiannes
Figura 5: Teste de Endiannes na arquitetura AVR8.

Já na Figura 6 é possível observar o quarto byte com o valor 1, isto é, o byte menos significativo no maior endereço.

Endiannes
Figura 6: Teste de Endiannes na arquitetura AVR32.

Fique de olho!

De modo geral, essa característica é transparente ao programador. Isso significa que a ordem dos bytes não tem influência nas operações realizadas como, por exemplo, nas instruções de movimentação de dados. No entanto, é necessário estar atento a isso quando uma comunicação entre dispositivos é realizada, ou quando um conjunto de dados formado em um sistema é manipulado por outro. Por exemplo, o protocolo TCP/IP é Big-Endian, já o protocolo USB é Little-Endian. Isso significa que ao enviar ou receber dados utilizando esses protocolos você deve converter as informações caso o formato do seu sistema seja diferente. Cabe ressaltar que algumas arquiteturas têm suporte para ambos os formatos, como o caso das arquiteturas ARM e MIPS.

Curiosidades

A origem desses dois termos vem do livro “As Viagens de Gulliver”, de Jonathan Swift. Eles se referem a uma guerra religiosa entre dois grupos, um que quebra ovos na ponta grande (big end) e outro que quebra ovos na ponta pequena (little end). Os termos foram aplicados na computação por Danny Cohen.

Conclusão

Neste artigo foi apresentado, de maneira introdutória, o conceito de ordenação de bytes conhecido como endiannes. As vantagens de desvantagens entre os dois métodos estão fora do escopo deste artigo. No entanto, é importante ficar atento ao datasheet do seu microcontrolador para conhecer mais sobre sua arquitetura e evitar problemas durante o desenvolvimento do firmware.

Referências

[1] – William Stallings. Arquitetura e Organização de Computadores 8ª Edição.

[2] – Danny Cohen.

Imagem destacada: https://pixabay.com/pt/espiral-escada-etapas-escadas-926736/

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.

Comentários:
Notificações
Notificar
guest
6 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Oliveira Fausto
Oliveira Fausto
23/06/2016 18:31

Simples e objetivo. Parabéns!

Fernando Deluno Garcia
Fernando Deluno Garcia
Reply to  Oliveira Fausto
28/06/2016 14:54

Obrigado!

Ronaldo Nunez
23/06/2016 08:25

A explicação mais clara sobre “endiannes” que já li! Excelente!

Fernando Deluno Garcia
Fernando Deluno Garcia
Reply to  Ronaldo Nunez
28/06/2016 14:53

Olá, Ronaldo.

Obrigado pelo retorno!

Ciro Peixoto
Ciro Peixoto
22/06/2016 08:15

Legal Garcia !!! Bom artigo!!! Como venho do 8080A sempre achei que o menos significativo vinha primeiro!!! Mas… enquanto se vive, se aprende!! Abraço

Fernando Deluno Garcia
Fernando Deluno Garcia
Reply to  Ciro Peixoto
28/06/2016 14:55

Muito obrigado, Ciro!

Talvez você goste:

Séries



Outros da Série

Menu

EVENTO ONLINE

Simplificando seus projetos de Internet das coisas com o iMCP HT32SX Sigfox

DATA: 18/05 às 15:00h